一 界面UI制作:
1.界面UI介绍 :皮肤选择,模式选择 分数面板 运用Unity3D自带的UGUI功能 Button Text Toggle
(1).Toggle 为互斥选择,需要添加Toggle Gruop 来绑定两个选择框
(2). Ouline Shadow 为图片添加阴影 描边,让图片可以呈现出按钮的状态
2.锚点功能:
锚点功能 设有A B 两个物体 A为B的父级,B物体锚点设在A物体的任一方位即可与B物体保持相对静止,相对等大,无论画面如何拉伸 AB 物体都保持相对比例
二 游戏玩法实现
蛇头的移动
1.逻辑:蛇头按着一个固定值移动(可以称为帧数运动)
代码实现:
定义两个变量 X Y 表示为蛇头垂直和水平移动的增量;
声明一个 Vector3变量 headpos在储存蛇头移动前的位置
声明 蛇头移动的增量————(等同于蛇头移动多块)
定义一个蛇头移动的方法————(移动函数 Move)
<1> headpos储存蛇头移动前的位置 localPositon为本地坐标系
<2>蛇头位置 headpos.x headpos.y 增加 X Y
小结:这样蛇头的移动功能基本完成(但是需要按键来使它移动)
2.逻辑:按键控制蛇头移动
代码实现:
用 W A S D来控制蛇头4个方位的移动
X=speed时为向右的移动(坐标系中右为正数) 此时Y=0;
X=-speed时为向左的移动(坐标系中左为负数) 此时Y=0;
Y=speed时为向上运动 (坐标系中上为正数) 此时X=0;
Y=-speed时为向下运动(坐标系中下为负数) 此时X=0;
用InvokeRepeating重复调用函数 来重复调用Move移动函数
InvokeRepeating 有三个参数 (函数名,调用多长时间,每秒调用多少次(速率))
这里时间设为0 即为马上调用,调用速率我们声明一个Veocity变量来存储方便我们后期在面板中修改;
一开始初始化蛇头移动的方向
小结:这样按键就能控制蛇头移动了 但是蛇头移动是 蛇头的旋转方向不会跟着改变
3.逻辑:蛇头移动时蛇头的旋转方向要保持与蛇头移动方向一致
代码实现:
用四元数中欧拉角来确定蛇头旋转的方向
有4个方向 上-下-左-右 对应 0° 180° 90° -90°
初始化蛇头旋转的方向————即面向的方向
小结:蛇头的移动基本完成,蛇头的旋转方向也跟蛇头移动方向保持一致
4.逻辑:按住空格键实现蛇头的加速移动
在空格按下时 先停止蛇头移动的函数重复调用,重新定义一个新的函数调用,将调用时间缩短就实现了蛇头的加速移动,在放开空格键时同理,将时间设为原来的数值 即蛇头恢复之前的速度。
小结: CancelInvoke(); //为停止函数重复调用
边界的添加
游戏四周添加带有碰撞体的边界
食物的生成
确定上下的宽度为蛇头走了11步,左边走了10步 右边走了18步
每一步所带有的基本单位是30;
可以计算出 Y的范围 (-11,11)
X的范围 ( (-18+8),18)
代码实现如下
int x y 两个变量来存取每次随机的坐标作为食物生成的坐标
函数说明:Random.Range(a,b); 在开区间a和b闭区间之间取随机数
最终出来的坐标再*30 就是每次随机食物的准确坐标;
下面是食物生成的整体方法
食物形状的随机产生
定义一个图片精灵数组 来存放所有的食物图片
定义一个索引 随机范围(0,精灵数组的总长度)
获取食物prefabs的Image组件 将索引值赋值就完成了食物形状的随机
蛇身的生成
我们都知道 蛇头吃完食物后都会长出一个身体,接下来我们来处理蛇身的生成
定义蛇身的预制体,与存放蛇身位置的Transform数组
定义一个索引来判断生成蛇身是奇数个还是偶数个用于蛇身形状的区分
将蛇身实例化在屏幕之外的地方
将索引值赋值给蛇身的精灵图片数组
蛇身的跟随蛇头移动的原理如下图所示 就是将后一个蛇身的位置赋值道前一个 第一蛇身的位置赋值道蛇头移动之前的位置
用for循环来遍历
在碰撞函数中 在碰撞道Food时 生成蛇身 在带着蛇身移动
让蛇可以通过边界传送
实现原理很简单 就是在碰撞到边界时 将蛇身的位置设到相反边边界的位置就可以完成蛇身的传送 注意(相反时需要+超出边界的数值 不然会形成无限撞边界的BUG)
奖励目标的生成和获取
游戏中会随机出现一个 奖励目标 与生成食物的方法相同 但是多了一个+更多分的机制
再吃到道具时 我们设定奖励10——150分
达到一定分数时 切换背景
这里我们设置了 300分 600分 800 分 1000分 分为5个阶段
用ConlorUtilty.TryParseHtmString方法来改变背景的颜色
ConlorUtilty.TryParseHtmString(颜色的16进制)
蛇的死亡
在蛇碰到边界死亡,碰到自己的身体死亡
死亡时停止重复调用Move移动函数 启用协程等待1.5f后重新加载场景
上次成绩与最好成绩的记录
这里我们使用Unity自带的记录方法 PlayPrefs Set为储存 Get为获取
死亡时先记录这次的当前的得分
如果之前最好的得分小于当前的得分,则将当前的得分赋值给最好的得分
最后在开始场景中 获取我们存储的变量 在Awake函数中进行赋值
对于用户设置的存储
在Start方法中 如果我们获取的sh等于我们上次设置的蛇身颜色这将该颜色的Toggle开关打开
边界设置存储跟蛇身颜色存储类似 用0 1 来表示是否有边界
蓝色蛇身 与黄色蛇身的Toggle方法
最后完善点击按钮函数
我们的游戏就基本制作完成拉 我这里说的是游戏中比较关键的逻辑 一些小细节跳过了哦
试验下我们的游戏吧!