//敌人生成器类,提供敌人生成的各种功能--重点模块
//EnemySpawn.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 敌人生成类,此脚本挂在路线根目录上
/// </summary>
public class EnemySpawn : MonoBehaviour
{
/// <summary>
/// 敌人类型,public可用代表可以直接在Unity面板上拖拽游戏资源物体,注意数据类型是gameobject
/// </summary>
public GameObject[] EnemyType;//需要创建的敌人预制件组
//敌人最大数
public int MaxEmemyCount=5;
//游戏开始时敌人出现的数量
public int StartEnemyCount=2;
//计算敌人已经出现的数量,一开始默认为0
private static int EnemyAppearCount;
//保存路线有多少条
public WayLine[] WayLineArray;
//声明敌人延迟最大时间变量
private float EnemySpawnTimeDelay=10;
//可用路线集合
List<WayLine> UseWayLine;
//获取到的路线对象
private WayLine EnemySpawnWayLine;
private void Start()
{
GetWayLinePointsFF();
//开始游戏自动生成两个敌人
for (int i = 0; i < StartEnemyCount; i++)
{
EnemyOnlySpawnDelay();
}
//初始化路线集合
UseWayLine = new List<WayLine>(WayLineArray.Length);
}
//获取路线的路点
private void GetWayLinePointsFF()
{
//存储路线数组初始化
//WayLineArray = new GameObject[this.transform.childCount];
WayLineArray = new WayLine[this.transform.childCount];
//获取路线根目录下的子物体的WayLine类型并赋值存储路线数组,第二for循环是获取路线下的具体路点坐标
for (int WC = 0; WC < this.transform.childCount; WC++)
{
//创建存储路线数组路线对象
WayLineArray[WC] = new WayLine(this.transform.GetChild(WC).childCount);
//创建存储路线数组对应的每个路线的路点对象,初始化,已提取在WayLine类的构造函数中
//WayLineArray[WC].Vector3Var = new Vector3[this.transform.GetChild(WC).childCount];
//为每一个路点赋值
for (int NC = 0; NC < this.transform.GetChild(WC).childCount; NC++)
{
WayLineArray[WC].Vector3Var[NC] = this.transform.GetChild(WC).GetChild(NC).position;
}
}
}
/// <summary>
/// 查找可用路线的方法
/// </summary>
public WayLine[] SelectWayLine()
{
//选择一条可以使用的路线--自己写的
//随机选取一条路线
/*
int WayLineRange = Random.Range(0, 2);
if (WayLineArray[WayLineRange].IsWayLineUsable == true)
{
//当前路点转换成不可用状态
WayLineArray[WayLineRange].IsWayLineUsable = false;
EnemyOnlySpawn(WayLineRange);
}
else SelectWayLine();
*/
foreach (var item in WayLineArray)
{
if (item.IsWayLineUsable == true) UseWayLine.Add(item);
}
return UseWayLine.ToArray();
}
//在可用路线中,获取到一条路线
private WayLine UseOnlyWayLine(WayLine[] UseWayLine)
{
return UseWayLine[Random.Range(0, UseWayLine.Length)];
}
/// <summary>
/// 延时敌人的方法,调用生成敌人方法
/// </summary>
public void EnemyOnlySpawnDelay()
{
//如果敌人没有超过5个总数则可以继续创建
if (EnemyAppearCount<=5)
{
print(EnemyAppearCount);
//延迟时间,延迟时间范围:1秒-延迟最大时间
Invoke("EnemyOnlySpawnFF", Random.Range(1, EnemySpawnTimeDelay));
}
else
{
print("敌人创建上限了");
}
}
//生成一个敌人的方法
private void EnemyOnlySpawnFF()
{
//获取到路线
EnemySpawnWayLine = UseOnlyWayLine(SelectWayLine());
//使用Object.Instantiate克隆一个物体,这里例子使用为创建一个敌人
GameObject EnemyOnly = Object.Instantiate(this.EnemyType[Random.Range(0, this.EnemyType.Length)], EnemySpawnWayLine.Vector3Var[0], Quaternion.identity) as GameObject;
//GameObject EnemyOnly = Object.Instantiate(this.EnemyType[0], EnemySpawnWayLine.Vector3Var[0], Quaternion.identity) as GameObject;
//Object.Instantiate(敌人参数,位置,旋转角度(不旋转参此数填写Quaternion.identity));
//配置敌人信息
EnemyMove EnemyMoveVar = EnemyOnly.GetComponent<EnemyMove>();
EnemyMoveVar.wayline = EnemySpawnWayLine;
EnemySpawnWayLine.IsWayLineUsable = false;
print("成功生成敌人,敌人类型:" + EnemyOnly.name); //测试语句,打印出敌人的名字信息
//每生成一个敌人,敌人总数则加1
EnemyAppearCount++;
//传递生成本敌人的生成器引用给敌人信息类[以后建议使用委托代替]
EnemyOnly.GetComponent<EnemyInfo>().enemyspawn = this;
}
//敌人死亡时增加回路线方法
public void EnemyDeadWayLineAddFF()
{
EnemySpawnWayLine.IsWayLineUsable = true;
UseWayLine.Add(EnemySpawnWayLine);
}
}
|