Unity3D RPG Core | 10 设置敌人的基本属性和状态

这节内容开始添加敌人。首先如图 1 所示,下载和导入包含史莱姆和乌龟的素材。

图1 导入敌人资源

添加敌人素材之后,我们需要将其升级为 URP 材质。升级的步骤之前已经讲过,忘记了的话可以查看 《Unity3D RPG Core | 01 创建项目导入素材》 里的记录。

1. 添加敌人控制脚本

与之前的人物控制脚本类似,我们创建敌人的控制脚本,命名为 EnemyController

视频中介绍了一种方法:当需要确保附加脚本的对象上有某一组件,可以使用 RequireComponent 特性。如代码清单 1 第 14 行所示,我们确保附加对象上有 NavMeshAgent 组件。

同时代码中定义了 EnemyStates 枚举类,对应敌人的守卫、巡逻、追击和死亡状态,后续再进行逻辑完善。

代码清单 1 敌人控制器
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.AI;
  5.  
  6. public enum EnemyStates
  7. {
  8.     GUARD,
  9.     PATROL,
  10.     PURSUIT,
  11.     DEATH,
  12. }
  13.  
  14. [RequireComponent(typeof(NavMeshAgent))]
  15. public class EnemyController : MonoBehaviour
  16. {
  17.     public EnemyStates m_enemyStates;
  18.     NavMeshAgent m_navMeshAgent;
  19.  
  20.     void Awake()
  21.     {
  22.         m_navMeshAgent = GetComponent<NavMeshAgent>();
  23.     }
  24.  
  25.     // Start is called before the first frame update
  26.     void Start()
  27.     {
  28.         
  29.     }
  30.  
  31.     // Update is called once per frame
  32.     void Update()
  33.     {
  34.        
  35.     }
  36. }

2. 敌人设置

我们将素材里的敌人预制体添加到场景之后,就可以在 Inspector 窗体中,如图 2 所示,对相关内容进行设置。

图2 敌人对象设置

首先我们将敌人控制脚本拖拽添加到敌人对象上,可以看到这时候 RequireComponent 特性生效了,它自动为对象添加了 Nav Mesh Agent 组件。我们调整 Nav Mesh Agent 组件下的 Steering 选项,让敌人跑得比人物慢一点,方便之后可以“脱战”;调整 Obstacle Avoidance 选项,让敌人的障碍区域更加“贴近”模型。

我们还需要为敌人添加 Collider 碰撞组件,结合碰撞检测来实现攻击功能。同时也调节碰撞区域让它更“贴近”模型。

其他设置

敌人对象还有一些东西需要设置。如图 3 所示,将敌人的 Layer 也设置为自定义的遮挡效果层,因为敌人也可能跑到树木后面,这部分内容在上一篇文章中介绍过。

接着定义并指定新的 Tag,名称为 Enemy。新的 Tag 用作射线碰撞检测用。

图3 其他设置

3. 敌人鼠标样式设置

在添加了敌人之后,鼠标移动到敌人身上需要变成攻击样式。根据之前 《Unity3D RPG Core | 06 设置鼠标指针》 中的步骤,我们首先添加攻击鼠标样式素材。

接着如代码清单 2 所示,添加攻击鼠标纹理(m_textureAttack,第 4 行),并在 Unity 界面中拖拽指定。同时增加鼠标样式更改逻辑:射线碰撞检测时,如果碰撞体是敌人,将鼠标样式变为攻击样式(第 11、12 行)。注意敌人对应的 tag 已经在上一节中进行设置,tag 名称需要一致。

代码清单 2 鼠标样式
  1. public class MouseManager : MonoBehaviour
  2. {
  3.     // 鼠标纹理
  4.     public Texture2D m_textureMove, m_textureAttack;
  5.  
  6.     public void SetCursorTexture(RaycastHit raycastHit)
  7.     {
  8.         string tag = raycastHit.collider.gameObject.tag;
  9.         if (tag == "Ground")
  10.             Cursor.SetCursor(m_textureMove, new Vector2(16, 16), CursorMode.Auto);
  11.         else if (tag == "Enemy")
  12.             Cursor.SetCursor(m_textureAttack, new Vector2(16, 16), CursorMode.Auto);
  13.     }
  14. }

图 4 为鼠标移动到敌人身上显示的效果。

图4 最终效果