用网站做邮箱,河北网站建设和运营,微信公众号推广目的,中山一站式营销推广平台最终效果 系列导航 文章目录 最终效果系列导航前言方法一、使用excel配置表excel转txt文本读取txt数据按配置信息生成僵尸 方法二、使用ScriptableObject 配置关卡信息源码结束语 前言
本节主要是推荐两种实现配置关卡信息#xff0c;并按表生成僵尸和关卡波次
方法一、使用…最终效果 系列导航 文章目录 最终效果系列导航前言方法一、使用excel配置表excel转txt文本读取txt数据按配置信息生成僵尸 方法二、使用ScriptableObject 配置关卡信息源码结束语 前言
本节主要是推荐两种实现配置关卡信息并按表生成僵尸和关卡波次
方法一、使用excel配置表 前面我们只是简单的随机生成僵尸实际关卡编辑肯定不可能按这种方式这里教大家一个读取excel配置表的方法具体可以参考我之前的文章这里就不过多介绍了【unity小技巧】unity读excel配置表操作excel转txt文本并读取txt文本内容实例说明 excel转txt文本
比如配置表大概样式 level.xlsx
转换为txt文本后效果
读取txt数据
新增GameConfigData游戏配置表类每个对象对应一个txt配置表
public class GameConfigData
{// 存储配置表中的所有数据private ListDictionarystring, string dataDic;// 构造函数参数为字符串public GameConfigData(string str){// 初始化数据字典dataDic new ListDictionarystring, string();// 按换行符切割字符串string[] lines str.Split(\n);// 第一行是存储数据的类型string[] title lines[0].Trim().Split(\t);//tab切割// 从第三行下标为2开始遍历数据第二行数据是解释说明for (int i 2; i lines.Length; i){// 创建新的字典存储每行数据Dictionarystring, string dic new Dictionarystring, string();// 按tab切割每行数据string[] tempArr lines[i].Trim().Split(\t);// 将切割后的数据添加到字典中for (int j 0; j tempArr.Length; j){dic.Add(title[j], tempArr[j]);}// 将字典添加到数据列表中dataDic.Add(dic);}}// 获取所有行的数据public ListDictionarystring, string GetLines(){return dataDic;}// 根据ID获取一行数据public Dictionarystring, string GetOneById(string id){// 遍历数据列表for (int i 0; i dataDic.Count; i){// 获取当前字典Dictionarystring, string dic dataDic[i];// 如果字典中的ID与参数相同返回该字典if (dic[Id] id){return dic;}}// 如果没有找到返回nullreturn null;}// 根据levelId获取数据public ListDictionarystring, string GetListByLevelId(string levelId){ListDictionarystring, string levelList new ListDictionarystring, string();// 遍历数据列表for (int i 0; i dataDic.Count; i){// 获取当前字典Dictionarystring, string dic dataDic[i];// 如果字典中的levelID与参数相同if (dic[levelID] levelId){// 将字典添加到数据列表中levelList.Add(dic);}}return levelList;}
}新增GameConfigManager代码如下
// 游戏配置管理类
public class GameConfigManager
{public static GameConfigManager Instance new GameConfigManager();private GameConfigData levelData;//关卡数据// 文本资源private TextAsset textAsset;// 初始化配置文件txt文件 存储到内存public void Init(){// 加载关卡数据textAsset Resources.LoadTextAsset(Data/level);levelData new GameConfigData(textAsset.text);}// 获取关卡行数据public ListDictionarystring, string GetLevelLines(){return levelData.GetLines();}// 根据ID获取关卡数据public Dictionarystring, string GetLevelById(string id){return levelData.GetOneById(id);}//根据关卡id获取数据public ListDictionarystring, string GetLevelList(string levelId){return levelData.GetListByLevelId(levelId);}
}按配置信息生成僵尸
修改GameManager初始化配置表信息并获取当前关卡数据
public int curLevelId 1; //当前关卡
public int curProgressId 1;//当前进度
public ListDictionarystring, string listData;//当前关卡数据private void Awake()
{Instance this;//初始化配置表GameConfigManager.Instance.Init();//获取当前关卡数据listData GameConfigManager.Instance.GetLevelList(curLevelId.ToString());
}修改GenerateZombies调用配置表信息并使用
public class GenerateZombies : MonoBehaviour
{public static GenerateZombies Instance { get; private set; }public ListGameObject curProgressZombie;//保存当前进度的敌人int zOrderIndex 0;//排序private void Awake(){Instance this;}private void Start(){curProgressZombie new ListGameObject();TableCreateZombie();}//生成僵尸private void TableCreateZombie(){//判断是否是最后一波敌人如果表格中当前进度没有可以创建的敌人及游戏胜利bool canCreate false;//获取当前关卡数据GameManager.Instance.listData.ForEach(data {//属于当前进度的僵尸if (data[progressId] GameManager.Instance.curProgressId.ToString()){//延迟一段时间创建僵尸StartCoroutine(ITableCreateZombie(data));//代表当前进度有敌人canCreate true;}});if(!canCreate){StopAllCoroutines();//停止所有的携程//TODO:游戏胜利处理Debug.Log(游戏胜利);}}IEnumerator ITableCreateZombie(Dictionarystring, string levelItem){yield return new WaitForSeconds(float.Parse(levelItem[createTime]));//加载预制件从Resources文件夹中加载例如Zombie1GameObject zombiePrefab Resources.Load(Prefabs/Enemy/Zombie levelItem[zombieType]) as GameObject;//生成僵尸实例GameObject zombie Instantiate(zombiePrefab);//根据配表的生成位置找到父物体Transform zombieLine transform.GetChild(int.Parse(levelItem[bornPos]));zombie.transform.parent zombieLine;zombie.transform.localPosition Vector3.zero;zombie.GetComponentSpriteRenderer().sortingOrder zOrderIndex;zOrderIndex ;curProgressZombie.Add(zombie);}//消灭敌人public void ZombieDied(GameObject gameObject){if(curProgressZombie.Contains(gameObject)){curProgressZombie.Remove(gameObject);}//当前进度的僵尸全部消灭了开启下一个进度if(curProgressZombie.Count 0){GameManager.Instance.curProgressId 1;TableCreateZombie();}}
}修改Zombie里的OnDie方法消灭敌人时调用下面代码控制游戏进度变化
GenerateZombies.Instance.ZombieDied(gameObject);记得配置敌人信息
效果可以看到僵尸按配置表在指定位置逐渐生成
方法二、使用ScriptableObject 配置关卡信息
前面的excel转txt配置表使用比较方便如果你觉得太复杂并不理解他的用法。那也没关系这里推荐另一种方法使用ScriptableObject 做配置关卡信息省去了读excel和txt的步骤也能实现一样的效果
新增LevelData
using System.Collections.Generic;
using UnityEngine;[CreateAssetMenu(fileName LevelData, menuName LevelData, order 0)]
public class LevelData : ScriptableObject {// 存储关卡数据的列表public ListLevelItem levelDataList new ListLevelItem();
}// 表示单个关卡的数据
[System.Serializable]
public class LevelItem {public int id; // 关卡IDpublic int levelId; // 等级IDpublic int progressId; // 进度IDpublic int createTime; // 创建时间public int zombieType; // 僵尸类型public int bornPos; // 出生位置// 自定义的ToString方法用于返回关键信息的字符串表示overridepublic string ToString(){return [id]: id.ToString();}
}配置和excel表基本一样然后再去获取这个LevelData 使用即可使用方法和前面类似这里就不多介绍了
源码
源码不出意外的话我会放在最后一节
结束语
赠人玫瑰手有余香如果文章内容对你有所帮助请不要吝啬你的点赞评论和关注以便我第一时间收到反馈你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法也欢迎评论私信告诉我哦
好了我是向宇https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者出于兴趣爱好最近开始自学unity闲暇之余边学习边记录分享站在巨人的肩膀上通过学习前辈们的经验总是会给我很多帮助和启发php是工作unity是生活如果你遇到任何问题也欢迎你评论私信找我 虽然有些问题我也不一定会但是我会查阅各方资料争取给出最好的建议希望可以帮助更多想学编程的人共勉~