前边是让摄像机动起来,产生动画的效果,今天是让场景动起来,物体留在原地不动,从而产生动画效果。
如图,建立如下场景
Cloud用来做天空,Earth用来做地面,Pieple做前景。
Pieple:
创建Pieple以及更新位置代码
public Transform piefab;
public Vector3 startPosition;
Vector3 nextPosition;
Vector3 lastPosition;
Queue<Transform> queuePie;
public int queueLength;
public float minX;
public float maxX;
public float minY;
public float maxY;
public float sY;
public float xY;
public float offSet;
public static float midOffSet;
// Use this for initialization
void Start () {
midOffSet = offSet;
queuePie = new Queue<Transform>(queueLength);
for (int i = 0; i < queueLength; i++)
{
queuePie.Enqueue((Transform)GameObject.Instantiate(piefab));
}
nextPosition = startPosition;
lastPosition = startPosition;
for (int i = 0; i < queueLength; i++)
{
Sereng();
}
}
private void Sereng()
{
float x = Random.Range(minX,maxX);
int isUp = Random.Range(1, 3);
float y=Random.Range(minY,maxY);
Transform o = queuePie.Dequeue();
Vector3 midPosition = nextPosition;
midPosition.x += o.localScale.x / 2;
if (isUp== 1)
{
midPosition.y += y;
}
if (isUp == 2)
{
midPosition.y -= y;
}
if (midPosition.y >= sY+startPosition.y)
{
midPosition.y -=2* y;
}
if (midPosition.y <= xY+startPosition.y)
{
midPosition.y += 2 * y;
}
o.localPosition = midPosition;
nextPosition.x += o.localScale.x+x;
nextPosition.y = o.localPosition.y;
queuePie.Enqueue(o);
}
// Update is called once per frame
void Update () {
Vector3 mid;
if (MainCamera.distance - queuePie.Peek().localPosition.x >= offSet)
{
for (int i = 0; i < queueLength;i++ )
{
Transform o= queuePie.Dequeue();
if (i == queueLength - 1)
{
mid = o.localPosition;
nextPosition.x = mid.x + o.localScale.x / 2 + Random.Range(minX, maxX);
}
queuePie.Enqueue(o);
}
Sereng();
}
}
其中
if (isUp== 1)
{
midPosition.y += y;
}
if (isUp == 2)
{
midPosition.y -= y;
}
if (midPosition.y >= sY+startPosition.y)
{
midPosition.y -=2* y;
}
if (midPosition.y <= xY+startPosition.y)
{
midPosition.y += 2 * y;
}
是为了设置这个Pieple的Y方向的坐标,使两个Pieple之间Y方向的间隔不必太大,并且不会超过minY和maxY,保持在同一画面下。
而
Vector3 mid;
if (MainCamera.distance - queuePie.Peek().localPosition.x >= offSet)
{
for (int i = 0; i < queueLength;i++ )
{
Transform o= queuePie.Dequeue();
if (i == queueLength - 1)
{
mid = o.localPosition;
nextPosition.x = mid.x + o.localScale.x / 2 + Random.Range(minX, maxX);
}
queuePie.Enqueue(o);
}
Sereng();
}
是随着Pieple的移动,将第一个Pieple移动到最后一个Pieple后边,中间每个Pieple的坐标是变化的,那么取到最后一个Pieple的坐标,将nextPosition的值更新,使移动出画面的Pieple准确定位到它应该出现的位置。
每一个父物体拖入创造子物体的脚本,而在子物体中设置移动的脚本。
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.Translate(Time.deltaTime * -5f, 0, 0);
}
“`
这样,每一个子物体自身就会移动,不用父物体来控制。
最后通过合理的设置startPosition.z方向的坐标,使其具有层次,在正视图中,就有了如下的画面
而在unity世界中,是这样的
如果startPosition.z的坐标设置不当,那么会出现物体层次不齐的显示,重新调整即可。
欢迎关注我的微信个人订阅号
每天多学一点0.0