VR/AR

秘密行动

更新时间:2020.8.16 视频教程
PROJECT LIBRARY

[ 重点功能实现 ]

场景的搭建

 
功能说明

把场景模型文件拖拽到层级视图中,创建游戏所需要的场景,同时把场景中所需要的元素补充完整。

实现步骤

1、把Assets/Models文件夹里面的env_stealth_static拖拽到层级视图中,transform组件属性设置如下:

2、给env_stealth_static添加MeshCollider组件,组件属性设置如下:

3、把Assets/Models文件夹里面的prop_battleBus拖拽到env_stealth_static下做为子物体,其transform组件属性设置如下:

4、给prop_battleBus添加MeshCollider组件,组件属性设置如下:

效果展示图

场景中灯光的切换

 
功能说明

整个场景中的灯光颜色偏暗,当玩家触发到场景中的警报后,警报灯会亮起来,报警灯的颜色为红色,真实的模拟了现实生活中报警灯的闪烁效果。

实现步骤

1、更改层级视图中DirectionalLight的Light组件属性如下:

2、在层级视图中创建DirectionalLight类型的灯光,名字改为AlarmLight,其transform组件属性设置如下:

3、AlarmLight的Light组件属性设置如下:

4、给AlarmLight添加脚本组件AlarmLight,实现报警灯的切换。

重点代码
脚本组件属性设置截图
效果展示图

玩家移动

 
功能说明

通过键盘控制玩家的前后左右移动,玩家碰到场景中的墙壁时,就不能向前移动了,主要使用了动画器组件来切换不同的动画状态,同时使用物理引擎让玩家不会掉到场景以下。

实现步骤

1、把Assets/Models文件夹下的char_ethan的动画类型设置为人形动画,然后拖到层级视图中,名字改为Player,tag值设置为Player,具体设置如下:

2、Player的transform组件属性设置如下:

3、给Player添加Rigidbody组件,其属性设置如下:

4、给Player添加CapsuleCollider组件,其属性设置如下:

5、给Player添加AudioSource组件,其属性设置如下:

6、创建动画控制器PlayerAni,双击打开后添加动画参数如下:

7、按以下顺序分别把动画片断Idle、Sneak、Dying拖到动画控制器里面,效果图如下:

8、创建动画融合树,名字改为LocalMotion,然后设置Idle、Sneak、Dying和LocalMotion之间的过渡,过渡的逻辑如下:

9、双击LocalMotion融合树,添加两个动画片断Walk和Run,相关参数设置如下:

10、动画融合树LocalMotion的效果图如下:

11、设置Idle到Sneak的过渡条件如下:

12、设置Sneak到Idle的过渡条件如下:

13、设置Idle到LocalMotion的过渡条件如下:

14、设置LocalMotion到Idle的过渡条件如下:

15、设置LocalMotion到Sneak的过渡条件如下:

16、设置Sneak到LocalMotion的过渡条件如下:

17、设置Any State到Dying的过渡条件如下:

18、给Player添加动画器组件,其属性设置如下:

19、给Player添加脚本组件PlayerHealth和PlayerMove,实现键盘控制Player的移动。

重点代码
脚本组件属性设置截图
效果展示图

摄像机的跟随

 
功能说明

当玩家移动时,摄像机会保持一定的角度跟随玩家一起移动,在摄像机移动的过程中,摄像机的位置会有一个平滑的过渡,以增加视觉效果。

实现步骤

1、给层级视图中的MainCamera添加tag值为MainCamera,具体设置如下:

2、MainCamera的transform组件属性设置如下:

3、给MainCamrea添加CameraMove脚本,实现摄像机的跟随效果。

重点代码
脚本组件属性设置截图
效果展示图

背景音乐的切换

 
功能说明

游戏运行后,会播放背景音乐,当玩家触发警报后,红色的警报灯会亮起,同时会伴有警报声,另外背景音乐也会进行更换。

实现步骤

1、在层级视图中创建空物体,名字为GameController,设置其tag值为GameController,具体设置如下:

2、给GameController添加AudioSource组件,其属性设置如下:

3、给GameController创建空子物体,名字为SecondSound,给SecondSound添加AudioSource组件,其属性设置如下:

4、给GameController添加脚本组件LastPlayerSighting,实现背景音乐的切换。

重点代码
脚本组件属性设置截图

激光门的触发检测

 
功能说明

当玩家移动时,碰撞到激光门会触发警报,此时警报灯会亮起,警报声音和背景音乐会切换,故需要实现激光门和玩家之间的触发检测。

实现步骤

1、在层级视图中创建空物体,名字改为Lasers,用来管理场景中所有的激光门,然后把Assets/Models文件夹里面的fx_laserFence_lasers拖到Lasers下面做为子物体,名字改为laser1,其transform组件属性设置如下:

