Unity3D RPG Core | 21 制作更多的敌人

目前我们的史莱姆逻辑已经基本完成,这节开始制作更多的敌人。

在制作之前,先解决上节遗留的一个问题:人物角色死亡的时候,还是能点击鼠标移动。如代码清单 1 所示,修复的做法是在之前绑定的移动事件和攻击事件中,增加对死亡状态的判断。

代码清单 1 人物角色死亡逻辑
  1. public class PlayerController : MonoBehaviour
  2. {
  3.     void DoMoveAction(Vector3 destination)
  4.     {
  5.         StopAllCoroutines();
  6.         m_navMeshAgent.isStopped = false;
  7.         // 人物角色没死才移动
  8.         if (m_characterData.CurrentHealth > 0)
  9.             m_navMeshAgent.destination = destination;
  10.     }
  11.     void DoAttackAction(GameObject obj)
  12.     {
  13.         // 人物角色没死才攻击
  14.         if (obj != null && m_characterData.CurrentHealth > 0)
  15.         {
  16.             m_enemyObj = obj;
  17.             StartCoroutine(CoroutineAttackEnemy(obj));
  18.         }
  19.     }
  20. }

1. 添加更多的史莱姆

我们在 Hierarchy 窗体中的史莱姆预制体上,按 Ctrl+D 复制出一个,并将其移动到想要的位置。但是会有问题,如图 1 所示,因为共用一份 ScriptableObject 数据,所以会出现没有受伤却一起死亡的情况。

图1 共用了 ScriptableObject

修复方法如代码清单 2 所示,使用 Instantiate() 函数复制 ScriptableObject 预制体。此处将 Instantiate() 理解为深拷贝,后续更新的内容都在各自的拷贝数据上,彼此独立。

代码清单 2 拷贝 ScriptableObject
  1. public class CharacterData : MonoBehaviour
  2. {
  3.     [SerializeField]
  4.     private CharacterDataScriptableObject m_templateCharacterData = null;
  5.     private CharacterDataScriptableObject m_characterData = null;
  6.  
  7.     private void Awake()
  8.     {
  9.         if (m_templateCharacterData != null)
  10.             m_characterData = Instantiate(m_templateCharacterData);
  11.     }
  12. }

2. 添加乌龟

首先我们将素材包里的乌龟预制体添加到场景内。需要设置的基本内容与史莱姆一样:

1. 标签改为 Enemy,分类为敌人。

2. 添加 EnemyController 脚本,并修改其中的属性变量,比如巡逻范围等。

3. 添加 Nav Mesh Agent 组件,并修改其中的障碍设置。

4. 添加 CharacterData 脚本,并且需要为乌龟创建制作一个新的角色属性 ScriptableObject 文件。

5. 添加 AttackData 脚本,并且需要为乌龟创建制作一个新的攻击属性 ScriptableObject 文件。

6. 添加 Box Collider 组件,并且设置碰撞范围。

2.1 设置动画

设置完上述基础内容之后,乌龟的基本逻辑已经完成,只剩下设置乌龟特有的动画了。因为乌龟的动画逻辑和史莱姆是一模一样的,所以这边我们不采用复制动画控制器的方式,而是创建一个 Animator Override Controller

如图 2 所示,我们需要复用的是史莱姆的动画控制器。界面上会列出需要覆盖的动画,我们只需要拖拽乌龟对应的动画即可,非常方便!

图2 复用史莱姆动画控制器

最后不要忘记为乌龟的普通攻击和暴击动画添加关键帧事件,否则乌龟的攻击就不会产生伤害。如果忘记了添加的操作,可以回顾一下 《Unity3D RPG Core | 17 实现攻击数值计算》 里面的步骤。

3. 添加更多的敌人

如图 3 所示,我们再导入两个资源包:一个兽人素材包、一个石头人素材包。

图3 素材资源

这些素材内容同样要升级到 URP。如果忘记了升级的操作,可以回顾一下 《Unity3D RPG Core | 01 创建项目导入素材》 里面的步骤。

接着我们可以把兽人和石头人添加到场景中,我们先设置它们的标签和 Box Collider 组件。如图 4 所示,我们可以点击 Edit Collider 按钮,就能直接在界面上操作指定碰撞体范围。

图4 编辑 Box Collider

新的一套敌人资源相较于史莱姆那套,颜色稍微有点暗淡。我们可以在预制体下面的 Mesh 对象里的材质组件上进行简单调整。比如图 5 所示,调节金属度和平滑度。

图5 提亮颜色