游戏规则设计:
1、弓的原型固定使用弩,所以视觉效果没有弓那么好。弓主要作为玩家对象,可以在地图上移动,并到射击点进行射箭游戏。
2、弩可发射箭矢,箭矢触碰到目标会对目标造成伤害,箭带有运动轨迹,在命中目标时固定,并在一定时间后消失
3、目标受到一定伤害后会“死亡”,目标一开始不存在于场景中,在玩家移动到射击点后才会生成。分为固定靶和移动靶两种。
4、当玩家进入射击点时生成多个目标,当玩家退出射击点时会清除这些目标,再次进入会重新生成。固定靶目标有10个可能位置生成,移动靶生成位置固定。
5、游戏根据击倒的靶子数计分,靶子“死亡”会触发计分函数进行计分。游戏也有限定箭矢数量,每次进入射击点内仅有15次射击机会,最多5箭击倒一个靶子,每次生成3个靶子。
游戏设计思路:
玩家:
作为一款FPS射击游戏(bushi),首先就是弩的平面移动以及视角的转移,分别通过PlayerMove以及ViewMove来控制:
通过获取鼠标的移动值使得玩家的视角偏转
关于玩家移动的方法不止一种,也可以根据读取键盘的按键来控制玩家的移动。
通过获取输入参数的值控制玩家的CharacterController进行移动
由于玩家可以在地图上往任意方向移动,故需要设置碰撞器碰撞到场景的树或其他固体,设置胶囊碰撞体代表玩家碰撞器,防止其与其他场景物体互相穿透。
玩家碰撞器及其移动脚本
弩:
弩的主要工作是在发射点创建箭矢并发射箭矢。按下鼠标右键后创建箭矢,起初是没有初速度的,会固定在弓弩的发射点上,弓弩会播放拉弓动画,有HalfHold和FullHold两种。在按下鼠标左键后发射箭矢。
当放开鼠标左键时利用Instantiate创建箭矢,并利用Curve曲线赋值给予其的发射力度
ViewMove在弩的组件之中,由于放在玩家上视角的偏移会改变玩家物体的角度从而导致颠倒或反转的bug,故放在弩中更好一点。而摄像头(Main Camera)也同样放在弓弩之中。
弩拥有动画组件以及ViewMove脚本,用于控制弩的发射动画以及视角的偏转
弩弓的动画控制器如下所示,当进入场景时位于Empty中,当鼠标右键装填箭矢后进入Fill或者Hold动画(半拉弓或者满弓),而后通过鼠标左键发射箭矢后进入Shoot动画演示发射箭的动画
弩弓的动画控制器Animator
箭矢:
箭矢在场景中多为克隆体,由预制体作为模板生成。每个箭矢有自己的控制器ArrowControl,用于控制每个箭矢发射的力度以及位置。其中最重要的函数就是碰撞处理函数OncollisionEnter:
箭矢控制器ArrowControl的碰撞触发函数
当箭矢碰撞到物体时,会使自身静止并在1s后销毁。且当碰撞到目标时会调用碰撞目标的Hurt函数对目标的血量进行削减。由于箭矢运用的是UnityAssetStore自带的模板,该箭矢自带运动轨迹,也就是视频里的拖尾。其次是箭矢带有两个碰撞器和一个刚体,其中一个碰撞器是碰撞触发器,一个单纯的是碰撞器,刚体是为了模拟箭矢飞行和下坠的功能。
箭矢力度曲线,根据鼠标左键按下的持续时间增加,改变箭矢的发射力度
目标(靶子):
目标自带生命值,有最大生命值和当前生命值,动画控制器和所带的分数。有Hurt函数以及Death函数,当目标生命值耗尽的时候会触发Death函数使得目标被摧毁。
Hurt函数以及Death函数
在游戏运行的过程中,当进入射击点时,会利用Instantiate函数生成3个目标供玩家射击,击倒则得分,主要的生成函数如下所示:
生成目标(靶子)
场景:
游戏场景
运用Terrain创作的场景,树生成也是用TerrainEditor生成,草地的细节也是利用TerrainEdior批量生成的细节。
场景初始仅有游戏玩家以及两个射箭点,当进入射击点时,目标(靶子)会生成在对应的目标点,且移动靶子会立刻开始运动。
当靶子被击倒时,调用主场景控制函数score对游戏的分数进行调整,且玩家每发射一支箭矢后,箭矢总数会变少。
移动靶的设计主要是依靠动画来设计移动轨迹,并在创建克隆体时播放动画,实现移动靶。
游戏设计的难点在于预制体没法使用已经在场景中存在的组件的脚本或主场景控制中心的函数,故使用安全性较低的static函数对游戏分数进行更改。由于预制体拥有独立的脚本,对应每个箭矢预制体以及目标预制体都有存放其克隆体的数组,并在游戏结束时对克隆体进行批量摧毁。
游戏主体由场景主控制函数控制,接下来是个组件的控制脚本,玩家、弓弩、弓箭、目标等,最后是一些场景的设置以及碰撞体的设置。