Files
2025-01-25 04:38:09 +08:00

625 lines
22 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Sirenix.Utilities.Editor;
using System;
using UnityEngine;
using Sirenix.OdinInspector.Editor;
using Sirenix.OdinInspector;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using Thousandto.Package;
namespace Thousandto.DaleSpeace
{
public class PackRes : EditorWindow
{
#region //Title Time and Message
[DetailedInfoBox("----点击查看使用详情----", "Multilingual 多语言资源 需要选择要打包的语言 选中后出现多语言选择 默认是CH " +
" Corresponding 通用资源 不需要选择要打包的语言 勾选即视为要打包 Special : 特殊的资源打包 ")]
[ShowInInspector, DisplayAsString, PropertyOrder(-1)]
public string CurrentTime
{
get
{
GUIHelper.RequestRepaint();
return DateTime.Now.ToString();
}
}
#endregion
#region // 选择打包语言
[BoxGroup("选择要打包的语言", true, false, 200)]
[Space]
[PropertyTooltip("是否是多语言")]
public bool IsMultilingual = false;
[BoxGroup("选择要打包的语言", true, false, 200)]
[EnumToggleButtons, HideLabel]
[Space]
[HideIf("IsMultilingual")]
public LanType lantype_ = LanType.CH;
[BoxGroup("选择要打包的语言", true, false, 200)]
[Space]
[HorizontalGroup("选择要打包的语言/F")]
[ShowIf("IsMultilingual")]
public bool CH = false;
[BoxGroup("选择要打包的语言", true, false, 200)]
[HorizontalGroup("选择要打包的语言/F")]
[Space]
[ShowIf("IsMultilingual")]
public bool TW = false;
[BoxGroup("选择要打包的语言", true, false, 200)]
[ShowIf("IsMultilingual")]
[HorizontalGroup("选择要打包的语言/S")]
public bool EN = false;
[BoxGroup("选择要打包的语言", true, false, 200)]
[ShowIf("IsMultilingual")]
[HorizontalGroup("选择要打包的语言/S")]
public bool TH = false;
[BoxGroup("选择要打包的语言", true, false, 200)]
[ShowIf("IsMultilingual")]
[HorizontalGroup("选择要打包的语言/T")]
public bool VIE = false;
[BoxGroup("选择要打包的语言", true, false, 200)]
[ShowIf("IsMultilingual")]
[HorizontalGroup("选择要打包的语言/T")]
public bool JP = false;
[BoxGroup("选择要打包的语言", true, false, 200)]
[ShowIf("IsMultilingual")]
[HorizontalGroup("选择要打包的语言/Four")]
public bool KR = false;
#endregion
#region // 资源列表
[FoldoutGroup("所有游戏资源", 201)]
[PropertyTooltip("打包游戏窗体.")]
//[HorizontalGroup("Multilingual/HorizontalGameUI")]
public bool PackageGameUI = false;
//[HideLabel]
//[ShowIf("PackageGameUI")]
//[HorizontalGroup("Multilingual/HorizontalGameUI")]
//[BoxGroup("Multilingual", true, false, 201)]
//public LanType GameUILanType = LanType.CH;
//======================GameUI===========================================//
//[HorizontalGroup("Multilingual/HorizontalTexture")]
[PropertyTooltip("打包Texture.")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackageTexture = false;
//[HideLabel]
//[ShowIf("PackageTexture")]
//[HorizontalGroup("Multilingual/HorizontalTexture")]
//[BoxGroup("Multilingual", true, false, 201)]
//public LanType TextureLanType = LanType.CH;
//======================Texture===========================================//
//[HorizontalGroup("Multilingual/HorizontalVFXTexture")]
[PropertyTooltip("打包特效贴图.")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackageVFXTexture = false;
//[HideLabel]
//[ShowIf("PackageVFXTexture")]
//[HorizontalGroup("Multilingual/HorizontalVFXTexture")]
//[BoxGroup("Multilingual", true, false, 201)]
//public LanType VFXTextureLanType = LanType.CH;
//======================VFXTexture===========================================//
//[HorizontalGroup("Multilingual/HorizontalAtlasFont")]
[PropertyTooltip("打包图集和字体.")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackageAtlasFont = false;
//[HideLabel]
//[ShowIf("PackageAtlasFont")]
//[HorizontalGroup("Multilingual/HorizontalAtlasFont")]
//[BoxGroup("Multilingual", true, false, 201)]
//public LanType AtlasFontLanType = LanType.CH;
//======================VFXTexture===========================================//
[PropertyTooltip("打包lua.")]
//[HorizontalGroup("Multilingual/HorizontalLua")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackageLua = false;
//[HideLabel]
//[ShowIf("PackageLua")]
//[HorizontalGroup("Multilingual/HorizontalLua")]
//[BoxGroup("Multilingual", true, false, 201)]
//public LanType LuaLanType = LanType.CH;
//======================VFXTexture===========================================//
//[HorizontalGroup("Multilingual/HorizontalConfiguration")]
[PropertyTooltip("打包配置文件")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackageConfiguration = false;
//[HideLabel]
//[ShowIf("PackageConfiguration")]
//[HorizontalGroup("Multilingual/HorizontalConfiguration")]
//[BoxGroup("Multilingual", true, false, 201)]
//public LanType ConfigurationLanType = LanType.CH;
//======================Configuration===========================================//
[PropertyTooltip("打包游戏场景")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackageSence = false;
[PropertyTooltip("打包默认场景")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackageDefaultSence = false;
[PropertyTooltip("打包TimeLine")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackageTimeLine = false;
[PropertyTooltip("打包玩家模型")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackageModel = false;
[PropertyTooltip("打包Shader")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackageShader = false;
[PropertyTooltip("打包游戏特效")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackageVFX = false;
[PropertyTooltip("打包玩家动作")]
[FoldoutGroup("所有游戏资源", 201)]
public bool PackagePlayerAnimClip = false;
#endregion
#region // 打包按钮
[BoxGroup("选择打包方式", true, false, 203)]
[HorizontalGroup("选择打包方式/PackagePartRes")]
[Button("打包选中资源", 30)]
private void PackageChooseResClick()
{
Package(GetCurSelectLan());
}
[BoxGroup("选择打包方式", true, false, 203)]
[HorizontalGroup("选择打包方式/PackagePartRes")]
[Button("打包文件列表资源", 30)]
private void PackageFileListClick()
{
string path = EditorUtility.OpenFilePanel("打开包含资源列表的文本文件", "", "txt");
PackageFromTextFile(GetCurSelectLan(), path);
}
[BoxGroup("选择打包方式", true, false, 203)]
[GUIColor(0.3f, 0.6f, 0.4f)]
[HorizontalGroup("选择打包方式/PackagePartRes")]
[Button("打包所有资源(不含动态库)",30)]
private void PackageAllResClick()
{
Debug.Log("打包所有资源 " + GetCurSelectLan());
Thousandto.Package.Tool.PackageOption.OnlyPackageResource(GetCurSelectLan());
Thousandto.Package.UI.PackageWindow.Open();
}
[BoxGroup("选择打包方式", true, false, 203)]
[PropertySpace(SpaceBefore = 10, SpaceAfter = 10)]
[Button("打包以上选择的资源" , 40)]
[GUIColor(1f, 0.8f, 0f)]
[PropertyOrder(299)]
private void PackageClick()
{
Thousandto.Package.Tool.PackageLocker.CloseLockFile(true);
PackageManager.Reset();
PackageManager.SetLanguage(GetCurSelectLan());
if (PackageGameUI)
{
PackageManager.AddResource<NewGameUI>();
}
if (PackageGameUI == false && PackageAtlasFont)
{
var inst = new NewGameUI(false);
inst.AddAllAtlas();
inst.AddAllFont();
PackageManager.AddResource(inst);
}
if (PackageTexture)
{
PackageManager.AddResource<Package.Texture>();
}
if (PackageVFX)
{
PackageManager.AddResource<VFX>();
}
if (PackageVFXTexture)
{
PackageManager.AddResource<VFXTexture>();
}
if (PackageTimeLine)
{
PackageManager.AddResource<TimeLine>();
}
if (PackageShader)
{
PackageManager.AddResource<ShaderPackage>();
}
if (PackageSence)
{
PackageManager.AddResource<Scene>();
}
if (PackageDefaultSence)
{
PackageManager.AddResource<SceneDefault>();
}
if (PackagePlayerAnimClip)
{
PackageManager.AddResource<PlayerAnimClip>();
}
if (PackageModel)
{
PackageManager.AddResource<Prefab>();
}
if (PackageLua)
{
LuaToZip.BetterLua(GetCurSelectLan());
}
if (PackageConfiguration)
{
DefaultAndConfigFiles.StartBuild();
}
PackageManager.Start();
}
#endregion
#region //功能函数
//打包选中资源
private static void Package(string lan)
{
List<string> resFileList = new List<string>();
UnityEngine.Object[] objs = Selection.objects;
for (int i = 0; objs != null && i < objs.Length; ++i)
{
UnityEngine.Object obj = objs[i];
string path = AssetDatabase.GetAssetOrScenePath(obj);
UnityEngine.Debug.LogError(path);
if (Directory.Exists(path))
{
var files = Utils.GetFiles(path, "*.*", SearchOption.AllDirectories, PkgConstDefine.CommonExceptionEx);
foreach (string file in files)
{
if (!file.EndsWith(".meta"))
{
resFileList.Add(file);
}
UnityEngine.Debug.LogError(file);
}
}
else
{
resFileList.Add(path);
}
}
DoPackageFileList(lan, resFileList, false);
}
//对资源文件进行打包
private static void DoPackageFileList(string lan, List<string> resFileList, bool isAll)
{
Thousandto.Package.Tool.PackageLocker.CloseLockFile(true);
PackageManager.Reset();
PackageManager.SetLanguage(lan);
List<string> defaultFiles = new List<string>();
var newUIList = new List<string>();
var newAnimList = new List<string>();
var prefabList = new List<string>();
var uitexList = new List<string>();
var vfxList = new List<string>();
for (int i = 0; i < resFileList.Count; ++i)
{
UnityEngine.Debug.Log("start pkg: " + resFileList[i]);
//要防止是文件夹的情况
if (resFileList[i].Contains("GameUI") && resFileList[i].EndsWith(".prefab"))
{
newUIList.Add(resFileList[i]);
}
else if (resFileList[i].IndexOf("Resources/Shader") >= 0)
{
if (resFileList[i].IndexOf(".prefab") > 0)
{
PackageManager.AddResource(new ShaderPackage(resFileList[i]));
}
else
{
UnityEngine.Debug.Log("skip pkg: " + resFileList[i]);
}
}
else if (resFileList[i].IndexOf("Prefab") > 0)
{
prefabList.Add(resFileList[i]);
}
else if (resFileList[i].IndexOf("Resources/Timeline") > 0)
{
PackageManager.AddResource(new TimeLine(resFileList[i]));
}
else if (resFileList[i].IndexOf("Resources/VFX") > 0)
{
vfxList.Add(resFileList[i]);
}
else if (resFileList[i].IndexOf(".unity") > 0)
{
PackageManager.AddResource(new Scene(resFileList[i]));
}
else if (resFileList[i].IndexOf(".playable") > 0)
{
PackageManager.AddResource(new TimeLine(resFileList[i]));
}
else if (resFileList[i].IndexOf(".anim") > 0)
{
newAnimList.Add(resFileList[i]);
}
else if (resFileList[i].IndexOf("/Texture/UI") > 0)
{
uitexList.Add(resFileList[i]);
}
else
{
//if (BundleRecorder.IsNeedBundle(resFileList[i]))
defaultFiles.Add(resFileList[i]);
}
}
if (newUIList.Count > 0)
{
PackageManager.AddResource(NewGameUI.CreateIns(newUIList));
}
if (newAnimList.Count > 0)
{
PackageManager.AddResource(PlayerAnimClip.CreateIns(newAnimList));
}
if (prefabList.Count > 0)
{
PackageManager.AddResource(Prefab.CreateIns(prefabList));
}
if (uitexList.Count > 0)
{
PackageManager.AddResource(Thousandto.Package.Texture.CreateIns(uitexList));
}
if (vfxList.Count > 0)
{
PackageManager.AddResource(VFX.CreateIns(vfxList));
}
PackageManager.Start();
if (defaultFiles.Count > 0)
{
DIY.PackageUtils.BuildAssetBundle(defaultFiles, BasePkg.OutPath, PackageManager.BuildTarget, 200, false);
//for (int i = 0; i < defaultFiles.Count; ++i)
//{
// BundleRecorder.SaveRecorder(defaultFiles[i]);
//}
}
}
//根据文本文件获取打包信息
private static void PackageFromTextFile(string lan, string path)
{
if (File.Exists(path))
{
HashSet<string> resFileList = new HashSet<string>();
UnityEngine.Debug.Log("开始解析文件:" + path);
var lines = File.ReadAllLines(path);
bool isBuildCode = false;
bool isBuildConfig = false;
bool isShader = false;
foreach (var line in lines)
{
if (!string.IsNullOrEmpty(line) && !line.EndsWith(".meta"))
{
var tmp = line.Replace("\\", "/");
if (tmp.EndsWith(".lua") || tmp.EndsWith(".cs"))
{//代码有修改
isBuildCode = true;
}
else if (tmp.EndsWith(".xlsx"))
{//配置文件又修改
if (tmp.IndexOf("Gamedata/Config/") >= 0)
{
isBuildConfig = true;
}
}
else if (tmp.IndexOf("Main/Assets/GameAssets/") >= 0)
{
//只针对Main下面的资源
var idx = tmp.IndexOf("Assets/GameAssets/");
if (tmp.IndexOf("Assets/GameAssets/Resources") >= 0)
{
//配置文件
if (tmp.IndexOf("/Resources/Config") >= 0) continue;
if (tmp.IndexOf("/Resources/Shader") >= 0)
{
isShader = true;
}
else
{
//这两个比较特殊是文件夹GameUI那边会做拷贝有异常需要剔除这个文件夹
if (!tmp.EndsWith("Form") && !tmp.EndsWith("GameUI"))
{
resFileList.Add(tmp.Substring(idx));
}
}
}
else
{
if (tmp.IndexOf("Assets/GameAssets/ExportResources/Scene") >= 0)
{
resFileList.Add(tmp.Substring(idx));
}
else if (tmp.IndexOf("Assets/GameAssets/RawResources/uinew/Local/") >= 0)
{
if (tmp.IndexOf("/Atlas/") >= 0)
{
var name = GetFileNameWithOutExt(tmp);
if (!string.IsNullOrEmpty(name))
{
var arr = name.Split(new char[] { '_' });
resFileList.Add(string.Format("Assets/GameAssets/Resources/GameUI/Base/Atlas/{0}/{1}.prefab", arr[0], name));
}
}
else if (tmp.IndexOf("/Font/") >= 0)
{
//字体有问题,字体与Prefab对应不上,在名字上
/*
var name = GetFileNameWithOutExt(tmp);
if (!string.IsNullOrEmpty(name))
{
resFileList.Add(string.Format("Assets/GameAssets/Resources/GameUI/Base/Font/{0}/{1}.prefab", name, name));
}
*/
}
}
}
}
}
}
//shader要打包
if (isShader)
{
resFileList.Add("Assets/GameAssets/Resources/Shader/ShaderFactory.prefab");
}
//打代码
if (isBuildCode || isBuildConfig)
{
UnityEngine.Debug.LogError("开始需要打代码!");
CodeAndDllPackage.Test(lan, isBuildConfig);
}
DoPackageFileList(lan, new List<string>(resFileList), false);
}
else
{
UnityEngine.Debug.LogError("没有找到文本文件:" + path);
}
}
private static string GetFileNameWithOutExt(string path)
{
var lastidx = path.LastIndexOf("/");
if (lastidx > 0)
{
var dotindex = path.IndexOf(".", lastidx);
if (dotindex > 0)
{
return path.Substring(lastidx + 1, dotindex - lastidx - 1);
}
return path.Substring(lastidx + 1);
}
else
{
var dotindex = path.IndexOf(".");
if (dotindex >= 0)
{
return path.Substring(0, dotindex);
}
}
return path;
}
private string GetCurSelectLan()
{
string CurLan = "";
if (IsMultilingual)
{
if (CH)
CurLan = CurLan + "CH_";
if (TH)
CurLan = CurLan + "TH_";
if (VIE)
CurLan = CurLan + "VIE_";
if (JP)
CurLan = CurLan + "JP_";
if (TW)
CurLan = CurLan + "TW_";
if (KR)
CurLan = CurLan + "KR_";
if (EN)
CurLan = CurLan + "EN_";
if (CurLan == "")
CurLan = "CH";
if (CurLan.StartsWith("_"))
CurLan = CurLan.Remove(1);
if (CurLan.EndsWith("_"))
CurLan = CurLan.Remove(CurLan.Length - 1);
}
else
{
CurLan = lantype_.ToString();
}
if(CurLan == "")
{
CurLan = "CH";
}
return CurLan;
}
private List<string> GetCurSelectPack()
{
List<string> packs =new List<string>();
return packs;
}
#endregion
}
}