跳一跳游戏开发
开发准备
核心玩法
- 小人跳跃的距离和你按压屏幕的时长有关,按屏幕时间越长,跳的越远。
- 跳到盒子上可以加分,没跳到盒子上游戏结束。
- 连续跳到盒子中心可以成倍加分。
- 联网查询排行榜和上传分数。
功能需求分析
- 角色跳跃
- 相机跟随
- 台子自动生成
- 死亡判定及重新开始游戏
- 分数统计
- 色蓄力的粒子效果
- 角色蓄力效果
- 角色蓄力台子效果
- 飘分效果
- 联网排行榜功能
- 翻倍加分功能
开发文档
创建游戏场景
- 创建一个
Plane
当地面,并重命名为Ground
- 创建一个材质球改变
Ground
颜色(默认Plane控件是不能设置材质颜色),创建一个Materials
文件夹放入材质球
- 创建一个
Cube
,y轴缩放0.5当跳板,创建物体可以通过Transsform
中Reset
设置为3D场景正中心,在创建一个Plane当地面,跳一跳小人物碰到地面时游戏借宿,为了让跳板出现地面上方,设置y轴Postion
为0.25(Reset设置居中是以组件正中心)
- 创建一个空物体重命名为
Player
作为玩家角色- Cylinder(圆柱形)控件作为玩家身体
- Sphere(圆形)控件作为玩家头部
- 调整至合适的大小、位置
- 添加材质球,将材质球绑定到Cylinder(圆柱形)控件和Sphere(圆形)控件上,改变材质球颜色,材质球放入
Materials
文件夹
- 保存场景
角色跳跃
- 添加游戏脚本
Player
放入新创建Scripts
文件夹,并将脚本绑定到Player
控件上,并在Player
控件上添加一个物理组件Rigidbody
- 获得
Rigidbody
组件
1 | private Rigidbody _rigidbody; |
- 计算出按下鼠标和松开鼠标之间的时间
1 | private float _startTime; |
- Player跳跃方法的实现
1 | // 小人跳跃时,决定远近的一个参数 |
- 发现人物跳跃落地时会出现跌倒,这是因为重心和碰撞盒的问题
1 | void Start() |
- 将Body下的Capsle Collider去掉,替换成Box Collider
- 修改当前视角,选中Main Camera按下快捷键Ctrl+Alt+F (GameObject->Align With->View)
- 修改Factoer为5,测试(这个盒子是我自己复制Stage出来的)
自动生成盒子
- 随机生成盒子位置
1 | stage.transform.position = _currentStage.transform.position + new Vector3(Random.Range(1.1f,MaxDistance),0,0); |
1 | // 小人跳跃时,决定远近的一个参数 |
- 跳到一个盒子上再随机生成一个盒子
- 如果有别的物体和本物体发生变化,会触发这函数OnCollisionEnter(Collision collision)
- 轻轻一跳在同一个盒子上时,不能在重新生成新的盒子
- 没有跳到下一个盒子上,不能再生成新的盒子
1 |
|
相机跟随
- 获得主相机位置
1 | Camera.main.transform.position |
- 获得相机下一次的相对位置
1 | public Vector3 _camerRelativePosition; |
- 获得相机移动的距离
1 | //获得相机移动的距离 |
- 使用DG.Tweening插件(没有的话请去资源商店下载)(Window->Package Manager)
- 添加移动相机的动画,并在
OnCollisionEnter
中调用
1 | void MoveCamera() |
- 修改
Ground
的Scale为(1000,1,1000),进行测试
死亡判定及重新开始
小人落到地面上就可以判断游戏结束了
当Player碰到地面时,重新加载场景
1 | if (collision.gameObject.name == "Ground") |
- 要注意光源问题,光源保存在缓存中,重新加载场景时不会加载光照,生成静态光照
分数及UI显示
- 创建一个Text文本控件命名为
TotalScore
,并设置2D文本位置,右上角设置文字位置
- 当跳到新的方块上时,分数增加
1 | if (collision.gameObject.name.Contains("Stage") && collision.collider != _lastCollisionCollider) |
角色蓄力粒子效果
在Player上创建粒子系统Particle System
将粒子系统Shape中的Shaper改为Hemisphere圆形发射,并修改Potation上的X值为-90并修改粒子系统的初始值
- 修改脚本,当角色蓄力的时候才会显现出粒子效果
1 |
|
角色蓄力动画
- 当按下鼠标键时,小人物的身体进行缩放,我们可以通过脚本来设置
1 | if (Input.GetMouseButtonUp(0)) |
盒子蓄力动画
- 盒子缩放沿着轴心缩放
- 盒子恢复形状
1 | if (Input.GetMouseButtonUp(0)) |
盒子随机大小及颜色
- 随机大小
- 随机颜色
1 | private void SpawnStage() |
盒子随机方向生成
- 初始的时候设置生成的方向是沿X轴正方向
1 | Vector3 _direction = new Vector3(1, 0, 0); |
- 随机生成跳台(沿X轴或Z轴)
1 |
|
- 改变小人物跳跃方向
1 |
|
- 增加台子生成方向参数
1 | //生成台子 |
增加角色跳跃动画
- 添加动画
1 | void OnJump(float elapse) |
优化盒子相关事件
- 防止过度缩放
1 | // 处理按下空格时小人和盒子的动画 |
- 修复盒子缩放后会还原为预设体大小
1 | //还原盒子的形状 |
随机生成不同盒子
- 创建一个圆柱体并且重命名为
StageCylinder
,放入Prefabs
文件夹
- 创建一个盒子仓库
1 | // 盒子仓库,可以放上各种盒子的prefab,用于动态生成。 |
- 随机生成
1 | GameObject prefab; |
联网排行榜(api)
- LeanCloud官网: https://www.leancloud.cn/
- LeanCloud国际版: https://leancloud.app/
- SDK下载 :https://releases.leanapp.cn/#/leancloud/unity-sdk/releases
- 通过Unity的Http通讯进行数据的增删改查
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Winward King's Blog!
评论