1

好的,所以我正在制作这个游戏,用户可以在屏幕上拖动一个球,但它不应该离开游戏区域。但是我遇到了以下问题,当我将它推向对撞机时,它会反弹回来,如果我推得太用力,它只会离开屏幕(我需要让它不会离开屏幕。用户可以自由拖动它到处都是,但当然是在屏幕内)。

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

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

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;
        }


}

谢谢!

4

2 回答 2

1

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

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 );
于 2015-08-26T20:08:40.497 回答
1

尝试使用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部分。

你也得到了screenPointtransform然后使用它的z价值,这对我来说真的没有多大意义。

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

于 2015-08-26T22:45:06.980 回答