18.出怪点逻辑

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

×

喜欢就点赞,疼爱就打赏