如何将FixedUpdate变量更改与用户输入对齐

时间:2019-04-28 19:09:43

标签: c# unity3d

我正在创建一个小型的无尽奔跑者,玩家必须在屏幕上上下滑动才能移动鱼。想象一下,您在地铁冲浪者中的旅行顺畅,而不是向左或向右跳脚。无论如何,我试图使鱼沿着玩家手指的大致方向旋转,并在玩家放开屏幕时逐渐向后旋转。该程序几乎可以顺利进行-除了鱼不断旋转回到默认位置这一事实之外,因此看起来确实有些毛病。

此脚本的工作方式是它接受两个Vector2变量-鱼的当前位置和先前位置。然后,将它们相减以获得一个Vector2,该Vector2表示自上一帧以来的位置变化。然后,我将其输入Mathf.Atan以获取该运动的方向。最后,我将鱼旋转这个新量-减去当前旋转量-使其朝着正确的方向前进。我将在下面显示代码。在调查了为什么这会导致鱼一遍又一遍不断旋转回到0度时,我了解到Unity认为y位置的变化就是每隔一帧切换为零的事情。我所有的代码都在FixedUpdate上运行,并且我在任何地方都不使用Update,所以我不知道为什么它如此不规律地切换。如果在更新期间测量了用户触摸输入,则可能是问题的根源,但是如果我能找到解决方案,那将是很好的。我只是有点困惑,如果有人能尽快为我解决这个问题,我会很乐意。

现在这是我的“ RotateByTouch”类代码:

C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateByTouch : MonoBehaviour {
    public TrackObjectMotion trackObjectMotion;
    public GameObject thisObject;

    public float rotationValue;

    void FixedUpdate() {
        rotationValue = Mathf.Atan(trackObjectMotion.DeltaY / trackObjectMotion.DeltaX) * Mathf.Rad2Deg;

        thisObject.transform.Rotate(Vector3.forward, rotationValue - thisObject.transform.rotation.eulerAngles.z);
    }
}

这是我的“ TrackObjectMotion”类代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TrackObjectMotion : MonoBehaviour {
    public Vector3 CurrentPosition;
    public Vector3 PreviousPosition;

    public float DeltaX;
    public float DeltaY;

    // Update is called once per frame
    void FixedUpdate() {
        PreviousPosition = CurrentPosition;
        CurrentPosition = this.gameObject.transform.position;

        DeltaX = CurrentPosition.x - PreviousPosition.x;
        DeltaY = CurrentPosition.y - PreviousPosition.y;
    }
}

最后,这是我用于鱼的实际移动的代码:

public void FixedUpdate() {
    foreach(Touch touch in Input.touches) {
        if(touch.Phase == TouchPhase.Moved) {
            this.transform.Translate(0, touch.deltaPosition.y, 0);
        }
    }
}

最后一点只是省略了与常数相乘以获得所需结果的步骤,但这并不重要。

0 个答案:

没有答案