894 lines
33 KiB
C#
894 lines
33 KiB
C#
using SceneEditor.Proxy.Editor;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Text;
|
||
using Thousandto.Cfg.Data;
|
||
using Thousandto.Code.Logic;
|
||
using Thousandto.Core.Base;
|
||
using UnityEditor;
|
||
|
||
namespace Thousandto.Package
|
||
{
|
||
/// <summary>
|
||
/// 生成fls文件的工具类, 暂时不用
|
||
/// </summary>
|
||
public class FlsUtils
|
||
{
|
||
public static string SubFlsRoot = "../SubResource/FLS/";
|
||
#if UNITY_ANDROID
|
||
public static string SubAllRoot = "../SubResource/Android/ResAll/";
|
||
static string _subResRoot = "../SubResource/Android/ResAll/GameAssets/Resources/";
|
||
#elif UNITY_IPHONE
|
||
public static string SubAllRoot = "../SubResource/IOS/ResAll/";
|
||
static string _subResRoot = "../SubResource/IOS/ResAll/GameAssets/Resources/";
|
||
#elif UNITY_WEBPLAYER
|
||
public static string SubAllRoot = "../SubResource/WebPlayer/ResAll/";
|
||
static string _subResRoot = "../SubResource/WebPlayer/ResAll/GameAssets/Resources/";
|
||
#else //windows
|
||
public static string SubAllRoot = "../SubResource/Windows/ResAll/";
|
||
static string _subResRoot = "../SubResource/Windows/ResAll/GameAssets/Resources/";
|
||
#endif
|
||
static string _assetRoot = "Assets/GameAssets/Resources/";
|
||
static string _cinematicPath = "Cinematics";
|
||
static string _lanStr = LanguageConstDefine.KR;
|
||
|
||
//默认3段
|
||
static int _partialCount = 3;
|
||
|
||
public static void Build(string lan)
|
||
{
|
||
_lanStr = lan;
|
||
Start();
|
||
}
|
||
|
||
public static void Start()
|
||
{
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "", 0);
|
||
var oldFlsList = Utils.GetFiles(SubFlsRoot, "*.fls", SearchOption.TopDirectoryOnly, PkgConstDefine.CommonExceptionEx);
|
||
foreach (string oldFls in oldFlsList)
|
||
{
|
||
string parent = Path.GetDirectoryName(oldFls);
|
||
if (!parent.EndsWith("FLS"))
|
||
{
|
||
continue;
|
||
}
|
||
File.Delete(oldFls);
|
||
}
|
||
|
||
//删除旧的分段资源
|
||
Utils.DeleteFileOrDir(string.Format("../SubResource/{0}/Res1", PackageManager.GetSourceDirByBuildTarget()));
|
||
Utils.DeleteFileOrDir(string.Format("../SubResource/{0}/Res2", PackageManager.GetSourceDirByBuildTarget()));
|
||
Utils.DeleteFileOrDir(string.Format("../SubResource/{0}/Res3", PackageManager.GetSourceDirByBuildTarget()));
|
||
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "", 0.3f);
|
||
|
||
//这里开始自动分fls
|
||
work();
|
||
|
||
//拷贝fls0到FLS目录
|
||
string fls0 = SubFlsRoot + _lanStr + "/fls0.fls";
|
||
if (File.Exists(fls0))
|
||
File.Copy(fls0, SubFlsRoot + "fls0.fls");
|
||
|
||
//拷贝fls.fls到上一级目录
|
||
string fls = SubFlsRoot + _lanStr + "/fls.fls";
|
||
if (File.Exists(fls))
|
||
File.Copy(fls, SubFlsRoot + "fls.fls");
|
||
|
||
var newFlsList = Utils.GetFiles(SubFlsRoot, "*.fls", SearchOption.TopDirectoryOnly, PkgConstDefine.CommonExceptionEx);
|
||
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "拷贝分段资源到对应目录", 0.9f);
|
||
//下面是拷贝资源到分段资源路径
|
||
//foreach (string newFls in newFlsList)
|
||
//{
|
||
// string flsName = Path.GetFileNameWithoutExtension(newFls);
|
||
// string copyToDir = string.Format("../SubResource/{0}/", PackageManager.GetSourceDirByBuildTarget());
|
||
// if (flsName == "fls1")
|
||
// {
|
||
// copyToDir += "Res1";
|
||
// }
|
||
// else if (flsName == "fls2")
|
||
// {
|
||
// copyToDir += "Res2";
|
||
// }
|
||
// else if (flsName == "fls3")
|
||
// {
|
||
// copyToDir += "Res3";
|
||
// }
|
||
|
||
// var fileListInFls = File.ReadAllLines(newFls);
|
||
// //从1开始,第一行是描述
|
||
// for (int i = 0; i < fileListInFls.Length; ++i )
|
||
// {
|
||
// if (fileListInFls[i].IndexOf(",") != -1)
|
||
// continue;
|
||
|
||
// string sourceFile = SubAllRoot + fileListInFls[i];
|
||
// string toFile = copyToDir + "/" + fileListInFls[i];
|
||
// string toDir = toFile.Substring(0, toFile.LastIndexOf("/"));
|
||
// if (!Directory.Exists(toDir))
|
||
// {
|
||
// Directory.CreateDirectory(toDir);
|
||
// }
|
||
// if (File.Exists(sourceFile))
|
||
// {
|
||
// if (Path.GetFullPath(sourceFile) == Path.GetFullPath(toFile)) continue;
|
||
// File.Copy(sourceFile, toFile, true);
|
||
// }
|
||
// }
|
||
//}
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "完成", 1.0f);
|
||
EditorUtility.ClearProgressBar();
|
||
}
|
||
|
||
private static void work()
|
||
{
|
||
LuaDataConverter.Load();
|
||
var sceneCfgFileList = Utils.GetFiles(SubFlsRoot + _lanStr, "*.scene", SearchOption.TopDirectoryOnly);
|
||
for (int i = 0; i < sceneCfgFileList.Count; ++i)
|
||
{
|
||
combineFls(sceneCfgFileList[i]);
|
||
}
|
||
}
|
||
|
||
public static void Test2()
|
||
{
|
||
LuaDataConverter.Load();
|
||
var itor = DeclareMapsetting.CacheData.Values.GetEnumerator();
|
||
while (itor.MoveNext())
|
||
{
|
||
var mapID = itor.Current.MapId;
|
||
string mapName = itor.Current.LevelName;
|
||
var fileList = addDependenceRes(mapID);
|
||
string filePath = SubFlsRoot + mapID + ".txt";
|
||
File.WriteAllLines(filePath, fileList.ToArray());
|
||
UnityEngine.Debug.LogError("生成场景关联文件列表: " + filePath);
|
||
}
|
||
|
||
EditorUtility.ClearProgressBar();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 根据MapSetting表生成资源列表
|
||
/// </summary>
|
||
public static void GenResListByMapSetting()
|
||
{
|
||
Dictionary<string, List<string>> mapDict = new Dictionary<string, List<string>>();
|
||
mapDict.Clear();
|
||
LuaDataConverter.Load();
|
||
var itor = DeclareMapsetting.CacheData.Values.GetEnumerator();
|
||
while (itor.MoveNext())
|
||
{
|
||
var mapID = itor.Current.MapId;
|
||
//场景名字
|
||
string mapName = itor.Current.LevelName;
|
||
var fileList = addDependenceRes(mapID);
|
||
if (mapDict.ContainsKey(mapName))
|
||
{
|
||
List<string> pathList = mapDict[mapName];
|
||
for (int i = 0; i < fileList.Count; i++)
|
||
{
|
||
//去掉重复的资源路径
|
||
if (!pathList.Contains(fileList[i]))
|
||
{
|
||
pathList.Add(fileList[i]);
|
||
}
|
||
}
|
||
//再把新增的再保存到字典里面
|
||
mapDict[mapName] = pathList;
|
||
}
|
||
else
|
||
{
|
||
mapDict.Add(mapName, fileList);
|
||
}
|
||
}
|
||
|
||
//遍历场景的资源列表,生成文件
|
||
var iter = mapDict.GetEnumerator();
|
||
while (iter.MoveNext())
|
||
{
|
||
List<string> mapResPathList = iter.Current.Value;
|
||
string filePath = SubFlsRoot + iter.Current.Key + ".txt";
|
||
File.WriteAllLines(filePath, mapResPathList.ToArray());
|
||
UnityEngine.Debug.LogError("根据MapSetting表生成资源列表: " + filePath);
|
||
}
|
||
EditorUtility.ClearProgressBar();
|
||
}
|
||
|
||
//合并.scene和.fls文件到新的fls文件
|
||
private static void combineFls(string sceneFile)
|
||
{
|
||
//场景id列表
|
||
string[] sceneIdArray = File.ReadAllLines(sceneFile);
|
||
//场景关联资源
|
||
List<string> sceneResList = new List<string>();
|
||
for (int i = 0; i < sceneIdArray.Length; ++i)
|
||
{
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "搜索场景关联的资源", 0.5f);
|
||
sceneResList.AddRange(addDependenceRes(sceneIdArray[i]));
|
||
}
|
||
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "收集场景资源", 0.7f);
|
||
|
||
int count = 0;
|
||
long size = 0;
|
||
//去重,并且计算count和size
|
||
var allRes = optimizeList(sceneResList, out count, out size);
|
||
//合并场景资源和默认资源
|
||
string flsFileName = Path.ChangeExtension(sceneFile, "fls");
|
||
combineFlsFile(allRes, flsFileName, ref count, ref size);
|
||
|
||
//合并默认路径
|
||
string flsDir = Path.ChangeExtension(sceneFile, "dir");
|
||
combineFlsDir(allRes, flsDir, ref count, ref size);
|
||
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "合并文件列表", 0.9f);
|
||
|
||
if (allRes.Count > 0)
|
||
{
|
||
//新的fls路径,就是去掉语言路径的默认fls路径
|
||
string saveFlsPath = flsFileName.Replace(_lanStr + "/", "");
|
||
StreamWriter sw = new StreamWriter(saveFlsPath);
|
||
sw.WriteLine(string.Format("{0},{1}", count, size));
|
||
var itor = allRes.GetEnumerator();
|
||
while (itor.MoveNext())
|
||
{
|
||
//还有manifest或者没有后缀,则跳过
|
||
if (itor.Current.IndexOf(".manifest") > 0 || itor.Current.IndexOf(".") == -1 || itor.Current.IndexOf(".meta") > 0)
|
||
continue;
|
||
sw.WriteLine(itor.Current);
|
||
}
|
||
|
||
sw.Close();
|
||
}
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "完成", 1.0f);
|
||
}
|
||
|
||
//读取fls.dir资源
|
||
private static List<string> readFlsDir(string flsDir)
|
||
{
|
||
List<string> resList = new List<string>();
|
||
if (!File.Exists(flsDir))
|
||
{
|
||
return resList;
|
||
}
|
||
|
||
string[] dirList = File.ReadAllLines(flsDir);
|
||
for (int i = 0; i < dirList.Length; ++i)
|
||
{
|
||
string dirPath = SubAllRoot + dirList[i];
|
||
var fileList = Utils.GetFiles(dirPath, "*", SearchOption.AllDirectories);
|
||
foreach (string filePath in fileList)
|
||
{
|
||
resList.Add(filePath.Replace(SubAllRoot, ""));
|
||
}
|
||
}
|
||
|
||
return resList;
|
||
}
|
||
|
||
//合并fls.dir
|
||
private static System.Collections.Generic.HashSet<string> combineFlsDir(System.Collections.Generic.HashSet<string> allRes,
|
||
string flsDirFile, ref int count, ref long size)
|
||
{
|
||
var resList = readFlsDir(flsDirFile);
|
||
|
||
for (int i = 0; i < resList.Count; ++i)
|
||
{
|
||
if (!allRes.Contains(resList[i]))
|
||
{
|
||
string subResPath = SubAllRoot + resList[i];
|
||
//GameCfgData文件要区分语言
|
||
if (resList[i].IndexOf("GameCfgData") >= 0 && resList[i].IndexOf("GameCfgData_" + _lanStr) == -1)
|
||
{
|
||
continue;
|
||
}
|
||
if (File.Exists(subResPath))
|
||
{
|
||
count++;
|
||
size += new FileInfo(subResPath).Length;
|
||
}
|
||
allRes.Add(resList[i]);
|
||
}
|
||
}
|
||
|
||
return allRes;
|
||
}
|
||
|
||
//合并fls.fls
|
||
private static System.Collections.Generic.HashSet<string> combineFlsFile(System.Collections.Generic.HashSet<string> allRes,
|
||
string flsFile, ref int count, ref long size)
|
||
{
|
||
string[] defaultResArray = null;
|
||
//默认存在的fls文件,用来和sceneFile里面场景对应资源进行合并
|
||
if (File.Exists(flsFile))
|
||
{
|
||
defaultResArray = File.ReadAllLines(flsFile);
|
||
}
|
||
|
||
//合并默认内容
|
||
if (defaultResArray != null && defaultResArray.Length > 0)
|
||
{
|
||
//合并size和count,其实这个不准
|
||
string tagLine = defaultResArray[0];
|
||
string[] sizeAndCountArray = tagLine.Split(',');
|
||
count += int.Parse(sizeAndCountArray[0].Trim());
|
||
size += long.Parse(sizeAndCountArray[1].Trim());
|
||
|
||
//合并资源列表
|
||
for (int i = 1; i < defaultResArray.Length; ++i)
|
||
{
|
||
if (!allRes.Contains(defaultResArray[i]))
|
||
{
|
||
allRes.Add(defaultResArray[i]);
|
||
}
|
||
}
|
||
}
|
||
|
||
return allRes;
|
||
}
|
||
|
||
//去重资源列表,计算count和size
|
||
private static System.Collections.Generic.HashSet<string> optimizeList(List<string> sceneResList, out int count, out long size)
|
||
{
|
||
count = 0;
|
||
size = 0;
|
||
System.Collections.Generic.HashSet<string> allRes = new System.Collections.Generic.HashSet<string>();
|
||
for (int i = 0; i < sceneResList.Count; ++i)
|
||
{
|
||
//去重
|
||
if (!string.IsNullOrEmpty(sceneResList[i]) && !allRes.Contains(sceneResList[i]))
|
||
{
|
||
string subResPath = SubAllRoot + sceneResList[i];
|
||
if (File.Exists(subResPath))
|
||
{
|
||
size += (new FileInfo(subResPath)).Length;
|
||
count++;
|
||
}
|
||
else
|
||
{
|
||
UnityEngine.Debug.LogError("自动分FLS: 文件不存在 " + sceneResList[i]);
|
||
}
|
||
allRes.Add(sceneResList[i]);
|
||
}
|
||
}
|
||
|
||
return allRes;
|
||
}
|
||
|
||
|
||
private static List<string> addDependenceRes(string mapIdStr)
|
||
{
|
||
int id = 0;
|
||
if (int.TryParse(mapIdStr, out id))
|
||
{
|
||
return addDependenceRes(id);
|
||
}
|
||
|
||
return new List<string>();
|
||
}
|
||
|
||
private static List<string> addDependenceRes(int mapID)
|
||
{
|
||
DeclareMapsetting mapSetting = DeclareMapsetting.Get(mapID);
|
||
if (mapSetting == null)
|
||
{
|
||
UnityEngine.Debug.LogError("地图id没找到: " + mapID);
|
||
return new List<string>();
|
||
}
|
||
string sceneName = mapSetting.LevelName;
|
||
string sceneMusic = mapSetting.Music;
|
||
var mapInfoData = MapInfoDataReader.LoadSceneObjectData(getResourcePath("MapInfo"), mapSetting.MapInfo);
|
||
UnityEngine.Debug.Log("collect scene:" + sceneName);
|
||
|
||
var monsterResList = new List<string>();
|
||
var npcResList = new List<string>();
|
||
if (mapInfoData != null)
|
||
{
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "收集怪物资源", 0.5f);
|
||
//怪物monster
|
||
var monsterList = mapInfoData.mapMonsterStubs;
|
||
List<int> monsterIDList = new List<int>();
|
||
for (int i = 0; i < monsterList.Count; ++i)
|
||
{
|
||
int monsterID = monsterList[i].m_id;
|
||
if (monsterIDList.Contains(monsterID))
|
||
{
|
||
continue;
|
||
}
|
||
monsterIDList.Add(monsterID);
|
||
}
|
||
|
||
monsterResList = collectMonsterRes(monsterIDList);
|
||
UnityEngine.Debug.Log("monsterResList " + monsterResList.Count);
|
||
//---
|
||
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "收集NPC资源", 0.5f);
|
||
//NPC
|
||
var npcDataList = mapInfoData.mapNpcStubs;
|
||
List<int> npcIDList = new List<int>();
|
||
for (int i = 0; i < npcDataList.Count; ++i)
|
||
{
|
||
int npcID = npcDataList[i].m_id;
|
||
if (npcIDList.Contains(npcID))
|
||
{
|
||
continue;
|
||
}
|
||
npcIDList.Add(npcID);
|
||
}
|
||
|
||
npcResList = collectNPCRes(npcIDList);
|
||
UnityEngine.Debug.Log("npcResList " + npcResList.Count);
|
||
//---
|
||
}
|
||
|
||
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "收集副本资源", 0.5f);
|
||
//cloneMap
|
||
var cloneMaps = collectCloneMapID(mapID);
|
||
var cloneResList = collectCloneMonster(cloneMaps);
|
||
UnityEngine.Debug.Log("cloneResList " + cloneResList.Count);
|
||
//---
|
||
|
||
EditorUtility.DisplayProgressBar("生成FLS文件", "收集关联动作资源", 0.5f);
|
||
//怪物关联的动作资源
|
||
List<string> animList = new List<string>();
|
||
animList.AddRange(collectMonsterAnim(monsterResList));
|
||
animList.AddRange(collectMonsterAnim(npcResList));
|
||
animList.AddRange(collectMonsterAnim(cloneResList));
|
||
//---
|
||
|
||
List<string> allDependenceResList = new List<string>();
|
||
allDependenceResList.Add(string.Format("{0}Scene/{1}.unity3d", _assetRoot, sceneName));
|
||
string music = string.Format("{0}Sound/Music/{1}.mp3", _assetRoot, sceneMusic);
|
||
if(File.Exists(music))
|
||
allDependenceResList.Add(music);
|
||
string miniMap = string.Format("{0}Texture/Map/tex_{1}.jpg", _assetRoot, sceneName);
|
||
if (File.Exists(miniMap))
|
||
allDependenceResList.Add(miniMap);
|
||
|
||
allDependenceResList.AddRange(monsterResList);
|
||
allDependenceResList.AddRange(npcResList);
|
||
allDependenceResList.AddRange(cloneResList);
|
||
allDependenceResList.AddRange(animList);
|
||
|
||
return allDependenceResList;
|
||
}
|
||
|
||
//保存文件
|
||
private static void save(params List<string>[] args)
|
||
{
|
||
int count = 0;
|
||
System.Collections.Generic.HashSet<string> allRes = new System.Collections.Generic.HashSet<string>();
|
||
for (int i = 0; i < args.Length; ++i)
|
||
{
|
||
for (int m = 0; m < args[i].Count; ++m)
|
||
{
|
||
//去重
|
||
if (!allRes.Contains(args[i][m]))
|
||
{
|
||
allRes.Add(args[i][m]);
|
||
count++;
|
||
}
|
||
}
|
||
}
|
||
|
||
string flsLanDir = SubFlsRoot + _lanStr;
|
||
if (!Directory.Exists(flsLanDir))
|
||
{
|
||
Directory.CreateDirectory(flsLanDir);
|
||
}
|
||
StreamWriter sw = new StreamWriter(SubFlsRoot + _lanStr + "/test.txt");
|
||
sw.WriteLine(string.Format("{0},0", count));
|
||
|
||
var itor = allRes.GetEnumerator();
|
||
while (itor.MoveNext())
|
||
{
|
||
sw.WriteLine(itor.Current);
|
||
}
|
||
|
||
sw.Close();
|
||
}
|
||
|
||
//怪物模型
|
||
private static List<string> collectMonsterRes(List<int> monsterIDs)
|
||
{
|
||
List<string> monsterPaths= new List<string>();
|
||
for (int i = 0; i < monsterIDs.Count; ++i)
|
||
{
|
||
string path = collectMonsterRes(monsterIDs[i]);
|
||
if (!string.IsNullOrEmpty(path))
|
||
{
|
||
monsterPaths.Add(path);
|
||
}
|
||
}
|
||
|
||
return monsterPaths;
|
||
}
|
||
|
||
private static string collectMonsterRes(int monsterID)
|
||
{
|
||
var monsterCfg = DeclareMonster.Get(monsterID);
|
||
if (monsterCfg == null)
|
||
{
|
||
return "";
|
||
}
|
||
var modelConfig = DeclareModelConfig.Get(monsterCfg.Res);
|
||
if (modelConfig == null)
|
||
{
|
||
return "";
|
||
}
|
||
return combineMonsterPath(modelConfig.Model);
|
||
}
|
||
|
||
//npc模型和音效
|
||
private static List<string> collectNPCRes(List<int> npcIDs)
|
||
{
|
||
List<string> npcPaths = new List<string>();
|
||
List<string> speechPath = new List<string>();
|
||
|
||
for (int i = 0; i < npcIDs.Count; ++i)
|
||
{
|
||
var npcCfg = DeclareNpc.Get(npcIDs[i]);
|
||
if (npcCfg == null)
|
||
{
|
||
continue;
|
||
}
|
||
var modelConfig = DeclareModelConfig.Get(npcCfg.Res);
|
||
if (modelConfig != null)
|
||
{
|
||
npcPaths.Add(combineNPCPath(modelConfig.Model));
|
||
}
|
||
|
||
string speechName = npcCfg.Speech;
|
||
if (string.IsNullOrEmpty(speechName))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
speechPath.Add(combineNpcSpeechRes(speechName));
|
||
}
|
||
|
||
npcPaths.AddRange(speechPath);
|
||
|
||
return npcPaths;
|
||
}
|
||
|
||
//通过副本数据获取副本中怪物信息CloneMonster
|
||
private static List<string> collectCloneMonster(List<DeclareCloneMap> cloneMapData)
|
||
{
|
||
List<int> monsterIDList = new List<int>();
|
||
List<string> monsterPathList = new List<string>();
|
||
|
||
//for (int i = 0; i < cloneMapData.Count; ++i)
|
||
//{
|
||
// int cloneMapId = cloneMapData[i].Id;
|
||
// var cloneMonsterDataItor = DeclareCloneMonster.CacheData.GetEnumerator();
|
||
// while (cloneMonsterDataItor.MoveNext())
|
||
// {
|
||
// var current = cloneMonsterDataItor.Current.Value;
|
||
|
||
// if (current.CloneID == cloneMapId)
|
||
// {
|
||
// //怪物信息monster_information,解析出id
|
||
// string[] monsterIDArray = current.MonsterInformation.Split(';');
|
||
// for (int m = 0; m < monsterIDArray.Length; ++m)
|
||
// {
|
||
// string monsterIDstr = monsterIDArray[m].Substring(0, monsterIDArray[m].IndexOf('_'));
|
||
// int monsterID = getInt(monsterIDstr);
|
||
// if (!monsterIDList.Contains(monsterID))
|
||
// {
|
||
// monsterIDList.Add(monsterID);
|
||
// string path = collectMonsterRes(monsterID);
|
||
// if (!string.IsNullOrEmpty(path) && !monsterPathList.Contains(path))
|
||
// {
|
||
// monsterPathList.Add(path);
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
//}
|
||
|
||
return monsterPathList;
|
||
}
|
||
|
||
//通过地图id获取副本数据
|
||
private static List<DeclareCloneMap> collectCloneMapID(int mapID)
|
||
{
|
||
List<DeclareCloneMap> cloneMapDataList = new List<DeclareCloneMap>();
|
||
DeclareCloneMap.Foreach((cfg) =>
|
||
{
|
||
if (mapID == cfg.Mapid)
|
||
{
|
||
cloneMapDataList.Add(cfg);
|
||
return false;
|
||
}
|
||
return true;
|
||
});
|
||
return cloneMapDataList;
|
||
}
|
||
|
||
//通过怪物名字来获取对应的怪物动作文件
|
||
private static List<string> collectMonsterAnim(string monsterPath)
|
||
{
|
||
List<string> animFileList = new List<string>();
|
||
string monsterDirName = Path.GetFileNameWithoutExtension(monsterPath);
|
||
string animRootPath = _subResRoot + "Animation/monster/" + monsterDirName;
|
||
if (Directory.Exists(animRootPath))
|
||
{
|
||
animFileList = Utils.GetFiles(animRootPath, "*.*", SearchOption.AllDirectories, PkgConstDefine.CommonExceptionEx);
|
||
}
|
||
|
||
for (int i = 0; i < animFileList.Count; ++i)
|
||
{
|
||
animFileList[i] = Path.ChangeExtension(animFileList[i].Replace(SubAllRoot, ""), "unity3d");
|
||
}
|
||
|
||
return animFileList;
|
||
}
|
||
|
||
private static List<string> collectMonsterAnim(List<string> monsterList)
|
||
{
|
||
List<string> animList = new List<string>();
|
||
for (int i = 0; i < monsterList.Count; ++i)
|
||
{
|
||
animList.AddRange(collectMonsterAnim(monsterList[i]));
|
||
}
|
||
|
||
return animList;
|
||
}
|
||
|
||
//组合怪物路径
|
||
private static string combineMonsterPath(int id)
|
||
{
|
||
string monsterPrefabName = string.Format("m_{0:D3}.unity3d", id);
|
||
string assetsPath = getResourcePath(string.Format("Prefab/Monster/{0}", monsterPrefabName));
|
||
return assetsPath;
|
||
}
|
||
|
||
//NPC资源路径
|
||
private static string combineNPCPath(int id)
|
||
{
|
||
return combineMonsterPath(id);
|
||
}
|
||
|
||
//NPC音效文件
|
||
private static string combineNpcSpeechRes(string speechName)
|
||
{
|
||
string lan = _lanStr;
|
||
if (_lanStr.IndexOf("/") > 0)
|
||
{
|
||
lan = _lanStr.Substring(0, _lanStr.IndexOf("/"));
|
||
}
|
||
//音效有语言路径
|
||
return getResourcePath(string.Format("Sound/Speech/{1}/{0}.unity3d", speechName, lan));
|
||
}
|
||
|
||
private static string getResourcePath(string resDirName)
|
||
{
|
||
return _assetRoot + resDirName;
|
||
}
|
||
|
||
private static int getInt(string intStr)
|
||
{
|
||
int ret = 0;
|
||
int.TryParse(intStr, out ret);
|
||
return ret;
|
||
}
|
||
|
||
|
||
#region 生成分段资源
|
||
|
||
public static void CreateBinaryRes(string binaryFileName, out List<string> binaryResList)
|
||
{
|
||
#if UNITY_STANDALONE_WIN
|
||
string resStoreDir = "../SubResource/EXE";
|
||
#else
|
||
string resStoreDir = "../SubResource/APK";
|
||
#endif
|
||
if (!Directory.Exists(resStoreDir))
|
||
Directory.CreateDirectory(resStoreDir);
|
||
binaryFileName = resStoreDir + "/" + binaryFileName;
|
||
binaryResList = new List<string>();
|
||
List<string> flsList = Utils.GetFiles(SubFlsRoot, "*.fls", SearchOption.TopDirectoryOnly, PkgConstDefine.CommonExceptionEx);
|
||
int index = 1;
|
||
for (int i = 0; i < flsList.Count; ++i)
|
||
{
|
||
if (flsList[i].IndexOf("fls0") > 0 || flsList[i].IndexOf("fls.fls") > 0)
|
||
continue;
|
||
|
||
string binaryResPath = binaryFileName + "_" + (index);
|
||
binaryResList.Add(binaryResPath);
|
||
CreateBinaryResAndMapFile(flsList[i], binaryResPath);
|
||
index++;
|
||
}
|
||
|
||
EditorUtility.ClearProgressBar();
|
||
}
|
||
|
||
public static bool CreateBinaryResAndMapFile(string flsFile, string outMapFile)
|
||
{
|
||
bool retValue = true;
|
||
|
||
string outFileMap = outMapFile + ".map";
|
||
string outFileRes = outMapFile;
|
||
|
||
FileStream writerRes = new FileStream(outFileRes, FileMode.Create);
|
||
FileStream writerMap = new FileStream(outFileMap, FileMode.Create);
|
||
|
||
try
|
||
{
|
||
string readLine = "";
|
||
StreamReader reader = File.OpenText(flsFile);
|
||
|
||
long begin = 0;
|
||
long end = 0;
|
||
int dirLen = 0;
|
||
int nameLen = 0;
|
||
int md5Len = 0;
|
||
long fileSize = 0;
|
||
string dir = "";
|
||
string name = "";
|
||
string md5 = "";
|
||
|
||
string originalPath = "";
|
||
|
||
int count = 0;
|
||
int maxCount = 0;
|
||
bool hasMaxCount = false;
|
||
while ((readLine = reader.ReadLine()) != null)
|
||
{
|
||
//不拷贝视频文件
|
||
if (readLine.IndexOf(".map4") > 0)
|
||
continue;
|
||
if (readLine.Contains(","))
|
||
{
|
||
string countStr = readLine.Substring(0, readLine.IndexOf(",")).Trim();
|
||
hasMaxCount = Int32.TryParse(countStr, out maxCount);
|
||
continue;
|
||
}
|
||
|
||
if (maxCount != 0)
|
||
EditorUtility.DisplayProgressBar("生成分段资源", readLine, count / (float)maxCount);
|
||
|
||
originalPath = SubAllRoot + readLine;
|
||
//begin_end_dirLen_nameLen_md5Len_fileSize_dir_name_md5
|
||
FileInfo fileInfo = new FileInfo(originalPath);
|
||
if (!fileInfo.Exists)
|
||
{
|
||
//retValue = false;
|
||
UnityEngine.Debug.LogError("WARN::" + fileInfo.FullName + " ----> 不存在!!!");
|
||
continue;
|
||
}
|
||
|
||
if (retValue == false)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
fileSize = fileInfo.Length;
|
||
begin = end;
|
||
|
||
//readLine = g_form.g_configModel.m_addDir + readLine;
|
||
|
||
dirLen = getDirOrNameLen(readLine, true);
|
||
nameLen = getDirOrNameLen(readLine, false);
|
||
md5Len = 32;
|
||
end += fileSize + dirLen + nameLen + md5Len + 32 * 4;
|
||
dir = getDirOrNameStr(readLine, true);
|
||
name = getDirOrNameStr(readLine, false);
|
||
md5 = Utils.MD5(fileInfo.FullName);
|
||
|
||
//write map file
|
||
writerMap.Write(getByte("" + begin, 10), 0, 10);
|
||
writerMap.Write(getByte("" + end, 10), 0, 10);
|
||
writerMap.Write(getByte("" + dirLen, 10), 0, 10);
|
||
writerMap.Write(getByte("" + nameLen, 10), 0, 10);
|
||
writerMap.Write(getByte("" + md5Len, 10), 0, 10);
|
||
writerMap.Write(getByte("" + fileSize, 10), 0, 10);
|
||
writerMap.Write(getByte(dir), 0, getByte(dir).Length);
|
||
writerMap.Write(getByte(name), 0, getByte(name).Length);
|
||
writerMap.Write(getByte(md5), 0, getByte(md5).Length);
|
||
//---
|
||
|
||
//write res file
|
||
writerRes.Write(getByte("" + dirLen, 32), 0, 32);
|
||
writerRes.Write(getByte("" + nameLen, 32), 0, 32);
|
||
writerRes.Write(getByte("" + md5Len, 32), 0, 32);
|
||
writerRes.Write(getByte("" + fileSize, 32), 0, 32);
|
||
writerRes.Write(getByte(dir), 0, getByte(dir).Length);
|
||
writerRes.Write(getByte(name), 0, getByte(name).Length);
|
||
writerRes.Write(getByte(md5), 0, getByte(md5).Length);
|
||
|
||
writeFile(writerRes, originalPath);
|
||
//---
|
||
|
||
count++;
|
||
|
||
}
|
||
|
||
reader.Close();
|
||
}
|
||
catch (System.Exception)
|
||
{
|
||
retValue = false;
|
||
}
|
||
finally
|
||
{
|
||
writerMap.Flush();
|
||
writerMap.Close();
|
||
|
||
writerRes.Flush();
|
||
writerRes.Close();
|
||
}
|
||
return retValue;
|
||
}
|
||
|
||
private static int getDirOrNameLen(string abPath, bool forDir)
|
||
{
|
||
string newPath = abPath.Replace("\\", "/");
|
||
int dirRange = newPath.LastIndexOf("/");
|
||
string dir = newPath.Substring(0, dirRange + 1);
|
||
string name = newPath.Substring(dirRange + 1, newPath.Length - dirRange - 1);
|
||
if (forDir)
|
||
{
|
||
return dir.Length;
|
||
}
|
||
return name.Length;
|
||
}
|
||
|
||
private static string getDirOrNameStr(string abPath, bool forDir)
|
||
{
|
||
string newPath = abPath.Replace("\\", "/");
|
||
int dirRange = newPath.LastIndexOf("/");
|
||
string dir = newPath.Substring(0, dirRange + 1);
|
||
string name = newPath.Substring(dirRange + 1, newPath.Length - dirRange - 1);
|
||
if (forDir)
|
||
{
|
||
return dir;
|
||
}
|
||
return name;
|
||
}
|
||
|
||
private static Byte[] getByte(string value, int len)
|
||
{
|
||
Byte[] bytes = new Byte[len];
|
||
Byte[] tempBts = Encoding.Default.GetBytes(value);
|
||
|
||
for (int i = 0; i < tempBts.Length; ++i)
|
||
{
|
||
if (i > len)
|
||
{
|
||
break;
|
||
}
|
||
bytes[i] = tempBts[i];
|
||
}
|
||
|
||
return bytes;
|
||
|
||
}
|
||
|
||
private static Byte[] getByte(string value)
|
||
{
|
||
return Encoding.Default.GetBytes(value);
|
||
}
|
||
|
||
private static void writeFile(FileStream writer, string file)
|
||
{
|
||
FileStream read = new FileStream(file, FileMode.Open);
|
||
|
||
Byte[] buffer = new Byte[1024];
|
||
int len = 0;
|
||
while ((len = read.Read(buffer, 0, 1024)) > 0)
|
||
{
|
||
writer.Write(buffer, 0, len);
|
||
}
|
||
read.Close();
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
}
|