突然回想起了智能机刚刚兴起的时候火起来的游戏,神庙逃亡。记得当时看过一个视频,神庙逃亡的终点是什么,当时觉得,哇,好神奇呀!神庙逃亡居然真的有终点,为啥我跑不到,我太菜了。
其实我们仔细观察一下,跑酷类游戏,不论是神庙逃亡,还是地铁跑酷,他们的地图总是无限循环的,从理论上来说,神庙逃亡是没有终点的。(当然了,除非程序猿大大们加了彩蛋,跑到多少多少真的到了终点,那就另当别论啦)
那么,像这种跑酷类游戏的地图应该怎么去实现呢?下面就跟我一起来做一个超简单的例子吧。
## 首先,让我们先打开unity,创建一个新项目。
搭建好我们需要的场景,这里我用小方块来代替人物,给小方块加上Rigidbody组件,使它具有物理特性因为我们要做一个跑酷类的地图,所以我们肯定要让我们的小方块动起来。下面,让我们用一段很简单的代码来让他动起来吧。
public class CharacterMove : MonoBehaviour
{public float movespeed = 5f;private void Update(){float a= Input.GetAxis("Horizontal");Vector3 mspeed = new Vector3(this.transform.forward.x, this.transform.forward.y, this.transform.forward.z) * movespeed*a;Vector3 tspeed = new Vector3(-this.transform.right.x, -this.transform.right.y, -this.transform.right.z) * movespeed;this.transform.position += (mspeed+tspeed) * Time.deltaTime;}
}
就这么简单的几行代码,我们的物体就能够沿着轨道进行前进了,而且在前进过程中,我们如果按下“A”键或者“D”键或者是左右键,小方块就会按照我们按的键位进行左右移动。如果直接复制粘贴的话可能会出现小方块移动的方向不是我们想要的结果,其实是坐标系的问题,按照Scene面板中的坐标系对代码进行相应的更改就可以啦。
我们写完后突然发现,小物块能动是能动了,可是,他一会跑着跑着就跑出屏幕了,为啥呢???
这个时候我们就需要用几行代码让相机跟随着物体啦。
public Transform character;Vector3 distance;public float h_speed = 1f;public float x_speed = 2f;Vector3 ve;private void Start(){distance = transform.position - character.position;}public void LateUpdate(){transform.position = Vector3.SmoothDamp(transform.position, character.position + distance,ref ve,0);}
然后这时候我们把这个脚本挂给我们的相机,会发现相机上多出了一个变量
然后我们把我们的物体拖过去就好啦,这时候我们会惊奇的发现相机他动起来了。然后我们又发现了一个问题,这个物体跑着跑着就掉下去了,呃。。。。这该怎么办呢?这就到我们最关键的一步啦,该怎么让道路无限的延伸下去。
我们在每段道路上加上一个空物体,设置他们的tag为Aripos,给他们增加一个boxcollider,然后勾选上 is Trigger,使其成为检测器。然后,我们用代码创建两个链表,一个用来存放道路,一个存放检测器。
public class RoadLoop : MonoBehaviour
{public List<Transform> roadlist = new List<Transform>();public List<Transform> arrivePoslist = new List<Transform>();public void changeroad(Transform arrivepos){int index = arrivePoslist.IndexOf(arrivepos);Debug.Log(index);if (index >= 0){int lastindex = index - 1;if (lastindex <0){lastindex = arrivePoslist.Count - 1;}roadlist[index].position = roadlist[lastindex].position + new Vector3(-5.5f, 0, 0);}}
}
这时候我们回到Hierarchy面板,创建一个空物体,把这段代码挂到他的身上,也就是这样子:
这时候因为我创建了三段道路,三个检测器,所以把每个链表的长度都设置成了三
这个也可以设置的长一点,多设置几段道路也可以
然后我们分别把检测器和道路拖拽到相对应的位置上
这里拖拽道路的时候要注意一下,因为我们的角色要碰撞到编号为1的检测器,然后移动编号为0的道路到道路最后边,所以我们要把第三段道路放在第一个位置
也就是这样
3
1
2
然后我们在移动的代码中用一个RoadLoop的对象来调用方法改变道路的位置。也就是这样:
public RoadLoop roadloop;public void OnTriggerEnter(Collider other){if (other.tag.Equals("Aripos") ){roadloop.changeroad(other.transform);}}
然后在Inspector视图中把road loop的空物体拖拽过去,也就是这样:
然后点击运行,我们就会发现道路就无穷无尽的循环下去啦。
这里有一篇博客写的比我更详细,我在写的过程中也借鉴了这位大神的博客,大家可以去看一下呀
【Unity3D实战】零基础一步一步教你制作跑酷类游戏(填坑完整版)
讲道理,我是万万没想到,我写这篇这么简单的博客的时候还是遇到了很多问题,比如常见的空指针,或者是移动方向问题,这些都暴露出来我的基本知识掌握的还是太差,不熟练,要学习的东西还是太多,大家一起加油吧!