2D小游戏——地形(2)
2019-02-23 本文已影响0人
GZoO
当人物开始向前跑时,其实是地面向后移动。同时,为了更好的利用资源,退出摄像机范围的地块,从队头补进队尾,重新计算地块坐标。
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