untiy仿做的一个非常撩的小游戏(ncase.me/door/)

游戏的原链接是  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);难听死了不放了。

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值