(一) 设置可行走路线:
(二)由于每一路小兵是按照自己的路线进行寻路的,所以我们把设置好的路线进行分层
(三)所有的路都设置为静态对象,然后开始烘焙
(四)设置小兵寻路的层级,通过这个层级指定小兵走哪条路
所以后面设置小兵行走路线的时候传的是Int值
(五) 创建枚举类型来区分小兵类型
using UnityEngine;
using System.Collections;
public enum SoldierType{
soldier1=0,//我方小兵
soldier2=1//敌方小兵
}
(六)创建小兵自身的控制类
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;
public int type=0;
// 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;
}
//设置小兵行走的路
public void SetRoad(int road)
{
nav = GetComponent<NavMeshAgent>();
nav.areaMask = road;
}
}
(七)创建生成小兵的管理类
using UnityEngine;
using System.Collections;
public class CreatSoldier : MonoBehaviour {
[SerializeField]
GameObject soliderPrefab;
//我方小兵生成点有3个
[SerializeField]
Transform[] Start1;
//敌方小兵生成点也有3个
[SerializeField]
Transform[] Start2;
[SerializeField]
Transform soliderParent;
//是否生成小兵默认为true
bool isCreateSolider = true;
//生成小兵的数量
public int soliderCount=2;
//定义敌方需要去的3个路线
[SerializeField]
private Transform[] middleTowers;
[SerializeField]
private Transform[] LeftTowers;
[SerializeField]
private Transform[] RightTowers;
//定义我方需要去的3个路线
[SerializeField]
private Transform[] middleEnemyTowers;
[SerializeField]
private Transform[] LeftEnemyTowers;
[SerializeField]
private Transform[] RightEnemyTowers;
private void Start()
{
StartCoroutine(Create(0,1,5));
}
//协程生成一波一波小兵
/// <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++)
{
//1 << 3 表示2的3次方,指的是中路
CreateSmartSolider(SoldierType.soldier1, Start1[0], middleEnemyTowers, 1 << 3);//中路我方小兵
CreateSmartSolider(SoldierType.soldier2, Start2[0], middleTowers, 1 << 3);//中路敌方小兵
CreateSmartSolider(SoldierType.soldier1, Start1[1], LeftEnemyTowers, 1 << 4);//(左)路我方小兵
CreateSmartSolider(SoldierType.soldier2, Start2[1], LeftTowers, 1 << 4);//(左)路敌方小兵
CreateSmartSolider(SoldierType.soldier1, Start1[2], RightEnemyTowers, 1 << 5);//(右)路我方小兵
CreateSmartSolider(SoldierType.soldier2, Start2[2], RightTowers, 1 << 5);//(右)路敌方小兵
yield return new WaitForSeconds(delyTime);
}
//等待下一波小兵生成的时间
yield return new WaitForSeconds(spwanTime);
}
}
//生成一个小兵
/// <summary>
/// 生成小兵的类型
/// 小兵生成的位置
/// 小兵需要到达的目标点
/// 小兵需要走哪条路
/// </summary>
/// <param name="startTran"></param>
/// <param name="towers"></param>
void CreateSmartSolider(SoldierType soldierType, Transform startTran, Transform[] towers,int road)
{
GameObject obj = Instantiate(soliderPrefab, startTran.position, Quaternion.identity) as GameObject;
obj.transform.parent = soliderParent;//生成的小兵指定父物体
//给生成的小兵指定目标点对象,
SmartSolider solider = obj.GetComponent<SmartSolider>();
solider.towers = towers;
solider.SetRoad(road);
solider.type = (int)soldierType;
}
}
首先创建敌我小兵各3个共6个生成点,空物体表示生成位置,