美文网首页
2D小游戏——地形(2)

2D小游戏——地形(2)

作者: GZoO | 来源:发表于2019-02-23 18:57 被阅读0次

    当人物开始向前跑时,其实是地面向后移动。同时,为了更好的利用资源,退出摄像机范围的地块,从队头补进队尾,重新计算地块坐标。

    game视窗 scene视窗

    挂在地块上。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Tiles : MonoBehaviour {
    
        [Tooltip("移动速度")]
        public float speed = -0.15f;
    
        private GroundController m_gController;
    
        // Use this for initialization
        void Start () {
            m_gController = GetComponentInParent<GroundController>();
        }
        
        // Update is called once per frame
        void Update () {
    
            //向右的按键摁下时
            if (Input.GetAxis("Horizontal") > 0)
            {
                transform.Translate(Vector3.right * Time.deltaTime * speed);
    
                /*
                 * 所有的地砖都是以它们的父物体为准向屏幕右侧依次排列的
                 * 基准点(0,0,0)一定是在屏幕外的,即当砖块的相对坐标x<0时
                 * 此块地砖一定是在摄像机外的
                 */
                if (transform.localPosition.x < 0)
                {
                    m_gController.ResetTilesList();
    
                    //获取同级索引
                    int index = transform.GetSiblingIndex();
                    transform.localPosition = m_gController.SetPosition(index);
                }
            }
        }
    }
    

    对上一节父物体控制器的修改:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class GroundController : MonoBehaviour {
    
        /// <summary>
        /// 用于存放地块
        /// </summary>
        private ArrayList array_groundTiles;
    
        // Use this for initialization
        void Start () {
            array_groundTiles = new ArrayList();
    
            #region 遍历子物体存于arraylist
            for (int i = 0; i < transform.childCount; ++i)
            {
                Transform t = transform.GetChild(i);
    
                if (i > 5)//游戏开始的前几块地砖不需要有起伏
                {
                    t.localPosition = SetPosition(i);
                }
                //注册进arraylist
                array_groundTiles.Add(t);
            }
            #endregion
    
        }
    
        /// <summary>
        /// 计算起伏高度
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public Vector3 SetPosition(int index)
        {
            Vector3 temp = Vector3.zero;
            Vector3 lastPos = Vector3.zero;
    
            lastPos = transform.GetChild(index - 1).localPosition;//取上一个砖块的相对坐标
    
            float x = lastPos.x + 0.158f;//横坐标为上一个坐标加长度
    
            float y = 0.16f * Random.Range(-2, 2);//竖坐标随机向上一格或向下两格或不动
    
            if (y - lastPos.y > 0.16f)//新的地面比上一块地砖高2倍多时
            {
                y = lastPos.y + 0.16f;
            }
            else if (lastPos.y - y > 0.16f)//新的地面比上一块地砖低2倍多时
            {
                y = lastPos.y - 0.16f;
            }
    
            temp = new Vector3(x, y, 0);
    
            return temp;
        }
    
        /// <summary>
        /// 重置队列,将队头的砖块移至队尾
        /// </summary>
        public void ResetTilesList()
        {
            Transform t = (Transform)array_groundTiles[0];//取出队头的砖块
            t.SetAsLastSibling();//把队头的砖块放到最后一个子物体的位置上
            array_groundTiles.RemoveAt(0);//把arraylist队头的砖块,即刚取出的砖块注销
            array_groundTiles.Add(t);//把取出的砖块注册进arraylist的队尾
        }
    }
    
    

    交流群 962257105

    相关文章

      网友评论

          本文标题:2D小游戏——地形(2)

          本文链接:https://www.haomeiwen.com/subject/ggbpyqtx.html