Unity入门——实现一个简单的跑酷游戏(资源预制)

Unity入门——实现一个简单的跑酷游戏

资源预制

一款跑酷游戏,需要大量重复的场景资源,比如道路、障碍物等,无论是从游戏体验的角度还是运行效率的角度考虑,都不应该全部事先摆好,而是应该由代码随机生成并在使用结束后销毁,这里就需要用到unity中很重要的一个概念——prefeb(预制体)。
首先是道路的生成,除了在场景中放入初始道路外,我们要做到在人物移动时在前方生成道路,道路(以及作为背景的水面)是一定需要做成预制体的。
将初始场景如下搭建,道路以及水面大小自行在右侧inspector面板的transform组件中调整至合适大小。
在这里插入图片描述
从Asset中拖动模型到Hierarchy中设置好transform等组件,再将这个GmaeObject到Assets面板中,选择original prefeb即可,如果不需预先布置,在设置好prefeb之后可以在hierarchy面板中将这个GameObject直接删除,没有影响。这里道路只需要transform组件即可。预制体的修改会影响它的全部复制体,而复制体的修改不会影响预制体。
而障碍物我们需要其带有collider属性,以便判定人物是否碰撞到。
我们需要三种障碍物,分别可以通过跳跃、下滑或者两者都可通过。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以通过AddComponent->Physics->BoxCollider组件中设置碰撞体的体积来实现不同的碰撞体,注意使用的是局部坐标系(这种方式相对复杂,需要配合动作同时调整人物体积或位置,本例的实现方式会在下一篇中说明)。

额外拾取的积分奖励道具也需要碰撞判定,因此同样添加BoxCollider属性。
在这里插入图片描述

这样我们就可以在脚本中直接方便的使用instantiate函数动态生成。
函数原型如下:

public static Object Instantiate(Object original); 
public static Object Instantiate(Object original, Transform parent); 
public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace); 
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation); 
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent);

一般使用第四个,即指定对象、位置、转角生成GameObject。
然后是核心的人物资源。
unity支持的模型格式如下:在这里插入图片描述
对模型不理解的这边稍微解释一下,网络就是模型的网格,决定模型的形状,不带颜色;材质就是决定模型的表面;动画如果是模型自带的则允许直接使用,骨骼是用来控制网格顶点做运动的。
本例采用的模型全部是FBX格式,自带动画(毕竟要自己做还是比较麻烦的)。
模型资源如下,所有资源的下载链接请见上一篇。
在这里插入图片描述
这里,我们需要将人物这个GameObject设置一些组件,如下:在这里插入图片描述
Transform:位置、缩放、旋转等,不多解释;
Animator:动画器,用于播放动画,包括了控制器和骨骼映射两个公有变量,以及是否使用根运动(即模型动作是否作用到其位置上),本例使用特殊的判定方式(下一篇会讲到),因此不需要额外的运算开销,不勾选。控制器变量需要赋值一个.controller文件,即在Asset窗口新建的Animator controller,动画状态机设置如下:
在这里插入图片描述
图示如下:
在这里插入图片描述
在Animator的Baselayer窗口里面右击新建状态->empty,选择对应动画填入motion,右击状态添加transition连上箭头,点击箭头,在inspector面板设置条件转移(变量要先在parameters添加,点击parameters右下角的小加号就能添加)即可。
本例中还使用了动画混合树来使起跑动作更加流畅,具体操作为在Animator的Baselayer窗口里面右击新建状态->From New Blend Tree,在parameters添加一个float类型变量,双击状态在右侧添加动画,参数thresh是表示对于该float变量的各阶段分别趋向于播放哪个动作。
在这里插入图片描述
注意,对于每一条连线,即transition,都有一个has exit time选项,该选项是指是否在切换动作时把当前动作做完,勾选即认为动作做完才能转移状态,一般主动动作都是不勾选的,而如果要做被迫击倒等动画,则需要勾选。
在这里插入图片描述
PlayerController组件,人物动作逻辑的核心脚本,下一章详细介绍。
Particle System组件,即粒子系统,这个组件一般用于制作一些画面特效,如火焰特效、光环特效等,本组件选项较多,较为琐碎,就不一一介绍了。本例中利用该组件给人物添加了一个蝴蝶环绕的特效,该粒子特效包含在资源包中。
在这里插入图片描述
CharacterController组件,本组件配合PlayerController脚本实现人物的控制功能,公有变量slope limit:爬坡最陡值,Step Offset:台阶高度;skin width:皮肤厚度(一般用人物卡在那里过不去了可能就是这个数值太小的原因,但太大会产生抖动);min move distance:最小移动距离,防止人物静止抖动。本组件需要调整胶囊体覆盖人物,自行设置数值,效果如下:
在这里插入图片描述
Audio Source音频资源,即人物语音和音效等,可以包括在人物控制逻辑中,在playercontroller中调用播放。

那么到这里,资源的准备就差不多结束了。
下一篇针对核心,人物控制,来谈谈如何实现。
2020.4.11

猜你喜欢

转载自blog.csdn.net/Echidna_/article/details/105449946