简单的范例
如上图,后面的蓝天白云及前面的建筑物会依据各自不同的速率左右移动。
图片准备
准备两张图,如下图,BG0003 的尺寸是 1536 x 768 像素,BG0004 为 3072 x 768 像素。
屏幕大小设为 1024 x 768像素,因为 Pixels to Units 维持默认值的 100,所以 Main Camera 的 Size 设为 3.84。
原理
由于是左右移动,所以只要更改 Sprite 的 Transform 的坐标位置即可,然后判断是否到了左右边界?到达之后就更改移动的方向。
如上图,两条红色线之间的宽度是所谓的屏幕宽度,称之为 ViewWidth。当 position.x = 0 时,会显示 Sprite 中间的部分,因为 Pivot 设定为 Center,如上图的红色框之间部分。黑色那条代表中心位置。
当 position.x > 0时,如下图,蓝色线条表示此图的Pivot 位置,此时见到的内容会往左移。
反之,当 position.x <0,就会看到内容往右移动了。
左右的边界,只要知道 Sprite 的宽度及显示区域的宽度,两者间的差,除以 2 再除以 Pixels to Units 的 100,就是左右的边界值了。此例为:
( 1536 – 1024 ) / 2 / 100 = 2.56
所以右边界为 2.56,左边界为 -2.56。
设计脚本
新建一个 MoveSprite 脚本,完整代码如下:
public class MoveSprite : MonoBehaviour {
public int viewWidth;
public int spriteWidth;
public float distance; // 每秒移動的單位距離
public bool toLeft; // 一开始是向左或向右
private float m_nMax;
private float m_nMin;
//--------------------------------------------------
void Start()
{
// 200f 为 / 2 / PixelsPerUnit
m_nMax = (spriteWidth - viewWidth) / 200f;
m_nMin = (-1) * m_nMax;
}
//--------------------------------------------------
void Update()
{
Vector3 pos = gameObject.transform.position;
float dx = distance * Time.deltaTime;
if ( toLeft )
{
pos.x += dx;
if (pos.x >= m_nMax)
{
pos.x = m_nMax;
toLeft = false;
}
else
{
pos.x -= dx;
if (pos.x <= m_nMin)
{
pos.x = m_nMin;
toLeft = true;
}
}
gameObject.transform.position = pos;
}
}
}
创建 Sprite 对象
将两张图先导入到项目中,然后分别建立两个 Sprite 对象,在 Sprite Renderer 中,特别留意 Order in Layer,将蓝天白云的 Layer 设为 0,建筑物设为 1,这样蓝天白云就会跑到建筑物的后面。
最后将两个 Sprite 分别挂上 MoveSprite 脚本,然后设定好 View Width, Sprite Width, Distance, ToLeft 即可。