1

我有一个相对于手指位置移动精灵的功能。我的意思是手指可以触摸屏幕的任何部分并移动玩家精灵,而无需将精灵移动到手指位置。

我遇到的问题是它移动精灵的速度比实际手指位置快:

假设我的手指在 (0,0),精灵在 (10,10);我将手指在 X 轴上移动 10 个单位,我希望精灵在 (20,10) 处移动,但实际上它移动的单位比预期的要多。假设它移动到(25,10)。

我认为这与 deltaPosition 值有关。这是函数(参数中的变换是我正在移动的精灵的变换):

private Vector2 MovePlayerRelativeToFinger(Transform transform)
{
    Vector2 position = transform.position;
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
    {
        touchPosition = Input.GetTouch(0).deltaPosition;           
        position = new Vector2((touchPosition.x * Time.deltaTime) + transform.position.x, (touchPosition.y * Time.deltaTime) + transform.position.y);
        return position;
    }
    else
    {
        return position;
    }
}
4

3 回答 3

0

如果事情必须那么准确,试试这个

if(Input.touchCount > 0 &&Input.GetTouch(0).phase == TouchPhase.Moved) {
    newDelta = Input.GetTouch(0).deltaPosition - oldDelta;
    position = new Vector2((newDelta.x * Time.deltaTime) + transform.position.x, (newDelta.y * Time.deltaTime) + transform.position.y);
    olDelta += Input.GetTouch(0).deltaPosition
    return position;
}

将 oldDelta 初始化为 0

于 2017-05-01T02:03:15.077 回答
0

将outer-if语句中的条件更改为

Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Stationary

TouchPhase.Moved 将在所有更新期间为真,当手指移动时,其 deltaPosition 将在点移动开始时立即具有值。所以它被加起来变成一个巨大的值,比如,你的触摸从 x 开始,你在下一次更新中移动到 x + 2。在此更新期间 deltaPosition 将为 2。如果您在下一次更新中移动到 x + 5,则 deltaPosition 将是 5 而不是您想要的 3。

于 2017-05-01T00:58:30.130 回答
0

根据您的问题,我不确定您为什么要包括那里的时间。或者,也许您错过了对世界空间的转换?这是否有效:

    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
    {
        return (transform.position + (Vector3)((1.0f/100) * Input.GetTouch(0).deltaPosition));
    }
    else
    {
        return transform.position;
    }
于 2017-05-01T03:10:18.383 回答