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

當(dāng)人物開始向前跑時(shí),其實(shí)是地面向后移動(dòng)。同時(shí),為了更好的利用資源,退出攝像機(jī)范圍的地塊,從隊(duì)頭補(bǔ)進(jìn)隊(duì)尾,重新計(jì)算地塊坐標(biāo)。

game視窗
scene視窗

掛在地塊上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Tiles : MonoBehaviour {

    [Tooltip("移動(dòng)速度")]
    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 () {

        //向右的按鍵摁下時(shí)
        if (Input.GetAxis("Horizontal") > 0)
        {
            transform.Translate(Vector3.right * Time.deltaTime * speed);

            /*
             * 所有的地磚都是以它們的父物體為準(zhǔn)向屏幕右側(cè)依次排列的
             * 基準(zhǔn)點(diǎn)(0,0,0)一定是在屏幕外的,即當(dāng)磚塊的相對(duì)坐標(biāo)x<0時(shí)
             * 此塊地磚一定是在攝像機(jī)外的
             */
            if (transform.localPosition.x < 0)
            {
                m_gController.ResetTilesList();

                //獲取同級(jí)索引
                int index = transform.GetSiblingIndex();
                transform.localPosition = m_gController.SetPosition(index);
            }
        }
    }
}

對(duì)上一節(jié)父物體控制器的修改:

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);
            }
            //注冊(cè)進(jìn)arraylist
            array_groundTiles.Add(t);
        }
        #endregion

    }

    /// <summary>
    /// 計(jì)算起伏高度
    /// </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;//取上一個(gè)磚塊的相對(duì)坐標(biāo)

        float x = lastPos.x + 0.158f;//橫坐標(biāo)為上一個(gè)坐標(biāo)加長(zhǎng)度

        float y = 0.16f * Random.Range(-2, 2);//豎坐標(biāo)隨機(jī)向上一格或向下兩格或不動(dòng)

        if (y - lastPos.y > 0.16f)//新的地面比上一塊地磚高2倍多時(shí)
        {
            y = lastPos.y + 0.16f;
        }
        else if (lastPos.y - y > 0.16f)//新的地面比上一塊地磚低2倍多時(shí)
        {
            y = lastPos.y - 0.16f;
        }

        temp = new Vector3(x, y, 0);

        return temp;
    }

    /// <summary>
    /// 重置隊(duì)列,將隊(duì)頭的磚塊移至隊(duì)尾
    /// </summary>
    public void ResetTilesList()
    {
        Transform t = (Transform)array_groundTiles[0];//取出隊(duì)頭的磚塊
        t.SetAsLastSibling();//把隊(duì)頭的磚塊放到最后一個(gè)子物體的位置上
        array_groundTiles.RemoveAt(0);//把a(bǔ)rraylist隊(duì)頭的磚塊,即剛?cè)〕龅拇u塊注銷
        array_groundTiles.Add(t);//把取出的磚塊注冊(cè)進(jìn)arraylist的隊(duì)尾
    }
}

交流群 962257105

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一、Unity簡(jiǎn)介 1. Unity界面 Shift + Space : 放大界面 Scene界面按鈕渲染模式2D...
    MYves閱讀 8,405評(píng)論 0 22
  • 生,紅軍勇敢,勇往直前 師,行動(dòng)一致感受到什么精神? 生…… 師是什么力量使他們不顧一切,聽紅軍家書的錄音 師,如...
    雅客坤坤閱讀 740評(píng)論 0 0
  • 朋友說,買了一輛車買的時(shí)候覺得開這車的人挺少,開著開著覺得滿大街都是這種車。我以前不懂自閉癥,也不知道小城里有自閉...
    老圃有余閱讀 1,126評(píng)論 0 10