首页 > 解决方案 > Spring Joint 2D(可能)导致 transform.position 错误

问题描述

在您看到问题所在后,我知道标题可能会产生误导,但我真的不知道如何命名这个问题。第一张图显示了问题。问题

白线表示玩家和称为钩子的游戏对象之间的距离。靠近钩子的蓝色精灵球体是 SpringJoint2D.connectedBody。

它们(白线和蓝色精灵)都使用相同的值:hook.transform.position。

以下是我认为导致问题或至少揭示最多的代码片段:

SpringJoint2D 片段:

if (Input.GetMouseButtonDown(0))
        {
            hook = FindClosestObject(radius, "Hook");
            if(hook != null)
            {
                joint.enabled = true;
                joint.connectedBody = hook;
                joint.connectedAnchor = hook.transform.position;
                Debug.Log("Click.");
                Debug.Log(hook);
            }
            
        }
        if (Input.GetMouseButtonUp(0))
        {
            joint.enabled = false;
            joint.connectedBody = null;
        }

Debug.DrawLine 片段:

if (hook != null)
        {
            joint.distance = Vector3.Distance(hook.transform.position, transform.position) / 2;
            Debug.DrawLine(transform.position, hook.transform.position);
        }

这是整个代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerScript : MonoBehaviour
{
    
    public float radius;

    private SpringJoint2D joint;
    private Rigidbody2D hook = new Rigidbody2D();


    // Start is called before the first frame update
    void Start()
    {
        joint = GetComponent<SpringJoint2D>();
    }

    // Update is called once per frame
    void Update()
    {
        //touch.phase == TouchPhase.Began
        if (Input.GetMouseButtonDown(0))
        {
            hook = FindClosestObject(radius, "Hook");
            if(hook != null)
            {
                joint.enabled = true;
                joint.connectedBody = hook;
                joint.connectedAnchor = hook.transform.position;
                Debug.Log("Click.");
                Debug.Log(hook);
            }
            
        }
        if (Input.GetMouseButtonUp(0))
        {
            joint.enabled = false;
            joint.connectedBody = null;
        }
        //foreach (Touch touch in Input.touches)
        //{

        //}
        if (hook != null)
        {
            joint.distance = Vector3.Distance(hook.transform.position, transform.position) / 2;
            Debug.DrawLine(transform.position, hook.transform.position);
        }

        
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.green;
        Gizmos.DrawWireSphere(transform.position, radius);
        if (hook != null) 
            Gizmos.DrawLine(transform.position, hook.transform.position);
    }

    public Rigidbody2D FindClosestObject(float radius, string tag)
    {
        GameObject[] gos;
        gos = GameObject.FindGameObjectsWithTag(tag);
        Rigidbody2D closest = null;
        float distance = radius;
        Vector3 position = transform.position;
        foreach (GameObject go in gos)
        {
            Vector3 diff = go.transform.position - position;
            float curDistance = diff.sqrMagnitude;
            if (curDistance < distance)
            {
                closest = go.GetComponent<Rigidbody2D>();
                distance = curDistance;
            }
        }
        return closest;
    }
}

标签: unity3dunity3d-2dtools

解决方案


啊,我只是愚蠢。

如果您还分配了 connectedRigidbody2D,则无需分配 connectedAnchor connectedAnchor 是与 connectedRigidbody2D 位置的偏移量...


推荐阅读