////从文件初始化关卡信息(Level) //private void InitLevelModel(ref Dictionary<string, LevelModel> _levelModel, string _path) //{ // if (_levelModel == null) // { // _levelModel = new Dictionary<int, LevelModel>(); // } // RDFileStream.ReadLevelTable(ref _levelModel, _path); //} //从CSV表初始化Dictionary private static Dictionary <string, T> LoadCsvData <T>(string _fileName) { Dictionary <string, T> dic = new Dictionary <string, T>(); /* 从CSV文件读取数据 */ Dictionary <string, Dictionary <string, string> > result = RDFileStream.ReadCsvFile(_fileName); /* 遍历每一行数据 */ foreach (string name in result.Keys) { /* CSV的一行数据 */ Dictionary <string, string> datas = result[name]; /* 读取Csv数据对象的属性 */ PropertyInfo[] props = typeof(T).GetProperties(); /* 使用反射,将CSV文件的数据赋值给CSV数据对象的相应字段,要求CSV文件的字段名和CSV数据对象的字段名完全相同 */ T obj = Activator.CreateInstance <T>(); foreach (PropertyInfo p in props) { ReflectUtil.PiSetValue <T>(datas[p.Name], p, obj); } /* 按name-数据的形式存储 */ dic[name] = obj; } return(dic); }
//从level文件读取Level public void LoadLevel(string _levelName) { LevelInfo level = RDFileStream.ReadLevelFile(_levelName); if (!level.IsEmpty()) { nowLevelName = level.name; levelNameInputField.GetComponent <InputField>().text = level.name; makerNameInputField.GetComponent <InputField>().text = level.producer; foreach (TileInfo tile in level.tiles) { GameObject obj = Instantiate(tilePrefabs[tile.name], tile.position, tile.rotation); if (obj.GetComponent <Collider2D>()) { obj.GetComponent <Collider2D>().enabled = false; } if (obj.GetComponent <ILevelEditor>() != null) { obj.GetComponent <ILevelEditor>().Sleep(); } obj.transform.localScale = tile.scale; obj.transform.SetParent(GetLayerObject(tile.layer).transform); tile.tileObjcet = obj; //int width = obj.GetComponent<PublicProperties>().width; //int height = obj.GetComponent<PublicProperties>().height; //Vector3 pos = GetTileBottomLetfPosition(obj, width, height); SetTileInfo(tile.position, tile.name, obj, tile.layer); } } }
//加载TilePrefabs void InitTilePrefabs() { Dictionary <string, AssetBundle> assest = RDFileStream.ReadAllAssestBudle(); foreach (string key in PublicDataManager.instance.GetSceneTileModelKeys()) { string levelType = PublicDataManager.instance.GetSceneTileLevelType(key); GameObject prefab = assest[levelType].LoadAsset <GameObject>(PublicDataManager.instance.GetSceneTileName(key)); tilePrefabs.Add(key, prefab); } }
/*读写Level*/ //保存地图 public void SaveLevel() { nowLevelName = levelNameInputField.text; if (nowLevelName == string.Empty) { //请输入关卡名 return; } nowMakerName = makerNameInputField.text; if (nowMakerName == string.Empty) { //请输入制作者名 return; } LevelInfo level = new LevelInfo(); level.name = nowLevelName; level.name = nowLevelName; level.producer = nowMakerName; foreach (int key in tileInfos.Keys) { foreach (TileInfo tile in tileInfos[key]) { if (!tile.isEmpty) { level.tiles.Add(tile); } } } RDFileStream.WriteLevelFile(level); //存取封面 //写入CSV }
// Use this for initialization static void CreatPrefabAndBuildAssetBundles() { List <AssetBundleBuild> assestBuildMap = new List <AssetBundleBuild>(); //AssetBundel Map List <string> assestPathList = new List <string>(); //Assest路径+文件名 List <SceneTileModel> sceneTileModelList = new List <SceneTileModel>(); int lastId = RDFileStream.ReadCsvFile("SceneTile.csv").Count; GameObject root = GameObject.Find("Root"); foreach (Transform levelTheme in root.transform) { //清空上一场景AssestPath assestPathList.Clear(); AssetBundleBuild assetBundle = new AssetBundleBuild(); //以关卡类型命名 assetBundle.assetBundleName = levelTheme.name + ".package"; if (levelTheme.gameObject.activeSelf) { //路径:Assets/Prefabs/Scene/关卡类型名/prefab名.prefab string prefabPath = "Assets/Prefabs/Scene/" + levelTheme.name + "/"; if (!Directory.Exists(prefabPath)) { Directory.CreateDirectory(prefabPath); } foreach (Transform tile in levelTheme) { if (tile.gameObject.activeSelf) { string prefabFullPath = prefabPath + tile.name + ".prefab"; //创建prefab Object prefab = PrefabUtility.CreatePrefab(prefabFullPath, tile.gameObject); PrefabUtility.ReplacePrefab(tile.gameObject, prefab, ReplacePrefabOptions.ConnectToPrefab); //增加到assestPath assestPathList.Add(prefabFullPath); //创建CSV表-行 SceneTileModel row = new SceneTileModel(); row.name = tile.name; row.type = tile.gameObject.isStatic ? 1 : 2; row.levelType = levelTheme.name; sceneTileModelList.Add(row); } } assetBundle.assetNames = assestPathList.ToArray(); if (assetBundle.assetNames.Length > 0) { assestBuildMap.Add(assetBundle); } } } if (sceneTileModelList.Count > 0) { RDFileStream.WriteCsvFile("SceneTile.csv", sceneTileModelList.ToArray()); sceneTileModelList.Clear(); } if (assestBuildMap.Count > 0) { //AssestBundle路径:StreamingAssets/AssestBundles BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath + "/AssestBundles", assestBuildMap.ToArray(), BuildAssetBundleOptions.None, RDPlatform.isOSXEditor ? BuildTarget.StandaloneOSX : BuildTarget.StandaloneWindows); Debug.Log("Success"); } }