【问题标题】:Unity - Prevent Child Object From Being Dragged Outside Parent ObjectUnity - 防止子对象被拖到父对象之外
【发布时间】:2020-11-30 01:38:12
【问题描述】:

我已经为此奋斗了一段时间。这个想法是让玩家沿着 x 轴围绕其父级拖动一个子级。我不希望他们能够将它移到左侧或右侧之外。在大多数情况下,代码会阻止他们向左拖动,但一旦这样做,他们就不能再将其拖回另一种方式。我尝试将 BoxCollider2D 添加到父级,认为它会阻止它越过边界,但事实并非如此。我在子对象上有一个 CapsuleCollider2D。

public class DragDrop : MonoBehaviour
{
    private Vector3 mOffset;
    private float mZCoord;

    void OnMouseDown()
    {
        mZCoord = Camera.main.WorldToScreenPoint(
            gameObject.transform.position).z;

        // Store offset = gameobject world pos - mouse world pos
        mOffset = gameObject.transform.position - GetMouseAsWorldPoint();
    }

    private Vector3 GetMouseAsWorldPoint()
    {
        // Pixel coordinates of mouse (x,y)
        Vector3 mousePoint = Input.mousePosition;

        // z coordinate of game object on screen
        mousePoint.z = mZCoord;

        // Convert it to world points
        return Camera.main.ScreenToWorldPoint(mousePoint);
    }

    void OnMouseDrag()
    {
        var pos = GetMouseAsWorldPoint() + mOffset;

        var minX = GetComponent<SpriteRenderer>().bounds.min.x;
        var maxX = GetComponent<SpriteRenderer>().bounds.max.x;
        var minXp = transform.parent.GetComponent<SpriteRenderer>().bounds.min.x;
        var maxXp = transform.parent.GetComponent<SpriteRenderer>().bounds.max.x;
        
        if (minXp < 0)
        {
            if (minX < minXp)
            {
                return;
            }
        }
        else if (maxX > maxXp)
            return;

        transform.position = new Vector3(pos.x, transform.position.y, transform.position.z);
    }
}

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    与其返回 -> 不做任何事情,不如将运动本身固定起来,例如

    // The distance in negative X direction
    // between position and bounds.min.x
    var deltaNeg = transform.position.x - minX;
    // The distance in positive x direction 
    // between position and bounds.max.x
    var deltaPos = transform.position.x - maxX;
    
    // pos has to stay within parents bounds with given delta distances
    pos.x = Mathf.Clamp(pos.x, minXp + deltaNeg, maxXp + deltaPos);
    
    transform.position = new Vector3(pos.x, transform.position.y, transform.position.z);
    

    注意:在智能手机上输入,但我希望思路清晰

    【讨论】:

    • 谢谢!我不得不做出一项改变。 maxXP - (-deltaPos)。这是右侧边界。
    猜你喜欢
    • 2011-10-22
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多