简易贪吃蛇
基于实际的需要,实现了一个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();
}//后续身体部位的移动
}
}
为了实现游戏难度玩家可控,游戏也增加了难度设置界面。可以调整游戏的胜利分值和蛇的移动速度:
胜利分值和速度的存储我采用了PlayerPrefs类,该类可用于数据本地持久化保存与读取。即使游戏关闭,这两个数值的值还是不会变,除非玩家自行调整,因为它们以键值对的形式存储于客户端本地。在实现简单的游戏保存和读取功能时确实很有用,可以在本地存储一些常见的键值对数据。
当然作为一个游戏小demo还是有很多的不足之处,期待大家的指正和建议!