Unity3D RPG Core | 24 设置石头人Boss

从这节开始,我们实现石头人Boss的相关内容。石头人有两个攻击动画,一个是抛石头,一个是“冲拳”攻击。这节我们先实现石头人的冲拳攻击逻辑:它和兽人的逻辑类似,都是近距离时击退角色。

1. 创建石头人控制器

和兽人一样,我们单独为石头人创建一个 C# 脚本,命名为 GolemController,其中也实现 KickOff() 击退功能。兽人的击退帧是没有伤害的,而石头人的击退和伤害需要在同一帧里。所以如代码清单 1 所示,石头人的 KickOff() 是增加了伤害计算,其余逻辑和兽人一样。

代码清单 1 石头人控制器
  1. public class GolemController : EnemyController
  2. {
  3.     public float m_kickForce = 20;
  4.  
  5.     public void KickOff()
  6.     {
  7.         if (m_playerObj != null && transform.IsFacingTarget(m_playerObj.transform))
  8.         {
  9.             CharacterData playerCharacterData = m_playerObj.GetComponent<CharacterData>();
  10.             m_attackData.TakeDamage(playerCharacterData);
  11.  
  12.             //
  13.             transform.LookAt(m_playerObj.transform);
  14.  
  15.             Vector3 direction = m_playerObj.transform.position - transform.position;
  16.             direction.Normalize();
  17.  
  18.             NavMeshAgent agent = m_playerObj.GetComponent<NavMeshAgent>();
  19.             agent.isStopped = true;
  20.             agent.velocity = m_kickForce * direction;
  21.  
  22.             m_playerObj.GetComponent<Animator>().SetTrigger("Dizzy");
  23.         }
  24.     }
  25. }

2. 组件设置

接着我们将 GolemController 脚本拖拽到石头人对象上,然后需要对其中的组件进行进一步设置。

动画控制器:因为石头人的动画逻辑和兽人一样,所以我们创建复用动画控制器,复用兽人的动画。将冲拳动画的一帧事件绑定到 KickOff() 函数上。

ScriptableObject:创建石头人的人物属性和攻击属性 ScriptableObject 文件,并拖拽指定到组件上。

Nav Mesh Agent:将石头人的速度设置缓慢一点(Speed、Angular Speed、Acceleration);设置 Obstacle Avoidance 范围。

GolemController:设置石头人为守卫类型、视线范围和击退距离等等。

2.1 一个新发现的击退漂移问题

击退后,人物会自动回到原先位置。因为之前 StopAgent 脚本中,在动画结束播放时会恢复 agent。因为点击地面和点击敌人时,也会恢复 agent,所以这边干脆在动画结束播放时也改为停止 agent。

  1. public class StopAgent : StateMachineBehaviour
  2. {
  3.     // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
  4.     override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
  5.     {
  6.         animator.GetComponent<NavMeshAgent>().isStopped = true;
  7.     }
  8. }

最终石头人的击退效果如图 1 所示。

图1 石头人击退效果