使用 rigidbody2D 拖动对象时,它会穿过碰撞器(墙壁)

When dragging an object with rigidbody2D it passes through colliders (walls)

好的,所以我正在制作这款游戏​​,用户可以在屏幕上拖动一个球,但它不应该离开游戏区域。不过,我得到了 following problem,当我将它推向对撞机时,它会反弹回来,如果我用力推它,它就会离开屏幕(我需要让它不离开屏幕。用户是免费的将它拖到各处,但当然是在屏幕内)。

关于如何解决这个问题的任何提示?

这是我正在使用的拖动代码:

using UnityEngine;
using System.Collections;

public class CircleManager : MonoBehaviour {


        private bool dragging = false;

        private Vector3 screenPoint;
        private Vector3 offset;

        // Pressionando
        void OnMouseDown()
        {
                dragging = true;
                screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
                offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
        }

        // Arrastando
        void OnMouseDrag()
        {
                Vector3 cursorPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
                Vector3 cursorPosition = Camera.main.ScreenToWorldPoint(cursorPoint) + offset;

                //i tried with both below.
                //transform.position = cursorPosition;
                transform.GetComponent<Rigidbody2D>().MovePosition(cursorPosition);
        }

        // Soltando
        void OnMouseUp()
        {
                dragging = false;
        }


}

谢谢!

您可以尝试做类似的事情,

if( transform.position.x > xMaxPos )
{
    transform.position.x = new Vector3( xMaxPos, transform.position.y, transform.position.z );
}

您可以设置每个最小值和最大值。然后当你创建 xMaxPos 变量时,像这样创建它们:

[serializeField]
private float xMaxPos;

这样它们就会出现在检查器中,您可以随意调整它们的值。您还可以输入一个偏移量,即球的宽度,即

transform.position.x = new Vector3( xMaxPos - transform.localscale.x/2, transform.position.y, transform.position.z );

尝试使用 velocity

public class CircleManager : MonoBehaviour {


    private bool dragging = false;

    private Vector3 screenPoint;
    private Vector3 offset;

    public float speed = 5.0f;

    // Pressionando
    void OnMouseDown()
    {
        dragging = true;

        Vector3 cursorPosition = Camera.main.ScreenToWorldPoint(ToDepth(Input.mousePosition, transform.position.z));

        offset = gameObject.transform.position - cursorPosition;
    }

    // Arrastando
    void OnMouseDrag()
    {
        Vector3 cursorPosition = Camera.main.ScreenToWorldPoint(ToDepth(Input.mousePosition, transform.position.z)) + offset;

        Vector3 direction = (transform.position - cursorPosition).normalized;
        transform.GetComponent<Rigidbody2D>().velocity = direction * speed * Time.deltaTime;
    }

    // Soltando
    void OnMouseUp()
    {
        dragging = false;
    }

    Vector3 ToDepth(Vector3 value, float depth)
    {
        return new Vector3(value.x, value.y, depth);
    }
}

注意事项: 您不必写出 gameObject.transform.position 我看到您这样做了几次,也不必直接调用 transform...。这两者是一样的,所以你不需要 gameObject 部分。

另外,您获得了 transformscreenPoint,然后稍后使用它的 z 值,这对我来说意义不大。

无论如何,我不明白为什么这不适合你,不过我还没有测试过。