18.游戏场景-出怪点逻辑
18.1 知识点
创建MonsterPoint怪物生成点脚本,继承Monobehaviour。场景中创建特效对象作为怪物生成点对象,挂载MonsterPoint脚本。
定义记录怪物的总波数,每波怪物的数量,当前波次还有多少怪物没有生成变量。定义存储可用的怪物ID列表,用于随机选择要生成的怪物。定义记录当前波次要生成的怪物ID,单只怪物生成的时间间隔,波与波之间的间隔时间,第一波怪物生成的延迟时间变量。
//怪物有多少波
public int maxWave;
//每波怪物有多少只
public int monsterNumOneWave;
//用于记录 当前波的怪物还有多少只没有创建
private int nowNum;
//怪物ID 允许有多个 这样就可以随机创建不同的怪物 更具多样性
public List<int> monsterIDs;
//用于记录 当前波 要创建什么ID的怪物
private int nowID;
//单只怪物创建间隔时间
public float createOffsetTime;
//波与波之间的间隔时间
public float delayTime;
//第一波怪物创建的间隔时间
public float firstDelayTime;
配置各个出怪点对象上的MonsterPoint脚本数据
定义创建怪物方法。取出当前id下的怪物信息数据,根据怪物信息的路径生成对应怪物预制体。为新生成的怪物预制体添加MonsterObject脚本,对MonsterObject脚本进行初始化,传入当前怪物信息。创建完怪物后当前波数的怪物数量减一。判断当前波的怪物为不为0,为0延迟执行创建波数方法,不为0延迟执行创建怪物方法。
/// <summary>
/// 创建怪物
/// </summary>
private void CreateMonster()
{
//直接创建怪物
//取出怪物数据
MonsterInfo info = GameDataMgr.Instance.monsterInfoList[nowID - 1];
//创建怪物预设体
GameObject obj = Instantiate(Resources.Load<GameObject>(info.res), this.transform.position, Quaternion.identity);
//为我们创建出的怪物预设体 添加怪物脚本 进行初始化
MonsterObject monsterObj = obj.AddComponent<MonsterObject>();
monsterObj.InitInfo(info);
//创建完一只怪物后 减去要创建的怪物数量1
--nowNum;
if( nowNum == 0 )
{
if (maxWave > 0)
Invoke("CreateWave", delayTime);
}
else
{
Invoke("CreateMonster", createOffsetTime);
}
}
定义创建一波怪物的方法,根据配置的怪物id列表,随机出当前波的怪物是什么,赋值当前怪物有多少只,调用创建怪物方法,波数减少一
/// <summary>
/// 开始创建一波的怪物
/// </summary>
private void CreateWave()
{
//得到当前波怪物的ID是什么
nowID = monsterIDs[Random.Range(0, monsterIDs.Count)];
//当前波怪物有多少只
nowNum = monsterNumOneWave;
//创建怪物
CreateMonster();
//减少波数
--maxWave;
}
Star中延迟执行创建一波怪物的方法
void Start()
{
Invoke("CreateWave", firstDelayTime);
}
定义判断出怪点时候结束的方法,判断波数和当前波怪物数是否都为0
/// <summary>
/// 出怪点是否出怪结束
/// </summary>
/// <returns></returns>
public bool CheckOver()
{
return nowNum == 0 && maxWave == 0;
}
18.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MonsterPoint : MonoBehaviour
{
//怪物有多少波
public int maxWave;
//每波怪物有多少只
public int monsterNumOneWave;
//用于记录 当前波的怪物还有多少只没有创建
private int nowNum;
//怪物ID 允许有多个 这样就可以随机创建不同的怪物 更具多样性
public List<int> monsterIDs;
//用于记录 当前波 要创建什么ID的怪物
private int nowID;
//单只怪物创建间隔时间
public float createOffsetTime;
//波与波之间的间隔时间
public float delayTime;
//第一波怪物创建的间隔时间
public float firstDelayTime;
void Start()
{
Invoke("CreateWave", firstDelayTime);
}
/// <summary>
/// 开始创建一波的怪物
/// </summary>
private void CreateWave()
{
//得到当前波怪物的ID是什么
nowID = monsterIDs[Random.Range(0, monsterIDs.Count)];
//当前波怪物有多少只
nowNum = monsterNumOneWave;
//创建怪物
CreateMonster();
//减少波数
--maxWave;
}
/// <summary>
/// 创建怪物
/// </summary>
private void CreateMonster()
{
//直接创建怪物
//取出怪物数据
MonsterInfo info = GameDataMgr.Instance.monsterInfoList[nowID - 1];
//创建怪物预设体
GameObject obj = Instantiate(Resources.Load<GameObject>(info.res), this.transform.position, Quaternion.identity);
//为我们创建出的怪物预设体 添加怪物脚本 进行初始化
MonsterObject monsterObj = obj.AddComponent<MonsterObject>();
monsterObj.InitInfo(info);
//创建完一只怪物后 减去要创建的怪物数量1
--nowNum;
if( nowNum == 0 )
{
if (maxWave > 0)
Invoke("CreateWave", delayTime);
}
else
{
Invoke("CreateMonster", createOffsetTime);
}
}
/// <summary>
/// 出怪点是否出怪结束
/// </summary>
/// <returns></returns>
public bool CheckOver()
{
return nowNum == 0 && maxWave == 0;
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com