美文网首页
Unity实战之方块跑酷(二)

Unity实战之方块跑酷(二)

作者: ElfACCC | 来源:发表于2018-09-18 21:56 被阅读93次

    一、角色出生与基本控制移动

    1)角色出生

    读取地图集合中的数据,指定主角模型的出生点和旋转状态。

    2)地图显示数据模型

    3)角色基本移动

    使用A和D键进行按键控制,读取地图中的位置信息,进行角色移动效果模拟。

    二、蜗牛痕迹与移动边界控制

    1)蜗牛痕迹

    2)边界控制

    三、地图连续生成算法

    private void CalcPosition()

        {

            if (m_MapManager.mapList.Count - z <= 5)

            {

                Debug.Log("生成新地图");

                float offsetz = m_MapManager.mapList[m_MapManager.mapList.Count - 1][0].GetComponent<Transform>().position.z + m_MapManager.bottomLength/2;

                m_MapManager.CreateMapItem(offsetz);

            }

        }

    四、摄像机跟随

    差值运算函数,让摄像机平滑移动

    Vector3.Lerp(Vector3 from, Vector3 to ,float t);

    /// <summary>

    /// 摄像机跟随

    /// </summary>

    public class CameraFollow : MonoBehaviour {

        private Transform m_Transform;

        private Transform m_player;

        public bool startFollow = false;

    void Start () {

            m_Transform = gameObject.GetComponent<Transform>();

            m_player = GameObject.Find("cube_books").GetComponent <Transform>();

    }

    void Update () {

        CameraMove();

    }

        /// <summary>

        /// 摄像机移动

        /// </summary>

        void CameraMove()

        {

            if (startFollow)

            {

                //开始跟随...

                Vector3 nextPos = new Vector3(m_Transform.position.x, m_player.position.y + 1.483f, m_player.position.z);

                //m_Transform.position = nextPos;

                m_Transform.position = Vector3.Lerp(m_Transform.position, nextPos, Time.deltaTime);//插值运算函数

            }

        }

    }

    五、地面塌陷

    1)摄像机按下M后自动跟随

    2)地面塌陷

    ①要让地面一排一排的掉落:使用协程固定时间间隔,实现地面塌陷

    ②掉落的地面元素要销毁:定时销毁游戏物体

    ③给掉落的地面元素添加旋转力:rigidbody.angularVelocity:角速度向量。

    ④停止地面塌陷(游戏结束):当塌陷到的位置和角色的位置重合,即停止塌陷。

    /// <summary>

        /// 开启地面塌陷效果

        /// </summary>

        public void StartTileDown()

        {

            StartCoroutine("TileDown");

        }

        /// <summary>

        /// 停止地面塌陷效果

        /// </summary>

        public void StopTileDown()

        {

            StopCoroutine("TileDown");

        }

        /// <summary>

        /// 地面塌陷

        /// </summary>

        /// <returns></returns>

        private IEnumerator TileDown()

        {

            while (true)

            {

                yield return new WaitForSeconds(0.5f);

                for (int i = 0; i < mapList[index].Length; i++ )

                {

                    Rigidbody rb = mapList[index][i].AddComponent<Rigidbody>();

                    rb.angularVelocity = new Vector3(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f)) * Random.Range(1, 10);

                    GameObject.Destroy(mapList[index][i], 1.0f);

                }

                if (m_PlayerController.z == index)

                {

                    StopTileDown();

                }

                index++;

            }

        }

    六、路障生成

    七、使用协程生成路障移动动画

    1)路障优化:浅色瓷砖也出现路障

    2)路障动画

    /// <summary>

    /// 地面陷阱

    /// </summary>

    public class Spikes : MonoBehaviour {

        private Transform m_Transform;

        private Transform son_Transform;

        private Vector3 normalPos;

        private Vector3 targetPos;

    void Start () {

            m_Transform = gameObject.GetComponent<Transform>();

            son_Transform = m_Transform.FindChild("moving_spikes_b").GetComponent<Transform>();

            normalPos = son_Transform.position;

            targetPos = son_Transform.position + new Vector3(0, 0.15f, 0);

            StartCoroutine("UpAndDown");

    }

        private IEnumerator UpAndDown()

        {

            while (true)

            {

                StopCoroutine("Down");

                StartCoroutine("Up");

                yield return new WaitForSeconds(2.0f);

                StopCoroutine("Up");

                StartCoroutine("Down");

                yield return new WaitForSeconds(2.0f);

            }

        }

        private IEnumerator Up()

        {

            while (true)

            {

                son_Transform.position = Vector3.Lerp(son_Transform.position, targetPos, Time.deltaTime * 30);

                yield return null;

            }

        }

        private IEnumerator Down()

        {

            while (true)

            {

                son_Transform.position = Vector3.Lerp(son_Transform.position, normalPos, Time.deltaTime * 30 );

                yield return null;

            }

        }

    }

    八、角色与路障交互死亡判断

    1)路障蜗牛痕迹

    当路障处于安全状态时,角色移动到路障上形成蜗牛痕迹

    ①创建三个tag标签,分别设置给路障和瓷砖模型;

    ②根据tag判断出“位置类型”,然后查找响应的地面模型进行蜗牛痕迹生成。

    2)死亡判断

    何时死亡?

    ①被地面路障刺到;(触发判断)

    ②被天空路障刺到;(触发判断)

    ③掉入坑洞陷阱;(刚体下落)

    ④自己所在位置地面塌陷。(刚体下落)

    添加触发器 地面空陷阱时掉落

    相关文章

      网友评论

          本文标题:Unity实战之方块跑酷(二)

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