我正在尝试制作缓慢移动的背景。我有一个代码:
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;
}
}