返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 2211|回复: 0

[原创] 英雄无敌项目-敌人生成器、路线C#类

[复制链接]
发表于 2021-5-18 17:09:58 | 显示全部楼层 |阅读模式

少侠不来段修仙之旅吗~

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
//敌人生成器类,提供敌人生成的各种功能--重点模块
//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);
    }
}


 楼主| 发表于 2021-5-18 17:13:02 | 显示全部楼层
//路线类,不用继承Unity,可以单独使用的C#工具类,主要功能:获取路线下具体的路线节点位置
//WayLine.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 路线类
/// </summary>
public class WayLine
{
    /// <summary>
    /// 路点数组
    /// </summary>
    public Vector3[] Vector3Var { get; set; }

    /// <summary>
    /// 当前路点是否可用,默认是false,所有逻辑要取反
    /// </summary>
    public bool IsWayLineUsable { get; set; }

    //构造函数,根据实参,初始化路点数组,并将此对象的可用状态变为true
    public WayLine(int WayLinePoints)
    {
        Vector3Var = new Vector3[WayLinePoints];
        IsWayLineUsable = true;
    }


    /// <summary>
    /// 获取路线下具体的路线节点位置
    /// </summary>
    /// <param name="WayLine">一个路线形参</param>
    public void GetWayLineToWayLineNode(GameObject WayLine)
    {
        Vector3Var = new Vector3[WayLine.transform.childCount];
        for (int i = 0; i < WayLine.transform.childCount; i++)
        {
            Vector3Var[i] = WayLine.transform.GetChild(i).position;
        }
    }



}


回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-1 00:00:59 | 显示全部楼层
//更新于20220430
//CollSpawn.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 敌人路线生成根据触发碰撞器启动
/// </summary>
public class CollSpawn : MonoBehaviour
{
    //定义需要禁用启用的路线游戏对象
    public GameObject WayLineGameObj;

    private void OnTriggerEnter(Collider other)
    {
        //判定主角是否进入敌人生成区
        if (other.tag=="Player")
        {
            print("敌人要来啦");

            //启用敌人路线,生成敌人
            WayLineGameObj.SetActive(true);

            //启用后,就把这个脚本去掉,免得浪费资源
            Destroy(this.GetComponent<CollSpawn>());
        }
    }
}


回复 支持 反对

使用道具 举报

游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表