布局通常2 by 3
接下来我们布置场景,我们的预期结果(功能分析)是:
游戏中中的小球会以恒定速度向前移动,而玩家控制着小球左右移动来躲避跑道中的红色障碍物,如果玩家能控制小球在跑到上移动一定距离则视为玩家通过关卡,触碰到障碍物或从跑道上掉落视为失败。
分析:我们需要实现的功能概括来说有,主角的移动,摄像机的移动,过关与失败的检测等
首先我们开始场景搭建:
首先创建一个Cube(长方体)作为跑道
修改它的Transform与命名
创建一个小球(玩家)
修改Transofrm与命名
创建一个材质包文件夹
接着创建若干Cube作为遮挡物并设为红色
接下来创建一个Scripts文件夹用来存放脚本
创建一个脚本
命名为Run
将代码挂载玩家Player上
运行即可通过方向键左右控制小球移动躲避红色障碍物
虽然我们控制了小球移动但是主摄像机一直停留原地,接下来我们需要设置主摄像机的移动
实现主摄像机的移动方法有两种,我们可以通过以上同样方法设置与小球同样速度并保持一定距离来实现,另一种就是将主摄像机设置成小球的子物体,建立父子关系,我们采取第二种方案,
将Main Camera拖拽至Player的下方成为子物体,即完成
再次运行,可见摄像机也随之移动了。
我们最后设置游戏机制,
一般有两种情况会导致游戏失败,一种是碰到了障碍物,另一种是小球从跑到边缘掉落
实现这个功能只需要将障碍物上的Is Trigger选项勾选,然后再障碍物的脚本里的OnTriggerEnter()函数中检测碰撞即可。
我们需要先创建一个完备的障碍物,变成预制体,随后拖拽预制体设置场景障碍。
我们先创建一个预制体文件夹
再创建一个障碍物需要挂载的Stop脚本
将场景中的一个Cube障碍物的Is Trigger打开
删除其余障碍物
将Cube改名为Barrier(障碍物)
我们在运行测试小球与障碍物相撞的结果之前,需要将小球挂载Rigidbody
障碍物挂载停止脚本Stop.cs
运行相撞即停止
可见Stop.cs代码中的Time.timeScale表示游戏的运行时间倍率,设置为0即表示游戏里的时间停滞,1即正常的时间流逝速度,2即翻倍,以此类推。
我们将障碍物Brrier放进预制体中,再从预制体设置场景布满障碍物
注意:wasd + 鼠标右键可移动编辑场景视角
注意:
Hierarchy中的放置预制体为蓝色
虽然撞到障碍物停止的功能实现了,但小球掉落后的功能却没与实现
所以我们继续编写Player中的代码,
运行掉落即暂停
当游戏失败结束时应该允许玩家重新开始游戏,这里设置键盘上的R键为重置游戏的按键,在按R键后即可重新加载当前场景。继续在Player脚本里添加代码:
修改脚本后运行即可按R键复位重置游戏
注意:SceneManager这个类型属于using UnityEngine.SceneManagement的,因此要添加头文件才能调用SceneManager.LoadScene(0)方法,这里参数0表示场景的序号,由于游戏现在只有一个场景,因此表示加载当前场景。
接着设置终点,
在过了所有障碍之后不远处创建一个物体作为终点
设置终点
新建挂载在终点物体的Win代码
检查Player是否添加了组件Rigidbody
代码挂载
最后取消终点物体End的Mesh Renderer(渲染器)的勾选让物体消失但触发器还在
即实现全部功能
最后我们进行完善游戏,
首先加入一个通关UI界面
UI界面设置好之后,接下来要做的是在游戏开始时隐藏UI,在小球触发终点物体时再显示,修改End终点物体的Win.cs代码
注意这里一定要把Panel命名为EndUI,不然在代码中会找不到EndUI我们设置的UI显示界面
运行即可实现UI功能
最后扩展一个3D数学知识,简单思路为:在Player脚本中使用获取的横向输入,以此控制摄像机的倾斜角度。在Player物体的Run.cs脚本中添加以下代码即可
运行实现
End