首先创建可行走的路径进行静态导航烘焙
烘焙结果:
烘焙好路线之后,让小兵行走,我们在生成小兵时告知小兵行走的目标点,这个小兵是我方小兵,所以行走目标点是敌方塔:脚本如下:
小兵身上脚本:
using UnityEngine;
using System.Collections;
public class CreatSoldier : MonoBehaviour {
[SerializeField]
GameObject soliderPrefab;
[SerializeField]
Transform startTran;
[SerializeField]
Transform soliderParent;
//是否生成小兵默认为true
bool isCreateSolider = true;
//生成小兵的数量
public int soliderCount;
//虽然目标点对象不能直接托给预制体,但是可以在创建预制体的时候给他赋值
[SerializeField]
Transform[] towers;
private void Start()
{
StartCoroutine(Create(0,1,5));
}
//生成一个小兵
/// <summary>
/// 小兵生成的位置
/// 小兵需要到达的目标点
/// </summary>
/// <param name="startTran"></param>
/// <param name="towers"></param>
void CreateSmartSolider(Transform startTran ,Transform[] towers)
{
GameObject obj= Instantiate(soliderPrefab, startTran.position,Quaternion.identity)as GameObject;
obj.transform.parent = soliderParent;//生成的小兵指定父物体
//给生成的小兵指定目标点对象,
SmartSolider solider = obj.GetComponent<SmartSolider>();
solider.towers = towers;
}
//协程生成一波一波小兵
/// <summary>
/// </summary>
/// <param name="time">游戏开始后几秒开始生成士兵</param>
/// <param name="delyTime">同一波内两个小兵生成的间隔</param>
/// <param spwanTime="">下一波小兵生成的时间间隔</param>
/// <returns></returns>
IEnumerator Create(float time,float delyTime,float spwanTime)
{
yield return new WaitForSeconds(time);
while (isCreateSolider)
{
//一个for循环代表一波小兵
for (int i=0;i<soliderCount;i++)
{
CreateSmartSolider(startTran,towers);
yield return new WaitForSeconds(delyTime);
}
//等待下一波小兵生成的时间
yield return new WaitForSeconds(spwanTime);
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class SmartSolider : MonoBehaviour {
public Transform target;
private Animation ani;
private NavMeshAgent nav;
public Transform[] towers;
// Use this for initialization
void Start () {
nav = GetComponent<NavMeshAgent>();
ani = GetComponent<Animation>();
}
// Update is called once per frame
void Update () {
SoliderMove();
}
void SoliderMove()
{
if (target==null)
{
//目标点为空,需要寻找一下目标点
target = GetTarget();
return;
}
ani.CrossFade("Run");
nav.SetDestination(target.position);
}
//假如小兵跑向的目标点是塔
Transform GetTarget()
{
for (int i=0;i<towers.Length;i++)
{
if (towers[i]!=null)
{
return towers[i];
}
}
return null;
}
}