游戏的原链接是 http://ncase.me/door/
可以先玩一下再浏览下面的,不然会被剧透!٩(๑❛ᴗ❛๑)۶ 只能PC端玩~
一、实现要点:
1.碰撞设置——Rigidbody、Collider
包括人物行走边缘的碰撞检测,吃到钥匙开门的触发检测,游戏结束的触发检测等。
2.路径记录——List
简单的说就是记录每一个Timescale后人物的坐标,静态数组确定不了长度,容易越界或者浪费空间;动态数组试了很多次,没法直接把坐标赋给人物Transform组件;用List可以直接赋,而且不会浪费空间,也能动态记录
3.回放功能
记录了坐标后这个就比较简单了,通过索引值就的设定就可以直接倒放玩家路径或者正放。
4.路径绘画
原理跟PS里的笔刷功能一样,设置一个大小合适的圆形点为gameobject,回放的过程中在当前坐标下生成点就可以,连起来就成线了。
5.其他
人物移动,音乐触发,游戏暂定和重启、秒针的转动和加速等。
二、场景搭建
我搭的场景大概是酱紫
边缘的碰撞检测建议用Edge Collider,人物和钥匙、门用Box Collider比较好,因为人和钥匙的边缘不平整,可以直接把物体上Box Collider的有效作用区域设置的偏中心一点。人物的layer最高,下来是用来画路径的点dot,剩下的物体默认就可以,但不能超过人物和路径的layer。
三、人物移动和路径存储
移动这里我用的是translate函数,放在fixed update()里,因为fixed update 是每隔Time.timescale调用一次,系统默认的是0.02s,放fixed里人物的移动会更平滑一点,如果放在update里的话,由于update的调用并不是恒定的,而是跟渲染的过程有关,会影响到人物移动的效果。并且在之后实现的游戏暂定功能中,设置Time.timescale=0,fixed update就不再调用,人物就无法移动了,但是update的调用是不受Timescale的值的影响的。
之所以用translate函数是因为Moveto()无法实现从第一个方格到第二个方格,会被碰撞体挡到,而且人物移动起来emmmm飘的很。position应该也是可以用。
源码:
private List<Vector3> offsets = new List<Vector3>();
private void FixedUpdate()
{
double movev = 0;
double moveh = 0;
if (end==false&&end2==false)
{
if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.RightArrow))
{
if (Input.GetKey(KeyCode.UpArrow))
{
movev = movev + Time.deltaTime * 5;
}
if (Input.GetKey(KeyCode.DownArrow))
{
movev -= Time.deltaTime * 5;
}
if (Input.GetKey(KeyCode.LeftArrow))
{
moveh -= Time.deltaTime * 5;
}
if (Input.GetKey(KeyCode.RightArrow))
{
moveh += Time.deltaTime * 5;
}
//Vector3 a=new Vector3((float)moveh, (float)movev, 0);
this.transform.Translate(new Vector3((float)moveh, (float)movev, 0));
//AudioPlay(jiaobu);难听死了不放了。