Spring Joint 2D (возможно) вызывает ошибки transform.position - PullRequest
0 голосов
/ 08 марта 2020

Я знаю, что название может вводить в заблуждение после того, как вы увидите, в чем проблема, но я действительно не знаю, как назвать эту проблему. На первом рисунке показана проблема. issue

Белая линия показывает расстояние между игроком и игровым объектом, называемым крючком. Синяя сфера спрайта, расположенная рядом с крючком, является 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;
    }
}

1 Ответ

0 голосов
/ 08 марта 2020

Ах, я был просто глуп.

Нет необходимости назначать подключенный якорь, если вы также назначаете подключенный жесткий диск 2D Подключенный якорь - это смещение от положения подключенного жесткого тела ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...