2、给laser1添加MeshCollider组件,其属性设置如下:

3、给laser1添加AudioSource组件,其属性设置如下:

4、给laser1添加Light组件,其属性设置如下:

5、给laser1添加给Laser脚本组件,实现激光门的触发检测功能。

6、把laser1克隆出第一个副本,名字改为laser2,其transform组件的属性设置如下:

7、把laser1克隆出第二个副本,名字改为laser3,其transform组件的属性设置如下:

8、把laser1克隆出第三个副本,名字改为laser4,其transform组件的属性设置如下:

9、把laser1克隆出第四个副本,名字改为laser5,其transform组件的属性设置如下:

10、把laser1克隆出第五个副本,名字改为laser6,其transform组件的属性设置如下:

重点代码
脚本组件属性设置截图
效果展示图

自动门的触发检测

 
功能说明

自动门默认状态是关闭,当玩家或者小机器人进入自动门的触发范围以内,自动门会打开,离开触发范围自动门会关闭,自动门开关的功能使用了动画器组件,触发检测使用了物理引擎。

实现步骤

1、在层级视图中创建空物体,名字改为Doors,用来管理场景中的自动门,然后点击Assets/Models下的door_generic_slide,设置右侧检视面板中Rig的选项如下:

2、把door_generic_slide拖到Doors下做为其子物体,名字改为door1,door1的transform组件属性设置如下:

3、给door1添加SphereCollider组件,其属性设置如下:

4、给door1添加AudioSource组件,其属性设置如下:

5、给door1的子物体添加MeshCollider组件,其属性设置如下:

6、创建动画控制器DoorAni,并把Assets/Models下的door_generic_slide的两个动画片断拖到状态机里面,并设置好动画片断之间的过渡,具体效果图如下:

7、在DoorAni动画状态机中添加bool类型的动画参数DoorOpen。

8、设置Closed到Open的过渡条件如下:

9、设置Open到Closed的过渡条件如下:

10、给door1添加Animator组件,并把DoorAni拖到动画器组件上,具体设置如下:

11、给door1添加脚本组件Door,实现自动门的开关。

重点代码
脚本组件属性设置截图
效果展示图

监控探头的触发检测

 
功能说明

分别在墙角和卡车上安装监控探头,主要的功能是当玩家触发到监控探头后,警报声会响起来,同时警报灯也会亮起来,使用引擎自带的动画编辑器给监控探头创建左右摇摆的动画,使用物理引擎进行触发检测。

实现步骤

1、在层级视图中创建空物体,名字改为CCTVS,用来管理监控探头,把Assets/Models下的prop_cctvCam拖拽到CCTVS下做为子物体,名字改为cctv1,其transform组件属性设置如下:

2、选中cctv1的子物体prop_cctvCam_joint,然后再按下快捷键Ctrl+6调出动画编辑器窗口,创建动画名字为CCTV,给prop_cctvCam_joint添加Rotation属性如下图:

3、第0帧的Rotation值设置如下:

4、第60帧的Rotation值设置如下:

5、第120帧的Rotation值设置如下:

6、第180帧的Rotation值设置如下:

7、第240帧的Rotation值设置如下:

8、给cctv1的子物体prop_cctvCam_body添加空子物体体,名字为Trigger,其transform组件属性设置如下:

9、给Trigger添加MeshCollider组件,其属性设置如下:

10、给Trigger添加Light组件,其属性设置如下:

11、给Trigger添加脚本组件CCTV,实现监控探头的触发检测功能。

重点代码
脚本组件属性设置截图
效果展示图

钥匙的触发检测

 
功能说明

钥匙在场景中旋转,当玩家触发到钥匙后,钥匙消失,玩家得到钥匙,主要应用了动画器组件和物理引擎。

实现步骤

1、把Assets/Models下的prop_keycard拖到层级视图中,名字改为key,其transform组件属性设置如下:

2、给key添加SphereCollider组件,属性设置如下:

3、给key添加AudioSource组件,属性设置如下:

4、创建动画控制器KeyCardAni,把prop_keycard下的动画片断拖到动画状态机中,效果如下:

5、给key添加Animator组件,属性设置如下:

6、给key添加脚本组件KeyCard,实现钥匙的触发检测功能。

重点代码
脚本组件属性设置截图
效果展示图

激光门的控制

 
功能说明

在房间中放置控制激光门隐藏的电门,当玩家站在电门触发范围内,同时按下Z键后,电门上方锁的图标会由红色改成绿色,电门所控制的激光门将会隐藏,这样玩家就不会触发警报了。

实现步骤

