Raycast无法在Update()Unity c#

时间:2017-06-21 20:53:44

标签: c# unity3d touch transform raycasting

我正在做一个对象跟在我手指上的游戏。但是如果我点击屏幕上的任何地方,我不希望对象跳到我的手指。我正在使用光线投影来做到这一点。它的效果非常好,除非我的手指移得太快,否则物体会冻结。

我的理论是因为它在Update()中,一旦我将手指从物体上移开,它就会检测到我无法再拖动它。我不知道如何解决这个问题。

public GameObject Bigball;
public GameObject Smallball;

// Update is called once per frame
private void Update ()
{ 
    // lets ball follow finger
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(0).phase == TouchPhase.Stationary)
    {
        var touch = Input.GetTouch(0);
        Vector3 fingerPos = touch.position;
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(fingerPos);

        if (Physics.Raycast(ray, out hit) && (hit.collider.tag == "ball"))
        {
            Smallball.SetActive(false);
            Bigball.SetActive(true);
            Vector3 pos = new Vector3((Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position)).x,
               (Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position)).y, 0);
            Bigball.transform.position = pos;
        }
    }
    else
    {
        Bigball.SetActive(false);
        Smallball.SetActive(true);
        Smallball.transform.position = new Vector3(Bigball.transform.position.x, Bigball.transform.position.y, 0);
    }
}

1 个答案:

答案 0 :(得分:0)

当手指触摸屏幕时,只有一次Raycast可能更有意义。如果Raycast找到要拖动的对象,只需手指继续触摸屏幕,只需存储该对象并将其移动到每个Update()后跟随手指。

释放手指后,只需忘记对象,直到下一次触摸找到要拖动的新对象。

另一种选择是根本不使用Raycasts,而是建立在IBeginDragHandler,IDragHandler和IEndDragHandler上,就像Bijan已经提到的那样。