1.背景的移动
原理:现在有一个背景,我们首先应在Start中获取它的初始位置(不在Update中获取是因为会一直更新坐标,导致背景起飞),以及对主摄像机的引用。如果一直保持背景xy坐标和摄像机xy的一致,看起来会有点怪。所以对摄像机的x坐标的数值进行一定程度的缩小,并将缩小后的坐标赋给背景。(具体情况具体分析,不一定非得是x,也不一定非得是缩小)
private GameObject cam;
[SerializeField] private float parallaxEffect;
private float xPosition;
void Start()
{
//也可选择不赋值,直接用Camera.main代替cam
cam = GameObject.Find("Main Camera");
xPosition = transform.position.x;
}
void Update()
{
float xDistanceToMove = cam.transform.position.x * parallaxEffect;
transform.position = new Vector3(xPosition + xDistanceToMove, transform.position.y);
}
parallaxEffect是缩放的系数,为1就是背景一比一跟着摄像机动。
2.背景的无限延长(缩放系数小于1大于0)
缩放系数在0-1时,背景前进的速度会小于摄像机的速度,因此需要在摄像机即将离开背景时进行操作使背景延续,且不影响连贯性。
原理:缩放系数会导致背景的x坐标与摄像机的x坐标产生一定差距,当这个差距大于(往左走是小于)背景长度的n倍时(n的数值取决于背景坐标更新过几次),就可以对背景的x坐标进行操作。(同样的,具体情况具体分析)
void Start()
{
//也可选择不赋值,直接用Camera.main代替cam
cam = GameObject.Find("Main Camera");
//获取一个初始位置,让背景不会因为一直刷新而起飞
xPosition = transform.position.x;
//获取背景长度
length = GetComponent<SpriteRenderer>().bounds.size.x;
}
void Update()
{
float xOffest = cam.transform.position.x * (1 - parallaxEffect);
float xDistanceToMove = cam.transform.position.x * parallaxEffect;
transform.position = new Vector3(xPosition + xDistanceToMove, transform.position.y);
//这里有xPosition,是因为差距一直在变大,虽然背景位置更新了,但差距的计算与背景的后续位置没什么关系,只和初始位置和缩放系数有关。
//而且每一次背景位置更新就代表差距多一个length
//举个例子,A开汽车,B骑自行车。在二者速度恒定,且A速度大于B的情况下。A与B的距离会一直变大,且每间隔一定时间,误差就会增加同样的数值(length)
//而这个例子中,距离的大小只和二者速度之差以及初始位置有关,与二者位置无关。
if (xOffest > xPosition + length)
{
xPosition += length;
}
else if (xOffest < xPosition - length)
{
xPosition -= length;
}
}