将物体移动到触摸位置意外动作

时间:2014-06-04 13:00:29

标签: android unity3d

晚上好,问题很快。

我在Unity3D中开发了一个自上而下的2D平台游戏。这是游戏的图片。

enter image description here

我几乎在桌面上都能解决所有问题,但在尝试设置移动设备控件时,我似乎无法按照应有的方式工作。我所需要的只是让玩家朝着用户触摸屏幕的方向移动。使用当前代码,玩家只需向上,向下,向左和向右四个方向旋转。他也移动了一点,但从不远离他的产卵点。

请查看我修改后的代码:

public Camera camera;
public float movespeed = 0;


// Use this for initialization
void Start () {

    movespeed = 2.75F;

}

// Update is called once per frame
void Update () {
    if (Input.touchCount > 0) {
        // The screen has been touched so store the touch
        Touch touch = Input.GetTouch(0);

        if (touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Moved) {
            // If the finger is on the screen, move the object smoothly to the touch position
            Vector3 touchPosition = camera.ScreenToWorldPoint(new Vector3(touch.position.x, touch.position.y, -13)); 
            Quaternion rot = Quaternion.LookRotation(transform.position - touchPosition, Vector3.back);
            transform.rotation = rot;
            transform.eulerAngles = new Vector3 (0, 0, transform.eulerAngles.z);
            rigidbody2D.angularVelocity = 0;
            //float input = Input.GetAxis ("Vertical");
            transform.position = Vector3.Lerp(transform.position, touchPosition, Time.deltaTime);
        }
    }
}

}

关于如何让我的播放器移动到触摸屏的任何想法都在屏幕上?任何帮助将非常感激。提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望您的玩家游戏对象移动到正在触摸的屏幕上的点。我认为最好描述代码的行为,以便您可以更好地了解可能发生的情况。

从发布的代码中,我可以看到一个可能的问题。再看看这一行:

Quaternion rot = Quaternion.LookRotation(transform.position - touchPosition, Vector3.back);

在这里,您要求Unity计算单位四元数,该单位四元数表示从Vector3.forward方向到触摸位置的玩家游戏对象方向的旋转。这可能不是你想要的。从问题描述中,您希望游戏对象旋转以面向被触摸屏幕上的点(而不是相反的方向)。您可以更改减法操作数的顺序,或者最好使用Transform.LookAt方法。

在此之后,您将更新转换的旋转:

transform.rotation = rot;

没关系,但请注意,在使用Transform.LookAt时你不需要这样做。 然后使用此行再次设置变换的旋转:

transform.eulerAngles = new Vector3 (0, 0, transform.eulerAngles.z);

我不完全确定你为什么要这样做。如果您只想要一个旋转轴,则可以使用,例如:

transform.LookAt(new Vector3(touchPosition.x, touchPosition.y, transform.position.z))

这应该围绕z轴​​旋转玩家的变换,以查看被触摸点的方向。

最后,您将变换的位置从当前位置线性插值到被触摸点:

transform.position = Vector3.Lerp(transform.position, touchPosition, Time.deltaTime);

这不是必要的。相反,你应该只是向前移动玩家的变换。播放器应朝向触摸屏幕点的方向。因此,向前翻译玩家会将玩家移向所述屏幕点:

transform.position += transform.forward * speed * Time.deltaTime;

当播放器非常接近触摸的屏幕点时,它将超调并立即旋转以向相反方向看。这将重复发生。你应该包括一些距离,指明玩家何时达到目标点。