1、在层级视图中创建空物体,名字改为LaserSwitchs,用来管理所有的电门,把Assets/Models下的prop_switchUnit拖到LaserSwitchs下做为其子物体,名字改为switchUnit,其transform组件属性设置如下:

2、给switchUnit添加MeshCollider组件,属性设置如下:

3、给switchUnit添加BoxCollider组件,属性设置如下:

4、给switchUnit添加AudioSource组件,属性设置如下:

5、给switchUnit添加LaserSwitch组件,实现控制激光门的隐藏。

重点代码
脚本组件属性设置截图
效果展示图

电梯的上升

 
功能说明

当玩家拿到钥匙进入电梯等5秒钟以后,电梯开始上升,玩家不能够随意移动。电梯在上升的过程中,会播放声音,同时也会响起游戏结束的声音,当电梯上升到一定高度后,游戏转场景并重新开始。

实现步骤

1、把Assets/Models下的prop_lift_exit拖到层级视图中,名字改为lift,其transform属性设置如下:

2、给lift添加AudioSource组件,其属性设置如下:

3、给lift的子物体prop_lift_exit_carriage添加BoxCollider组件,用来检测玩家是否在电梯里面,属性设置如下:

4、给prop_lift_exit_carriage添加AudioSource组件,属性设置如下:

5、给prop_lift_exit_carriage添加LiftDoor脚本组件,实现电梯上升的功能。

6、给lift的子物体door_exit_inner添加SyncDoor脚本组件,实现电梯门随红色门一起开关。

重点代码
脚本组件属性设置截图
效果展示图

小机器人功能的实现

 
功能说明

游戏开始后,小机器人会在自己的巡逻位置进行巡逻,当玩家触发警报后,小机器人会跑到玩家触发警报的位置, 如果在移动的过程中看到玩家,则小机器人会追踪玩家,如果玩家停下来,小机器人会对玩家开枪,玩家血量会减少, 如果血量减少到0,玩家执行死亡的动画,游戏结束。如果小机器人跑到警报位置没有看到玩家,等待几秒钟后, 小机器人会自动回到巡逻点进行巡逻。当玩家在没有死亡的情况下,拿到钥匙并进入电梯,等电梯上升后表示玩家胜利, 游戏结束并重新开始。小机器人的功能主要使用了Unity引擎动画系统和导航系统,主要的技术包括:动画融合,动画层, 动画遮罩,动画事件,IK动画,动画曲线以及导航组件的使用。

实现步骤

1、把Assets/Models下的char_robotGuard拖到层级视图中,名字改为enemy,设置其tag值为Enemy如下:

2、enemy的transform组件属性设置如下:

3、创建动画控制器EnemyAni,创建动画融合树,名字改为LocoMotion,动画状态机如下:

4、在EnemyAni中添加不同类型的动画参数,如下:

5、双击LocoMotion打开融合树,设置动画融合类型以及添加要融合的动画片断,如下:

6、创建动画遮罩EnemyShotMask,具体设置如下:

7、添加新的动画层ShootLayer,设置如下:

8、在ShootLayer里面添加动画片断并设置过渡逻辑,如下:

9、Empty->WeaponRaise的过渡条件如下:

10、WeaponRaise->WeaponLower的过渡条件如下:

11、WeaponLower->Empty的过渡条件如下:

12、WeaponLower->WeaponRaise的过渡条件如下:

13、WeaponRaise->WeaponShoot的过渡条件如下:

14、WeaponShoot->WeaponLower的过渡条件如下:

15、在层级视图中创建空物体point1,其transform组件属性设置如下:

16、在层级视图中创建空物体point2,其transform组件属性设置如下:

17、在层级视图中创建空物体point3,其transform组件属性设置如下:

18、在层级视图中创建空物体point4,其transform组件属性设置如下:

19、给enemy添加Animator组件,属性设置如下:

20、给enemy添加Rigidbody组件,属性设置如下:

21、给enemy添加SphereCollider组件,属性设置如下:

22、给enemy添加CapsuleCollider组件,属性设置如下:

23、给enemy添加NavMeshAgent组件,属性设置如下:

24、给enemy添加EnemyAI脚本组件,实现小机器人的自动寻路。

25、给enemy添加EnemySight脚本组件,实现小机器人的听觉和视觉功能。

26、给enemy添加EnemyAnimation脚本组件,实现小机器人的动画。

27、给enemy添加EnemyShooting脚本组件,实现小机器人的射击。

重点代码
脚本组件属性设置截图

1、EnemyAI脚本组件设置如下:

2、EnemySight脚本组件设置如下:

3、EnemyAnimation脚本组件设置如下:

4、EnemyShooting脚本组件设置如下:

效果展示图