如何在统一中缓慢移动物体?



我正在尝试制作缓慢移动的背景。我有一个代码:

public void BackgroundMove(){
bg.transform.Translate(Vector3.right * Time.deltaTime * bgspeed);
bg.transform.Translate(-Vector3.up * Time.deltaTime * bgspeed);
bg.transform.Translate(-Vector3.right * Time.deltaTime * bgspeed);
bg.transform.Translate(Vector3.up * Time.deltaTime * bgspeed);
}

我在Update()中调用这个函数,但是背景同时移动所有的边。我该怎么办?

我将给出代码,用于相对于起始位置在圆圈中移动它。这个代码的工作原理是使用正弦和余弦来找到圆上的点。

你可以试着通过切线,只移动增量位置,但我担心改变Update()的次数会导致积分错误,并最终导致你螺旋离开位置。

为你想要的旋转速度(以赫兹为单位)和你想要的圆的大小设置变量。缓存Start()上的起始位置,然后更新Update()中的位置:

using UnityEngine;
public class Rotator : MonoBehaviour
{
public GameObject bg;
public float rotationRateHz = 0.5f;
public float rotationRadius = 1.0f;
private Vector3 startingPosition;
private float phi;
void Start()
{
startingPosition = bg.transform.position;
}
void Update()
{
float omega = rotationRateHz * 2.0f * Mathf.PI;
phi += omega * Time.deltaTime;
float relativeX = rotationRadius * Mathf.Cos(phi);
float relativeY = rotationRadius * Mathf.Sin(phi);
Vector3 nextPosition = startingPosition;
nextPosition.x += relativeX;
nextPosition.y += relativeY;
bg.transform.position = nextPosition;
}
}

update方法在每一帧被调用,所以你不能在调用中控制复杂的移动。相反,您可以引入状态和计时器来在状态之间切换。可以使用enum或Vector2数组。

private float timer = 0f;
private float periodTime = 2f;
private Vector2[] directions;
private int currentState = 0;
private void Awake(){
directions = new Vector2[]{
Vector3.right, Vector2.down, Vector2.left, Vector2.up};
timer = periodTime;
}
private void Update(){
bg.transform.Translate(directions[currentState] * speed * Time.deltaTime); 
timer -= Time.deltaTime;
if(timer <= 0){
timer = periodTime;
currentState = (currentState + 1) % 4;
}
}

最新更新