我正在创建一个小型的无尽奔跑者,玩家必须在屏幕上上下滑动才能移动鱼。想象一下,您在地铁冲浪者中的旅行顺畅,而不是向左或向右跳脚。无论如何,我试图使鱼沿着玩家手指的大致方向旋转,并在玩家放开屏幕时逐渐向后旋转。该程序几乎可以顺利进行-除了鱼不断旋转回到默认位置这一事实之外,因此看起来确实有些毛病。
此脚本的工作方式是它接受两个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);
}
}
}
最后一点只是省略了与常数相乘以获得所需结果的步骤,但这并不重要。