Unity3D RPG Core | 24 设置石头人Boss
从这节开始,我们实现石头人Boss的相关内容。石头人有两个攻击动画,一个是抛石头,一个是“冲拳”攻击。这节我们先实现石头人的冲拳攻击逻辑:它和兽人的逻辑类似,都是近距离时击退角色。
1. 创建石头人控制器
和兽人一样,我们单独为石头人创建一个 C# 脚本,命名为 GolemController,其中也实现 KickOff() 击退功能。兽人的击退帧是没有伤害的,而石头人的击退和伤害需要在同一帧里。所以如代码清单 1 所示,石头人的 KickOff() 是增加了伤害计算,其余逻辑和兽人一样。
2. 组件设置
接着我们将 GolemController 脚本拖拽到石头人对象上,然后需要对其中的组件进行进一步设置。
动画控制器:因为石头人的动画逻辑和兽人一样,所以我们创建复用动画控制器,复用兽人的动画。将冲拳动画的一帧事件绑定到 KickOff() 函数上。
ScriptableObject:创建石头人的人物属性和攻击属性 ScriptableObject 文件,并拖拽指定到组件上。
Nav Mesh Agent:将石头人的速度设置缓慢一点(Speed、Angular Speed、Acceleration);设置 Obstacle Avoidance 范围。
GolemController:设置石头人为守卫类型、视线范围和击退距离等等。
2.1 一个新发现的击退漂移问题
击退后,人物会自动回到原先位置。因为之前 StopAgent 脚本中,在动画结束播放时会恢复 agent。因为点击地面和点击敌人时,也会恢复 agent,所以这边干脆在动画结束播放时也改为停止 agent。
- public class StopAgent : StateMachineBehaviour
- {
- // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
- override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
- {
- animator.GetComponent<NavMeshAgent>().isStopped = true;
- }
- }
最终石头人的击退效果如图 1 所示。