简易贪吃蛇

简易贪吃蛇

基于实际的需要,实现了一个3D版的简易贪吃蛇,因游戏规则大家都熟知,故来分享一些开发细节。
贪吃蛇演示

模型采用的都是引擎自带的一些基础图形,设计的一大难点就是身体对头部的跟随,起初的想法是当生成新的身体部位时,和头或者前一个身体部位的位置进行绑定,但是当蛇头转向时,很明显会出现身体和蛇头一起转向的情况,而不是移动到蛇头转向的位置时再转向。

后来想到可以借鉴以前的像素贪吃蛇的思路,当蛇头移动时,蛇身的第一个像素点移动到蛇头位置,后面的像素点再移动到第一个像素点的位置,以此类推。像素点的更新需要一定的帧率,而update()函数不就是每帧执行一次吗。这样考虑的话就需要将蛇头和蛇身每帧的位置存储起来,考虑到各个身体部位之间需要一定的相对距离,而新出现的身体初始位置又是上一个身体部位的位置,所以需要一个延时,当前一个身体部位距离当前身体部位够远时,该身体部位才可以开始移动。

我们可以用队列来存储蛇的位置,以蛇头为例,当新生成一个身体时,用一个队列存储蛇头每帧的位置,等到延时时间一过,每帧在存储蛇头当前位置的同时,出队一个位置数据,将新生成的身体部位置于该位置,而该位置正好是延时时间前蛇头所在的位置,这样就能切实地实现跟随,后续生成的身体部位的跟随也是同理,只是使用的是前一个身体部位的存储队列。

void MoveSegments()//身体部位移动实现函数
    {
        for (int i = 1; i < segments.Count; i++)
        {
            earlyposition[i].Enqueue(segments[i - 1].transform.position);//当前位置信息存储
            delaytime[i]+=Time.deltaTime;
        }
        if(delaytime[0]>=distance1/moveSpeed){
            segments[0].transform.position = (UnityEngine.Vector3)earlyposition[0].Dequeue();
        }//第一个身体部位的移动(头和身体的长度不同)
        for (int i = 1; i < segments.Count; i++)
        {
            if(delaytime[i]>=distance2/moveSpeed){
                segments[i].transform.position = (UnityEngine.Vector3)earlyposition[i].Dequeue();
            }//后续身体部位的移动
        }
    }

为了实现游戏难度玩家可控,游戏也增加了难度设置界面。可以调整游戏的胜利分值和蛇的移动速度:QQ图片20240413233943

胜利分值和速度的存储我采用了PlayerPrefs类,该类可用于数据本地持久化保存与读取。即使游戏关闭,这两个数值的值还是不会变,除非玩家自行调整,因为它们以键值对的形式存储于客户端本地。在实现简单的游戏保存和读取功能时确实很有用,可以在本地存储一些常见的键值对数据。

当然作为一个游戏小demo还是有很多的不足之处,期待大家的指正和建议!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值