一、实现功能如下
- 以下 1、2 功能均在同一个脚本当中,在说明功能如何实现时,只贴上部分代码,若是想要查看完整代码,可到底部下载代码文件,无需积分
1、随机生成敌人
创建三个空物体,当作敌人生成地点,注意:三个空物体必须要在NavMeshAgent寻路系统烘培的网格路面内,否则即使创建了敌人,敌人也无法自动寻路进行巡逻。(这里就只制作一波怪了,若是要制作三波怪,可使用协程使创建敌人的方法在调用一次后,等待n秒后再次执行,血量的改变可用传参的方式。)
代码如下(GenerateEnemy脚本,仅供参考):
private void CreateEnemy()
{
int index = 0;
Vector3 vec = new Vector3(2, 2, 2);
enemy = new GameObject[3];
nav = new NavMeshAgent[3];
ani = new Animator[3];
enemyLoc = new Vector3[3];
for (int i = 0; i < 3; i++)
{
enemy[i] = Instantiate(EnemyType[Random.Range(0,3)], EnemyBirthLocal[i].position, Quaternion.identity);
nav[i] = enemy[i].AddComponent<NavMeshAgent>();
enemy[i].transform.localScale = vec;
enemyLoc[i] = enemy[i].transform.position;
//获取角色的Animator组件
ani[i] = enemy[i].GetComponent<Animator>();
}
}
2、给敌人添加寻路和动画
- 在游戏场景中再次创建三个空物体,各自与敌人出生点连成一条线,使敌人在此之间来回巡逻,直到在视角内发现角色位置,将寻路目标更改为角色,并在距离角色n米的时候进行攻击。
- 如何来回巡逻和播放:创建一个Vector3变量用于存储当前游戏物体的位置,在下一帧时,用此变量和当前游戏物体的位置进行Distance距离判断,若是距离为0,说明位置是没有进行变换的,此时让游戏物体循环播放待机动画;当距离发生不等于0,则说明游戏物体是在运动当中,此时播放行走动画。巡逻;让游戏物体的position分别与角色出生点和巡逻终点进行比较,若是距离小于0.5f,则让角色物体朝向另一个点寻路。既然是巡逻,那么游戏物体到达一个点之后是会等待一段时间再回到原来的点等待一段时间,如此反复,也为了减少性能的消耗(不让距离的判断每帧都在做);我们使用协程进行等待。
代码如下(GenerateEnemy脚本;仅供参考):
private IEnumerator NavFindRoad()
{
int num = IsFindRole();
bool jude = false;
for (int x = 0; x < 3; x++)
{
if (findNum[x] == num)
{
jude = true;
}
}
if (!jude && num != -1)
{
findNum[num] = num;
jude = false;
}
for (int i = 0; i < nav.Count; i++)
{
if (findNum[i] != i)
{
//Debug.Log(Vector3.Distance(enemy[i].transform.position, EnemyBirthLocal[i].position));
if (Vector3.Distance(enemy[i].transform.position, EnemyBirthLocal[i]