當(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