初学unity(让场景动起来)

前边是让摄像机动起来,产生动画的效果,今天是让场景动起来,物体留在原地不动,从而产生动画效果。
如图,建立如下场景
这里写图片描述
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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值