首先,新建立一个空白场景(纯英文路径)。
加入一个空的游戏物体,在其子目录创建两个子物体,取名Close和Far(利用这两个做游戏背景),将这两个游戏体拖入下方Assets中,作为预置体,补充相应的材质球来做出想要的颜色,然后添加一个C#脚本(命名为House)。
在Assets中,新建一个文件夹Runner作为移动的视角,添加一个C#脚本(命名为Run)。
打开House,编写代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;//为了使用Queue
public class House : MonoBehaviour {
public Transform g;//公有,为了加入Cube
//私有,代码内部建立,为了重复建立Cube
Queue<Transform> queueObject;
public int queueLength;//设置queue长度
public Vector3 minSize;//设置物体最小体积
public Vector3 maxSize;//设置物体最大体积
public Vector3 startPosition;//设置开始坐标
Vector3 nextPosition;//下一个物体的坐标
public float offSet;//是否在物体后建立新物体的参考数值
// Use this for initialization
void Start () {
//初始化
queueObject = new Queue<Transform>(queueLength);
//将Cube循环加入到queue
for (int i = 0; i < queueLength; i++)
{
queueObject.Enqueue((Transform)GameObject.Instantiate(g));
}
//将初始数值付给下一步数值
nextPosition = startPosition;
for (int i = 0; i < queueLength; i++)
{
Resever();
}
}
private void Resever()
{
//取出queue的物体对其设置
Transform o = queueObject.Dequeue();
//通过随机数设置坐标
o.localScale = new Vector3(Random.Range(minSize.x,maxSize.x),Random.Range(minSize.y,maxSize.y),Random.Range(minSize.x,maxSize.z));
//中间变量
Vector3 mid = nextPosition;
//取x方向一半大小将其累加在mid中
mid.x += o.localScale.x / 2;
//使物体在同一水平面
mid.y += o.localScale.y / 2;
//物体坐标初始化
o.localPosition = mid;
//将物体的在x方向的大小累加在nextPosition的x上上
nextPosition.x += o.localScale.x;
//将其加入到queue的末尾
queueObject.Enqueue(o);
}
// Update is called once per frame
void Update () {
//比较其数值大小,是否新建立后边的场景
if (Run.dis - queueObject.Peek().localPosition.x >= offSet)
{
Resever();
}
}
}
下边是Run的代码
//定义静态值,不会再unity界面显示
public static float dis;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//设置移动速度
transform.Translate(5f * Time.deltaTime, 0, 0);
//将视角坐标赋给dis
dis = transform.position.x;
}
然后将Close物体拖入到脚本中,并设置相应的参数
通过
if (Run.dis - queueObject.Peek().localPosition.x >= offSet)
可以比较视角与边界(出现在视角中较长时间)的物体移动到新的位置,即可创立出一种新的,类似于无限出现在视角中的“假象”。
最终成像
其中,随着视角的移动,物体会不停的显示,造成“无尽背景的显示”
备注:
1.创立脚本时立即更改名字,当确定后在更改名字,要将脚本中的声明一同更改。
2.拖预置件到脚本的公用变量时,若后边更改了该变量,要重新拖预制件到脚本当中
3.Localposition和Position的区别:
Position:在unity世界中的坐标
Localposition:子物体相对于父物体的坐标,若没有父物体,则默认以unity世界作为父物体
欢迎关注我的微信个人订阅号
每天多学一点0.0