如何不断获得触摸位置?

时间:2019-01-05 15:56:47

标签: c# android unity3d touch

我有一个代码可以预测LateUpdate()中箭头的射击路径。它可以在PC和鼠标上完美运行。下面是使用鼠标时的代码:

    if(Input.GetMouseButton(0)){
        //get the rotation based on the start drag position compared to the current drag position
        zRotation = (Input.mousePosition.y - mouseStart) * (manager.data.sensitivity/15);
        zRotation = Mathf.Clamp(zRotation, -manager.data.maxAimRotation, manager.data.maxAimRotation);
    }
    //reset the rotation if the player is not aiming
    else if((int) zRotation != 0){
        if(zRotation > 0){
            zRotation --;
        }
        else{
            zRotation ++;
        }
    }

我现在想将其移植到Android,所以我正在玩Input.Touch。我将上面的代码更改为以下代码:

 if (Input.touchCount > 0)
            {
                //get the rotation based on the start drag position compared to the current drag position
                zRotation = (Input.GetTouch(0).deltaPosition.y) * (manager.data.sensitivity / 15);
                zRotation = Mathf.Clamp(zRotation, -manager.data.maxAimRotation, manager.data.maxAimRotation);
            }
            //reset the rotation if the player is not aiming
            else if ((int)zRotation != 0)
            {
                if (zRotation > 0)
                {
                    zRotation--;
                }
                else
                {
                    zRotation++;
                }
            }

但是zRotation在鼠标中无法正常工作。每隔一帧后,它会一直重置到开始位置。几乎看起来像是在抖动。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

我看到,对于移动控件,您正在使用Input.GetTouch(0).deltaPosition.y。但是,deltaPosition为您提供了上一次更新与当前位置之间的差异。假设您的应用以每秒60帧的速度运行,它将返回每1/60秒的距离。当然,这将是一个接近零的数字,我相信这就是为什么它看起来总是返回起始位置的原因

https://docs.unity3d.com/ScriptReference/Touch-deltaPosition.html

您将必须执行与使用鼠标方法相似的操作。在Touchphase.Began上设置变量touchStart并将其与touch.position进行比较。

float touchStart = 0;

if (Input.touchCount > 0)
            {
                if (Input.GetTouch(0).phase == TouchPhase.Began) touchStart = Input.GetTouch(0).position.y;
                //get the rotation based on the start drag position compared to the current drag position
                zRotation = (Input.GetTouch(0).position.y - touchStart) * (manager.data.sensitivity / 15);
                zRotation = Mathf.Clamp(zRotation, -manager.data.maxAimRotation, manager.data.maxAimRotation);
            }
            //reset the rotation if the player is not aiming
            else if ((int)zRotation != 0)
            {
                if (zRotation > 0)
                {
                    zRotation--;
                }
                else
                {
                    zRotation++;
                }
            }

我还没有测试过,如果我错了,请纠正我!