2D小游戏——地形(1)
2019-02-23 本文已影响0人
GZoO
1、父物体为标准点,放在摄像机之外,高度适中,原因稍后解释。如图:
子物体坐标为(0,0,0)
2、复制,把地面铺满。
地面
随机高度
![](https://img.haomeiwen.com/i15561858/8c151d65e41e1139.png)
![](https://img.haomeiwen.com/i15561858/5d1ddbb87fc7688c.png)
3、计算地面高度。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GroundController : MonoBehaviour {
/// <summary>
/// 用于存放地块
/// </summary>
private ArrayList groundTiles;
// Use this for initialization
void Start () {
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
groundTiles.Add(t);
}
#endregion
}
/// <summary>
/// 计算起伏坐标
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public Vector3 SetPosition(int i)
{
Vector3 temp = Vector3.zero;
Vector3 lastPos = transform.GetChild(i - 1).localPosition;//上一个砖块的相对坐标
float x = lastPos.x + 0.16f;//横坐标为上一个坐标加长度
float y = 0.16f * Random.Range(-2, 2);//竖坐标随机向上一格或向下两格或不动
temp = new Vector3(x, y, 0);
return temp;
}
}
![](https://img.haomeiwen.com/i15561858/298d1dfb2de0fe13.gif)
此时随机出来的地面高度有时会过高,加些限制。
脚本放于父物体。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GroundController : MonoBehaviour {
/// <summary>
/// 用于存放地块
/// </summary>
private ArrayList groundTiles;
// Use this for initialization
void Start () {
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
groundTiles.Add(t);
}
#endregion
}
/// <summary>
/// 计算起伏高度
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public Vector3 SetPosition(int i)
{
Vector3 temp = Vector3.zero;
Vector3 lastPos = transform.GetChild(i - 1).localPosition;//上一个砖块的相对坐标
float x = lastPos.x + 0.16f;//横坐标为上一个坐标加长度
float y = 0.16f * Random.Range(-2, 2);//竖坐标随机向上一格或向下两格或不动(以本地坐标(0,0,0)为准)
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;
}
}
![](https://img.haomeiwen.com/i15561858/87af0555b47c9ba2.gif)
交流群 962257105