ImportArtResTool.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. using UnityEditor;
  2. using UnityEngine;
  3. using System.IO;
  4. using System;
  5. using System.Collections.Generic;
  6. using GFGGame;
  7. namespace GFGEditor
  8. {
  9. public class ImportArtResTool
  10. {
  11. public static string ResRootDirName = "正式资源";
  12. public static string ResRootDirNameDressUp = "正式资源";
  13. public static string ResRootPath { get { return $"../../../gfg/{ResRootDirName}/"; } }
  14. public static string ResRootPathDressUp { get { return $"../../../gfg/{ResRootDirNameDressUp}/"; } }
  15. public static string ragule = @"^[0-9a-zA-Z_.]{1,}$";
  16. public static string Md5FilePath = "Assets/Res/MD5";
  17. private static string[] FieldGuideIconSrcPaths { get { return new string[] { ResRootPath + "图鉴/" }; } }
  18. public static string FieldGuideIconTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/FieldGuide/Icon/";
  19. public static string FieldGuideIconMd5FileSaveName = "FieldGuideIconMd5";
  20. private static string[] MusicSrcPaths { get { return new string[] { ResRootPath + "music/" }; } }
  21. public static string MusicTargetPath = $"{ResPathUtil.MUSIC_DIR_PATH}/";
  22. public static string MusicMd5FileSaveName = "MusicMd5";
  23. private static string[] CardMusicSrcPaths { get { return new string[] { ResRootPath + "cardMusic/Card/" }; } }
  24. public static string CardMusicTargetPath = $"{ResPathUtil.SOUND_DIR_PATH}/Card/";
  25. public static string CardMusicMd5FileSaveName = "CardMusicMd5";
  26. private static string[] ItemIconSrcPaths { get { return new string[] { ResRootPath + "icon/" }; } }
  27. public static string ItemIconTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/Icon/";
  28. public static string IconMd5FileSaveName = "IconMd5";
  29. private static string[] DressUpSrcPaths { get { return new string[] { ResRootPathDressUp + "suit/" }; } }
  30. public static string DressUpTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/DressUp/";
  31. public static string DressUpMd5FileSaveName = "DressUpMd5";
  32. private static string[] NpcHeadSrcPaths { get { return new string[] { ResRootPath + "npc/对战头像/" }; } }
  33. public static string NpcHeadTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/Npc/Head/";
  34. public static string HeadMd5FileSaveName = "HeadMd5";
  35. private static string[] NpcPicSrcPaths { get { return new string[] { ResRootPath + "npc/对战立绘/" }; } }
  36. public static string NpcPicTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/Npc/PicF/";
  37. public static string PicFMd5FileSaveName = "PicFMd5";
  38. private static string[] NpcPicSSrcPaths { get { return new string[] { ResRootPath + "npc/对话立绘/" }; } }
  39. public static string NpcPicSTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/Npc/PicS/";
  40. public static string PicSMd5FileSaveName = "PicSMd5";
  41. public static string[] BgSrcPaths { get { return new string[] { ResRootPathDressUp + "scene/" }; } }
  42. public static string BgTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/DressUp/";
  43. public static string BgMd5FileSaveName = "BgMd5";
  44. private static string[] CardBgSrcPaths { get { return new string[] { ResRootPath + "卡牌/pic/" }; } }
  45. public static string CardBgTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/Card/Bg/";
  46. public static string CardBgMd5FileSaveName = "CardBgMd5";
  47. private static string[] CardIconSrcPaths { get { return new string[] { ResRootPath + "卡牌/icon/" }; } }
  48. public static string CardIconTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/Card/Card/";
  49. public static string CardMd5FileSaveName = "CardMd5";
  50. private static string[] ActivitySrcPaths { get { return new string[] { ResRootPath + "activity/activity/" }; } }
  51. public static string ActivityTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/Activity/Activity/";
  52. public static string ActivityMd5FileSaveName = "ActivityMd5";
  53. private static string[] ActivityShow1SrcPaths { get { return new string[] { ResRootPath + "activity/show1/" }; } }
  54. public static string ActivityShow1TargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/Activity/Show1/";
  55. public static string ActivityShow1Md5FileSaveName = "ActivityShow1Md5";
  56. private static string[] PhotoGraphBorderPaths { get { return new string[] { ResRootPath + "边框/" }; } }
  57. public static string PhotoGraphBorderTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/Photograph/border/";
  58. public static string PhotoGraphBorderMd5FileSaveName = "PhotoGraphBorderMd5";
  59. private static string[] UIBgSrcPaths { get { return new string[] { ResRootPath + "UI背景/" }; } }
  60. public static string UIBgTargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/BgImg/";
  61. public static string UIBgMd5FileSaveName = "UIBgMd5";
  62. private static string[] ActivityShow2SrcPaths { get { return new string[] { ResRootPath + "activity/show2/" }; } }
  63. public static string ActivityShow2TargetPath = $"{ResPathUtil.TEXTURE_DIR_PATH}/Activity/Show2/";
  64. public static string ActivityShow2Md5FileSaveName = "ActivityShow2Md5";
  65. public static string[] DressUpAnimationSrcPaths { get { return new string[] { ResRootPathDressUp + $"ArtProject/{ResPathUtil.ANIMATION_DIR_PATH}/" }; } }
  66. public static string DressUpAnimationTargetPath = $"{ResPathUtil.ANIMATION_DIR_PATH}/";
  67. public static string[] EffectSrcPaths { get { return new string[] { ResRootPath + $"ArtProject/{ResPathUtil.EFFECT_DIR_PATH}/" }; } }
  68. public static string EffectTargetPath = $"{ResPathUtil.EFFECT_DIR_PATH}/";
  69. public static string[] MaterialSrcPaths { get { return new string[] { ResRootPath + $"ArtProject/{ResPathUtil.Material_DIR_PATH}/Effect/" }; } }
  70. public static string MaterialTargetPath = $"{ResPathUtil.Material_DIR_PATH}/Effect/";
  71. public static string EffectMaterialMd5FileSaveName = "EffectMaterialMd5";
  72. public static string[] TextureSrcPaths { get { return new string[] { ResRootPath + $"ArtProject/{ResPathUtil.Texture_DIR_PATH}/Effect/" }; } }
  73. public static string TextureTargetPath = $"{ResPathUtil.Texture_DIR_PATH}/Effect/";
  74. public static string EffectTextureMd5FileSaveName = "EffectTextureMd5";
  75. public static void Import()
  76. {
  77. var md5Path = ImportArtResTool.Md5FilePath;
  78. if (!Directory.Exists(md5Path))
  79. {
  80. Directory.CreateDirectory(md5Path);
  81. }
  82. //音乐
  83. EditorUtility.DisplayProgressBar("进度", "正在导入音乐", 1);
  84. ImportRes(MusicSrcPaths, MusicTargetPath, MusicMd5FileSaveName);
  85. //卡牌音乐
  86. EditorUtility.DisplayProgressBar("进度", "正在导入卡牌音乐", 1);
  87. ImportRes(CardMusicSrcPaths, CardMusicTargetPath, CardMusicMd5FileSaveName);
  88. //图鉴图标
  89. EditorUtility.DisplayProgressBar("进度", "正在导入图鉴图标", 1);
  90. ImportRes(FieldGuideIconSrcPaths, FieldGuideIconTargetPath, FieldGuideIconMd5FileSaveName);
  91. //物品图标
  92. EditorUtility.DisplayProgressBar("进度", "正在导入物品图标", 1);
  93. ImportRes(ItemIconSrcPaths, ItemIconTargetPath, IconMd5FileSaveName);
  94. // 换装部件
  95. EditorUtility.DisplayProgressBar("进度", "正在裁减换装部件", 1);
  96. ImportClipImage();
  97. //NPC头像
  98. EditorUtility.DisplayProgressBar("进度", "正在导入NPC头像", 1);
  99. ImportRes(NpcHeadSrcPaths, NpcHeadTargetPath, HeadMd5FileSaveName);
  100. //背景
  101. EditorUtility.DisplayProgressBar("进度", "正在导入背景图", 1);
  102. ImportRes(BgSrcPaths, BgTargetPath, BgMd5FileSaveName);
  103. //卡牌背景
  104. EditorUtility.DisplayProgressBar("进度", "正在导入卡牌背景", 1);
  105. ImportRes(CardBgSrcPaths, CardBgTargetPath, CardBgMd5FileSaveName);
  106. //卡牌icon
  107. EditorUtility.DisplayProgressBar("进度", "正在导入卡牌图标", 1);
  108. ImportRes(CardIconSrcPaths, CardIconTargetPath, CardMd5FileSaveName);
  109. //活动宣传图
  110. EditorUtility.DisplayProgressBar("进度", "正在导入活动宣传图", 1);
  111. ImportRes(ActivitySrcPaths, ActivityTargetPath, ActivityMd5FileSaveName);
  112. //活动展示图1
  113. EditorUtility.DisplayProgressBar("进度", "正在导入活动展示图1", 1);
  114. ImportRes(ActivityShow1SrcPaths, ActivityShow1TargetPath, ActivityShow1Md5FileSaveName);
  115. //活动展示图2
  116. EditorUtility.DisplayProgressBar("进度", "正在导入活动展示图2", 1);
  117. ImportRes(ActivityShow2SrcPaths, ActivityShow2TargetPath, ActivityShow2Md5FileSaveName);
  118. //拍照边框
  119. EditorUtility.DisplayProgressBar("进度", "正在导入卡牌图标", 1);
  120. ImportRes(PhotoGraphBorderPaths, PhotoGraphBorderTargetPath, PhotoGraphBorderMd5FileSaveName);
  121. //UI背景
  122. EditorUtility.DisplayProgressBar("进度", "正在导入UI背景", 1);
  123. ImportRes(UIBgSrcPaths, UIBgTargetPath, UIBgMd5FileSaveName);
  124. //清除冗余动画
  125. FileUtil.DeleteUnnecessaryAnimation(ImportArtResTool.DressUpAnimationTargetPath, ImportArtResTool.DressUpAnimationSrcPaths[0]);
  126. FileUtil.DeleteUnnecessaryAnimation(ImportArtResTool.EffectTargetPath, ImportArtResTool.EffectSrcPaths[0]);
  127. //动画
  128. EditorUtility.DisplayProgressBar("进度", "正在导入动作动画", 1);
  129. ImportFileAndDir(DressUpAnimationSrcPaths, DressUpAnimationTargetPath, new string[] { ".moc3" });
  130. //特效
  131. EditorUtility.DisplayProgressBar("进度", "正在导入特效动画", 1);
  132. ImportFileAndDir(EffectSrcPaths, EffectTargetPath);
  133. //材质
  134. EditorUtility.DisplayProgressBar("进度", "正在导入特效材质", 1);
  135. ImportRes(MaterialSrcPaths, MaterialTargetPath, EffectMaterialMd5FileSaveName);
  136. //图片
  137. EditorUtility.DisplayProgressBar("进度", "正在导入特效图片", 1);
  138. ImportRes(TextureSrcPaths, TextureTargetPath, EffectTextureMd5FileSaveName);
  139. //NPC对话立绘
  140. EditorUtility.DisplayProgressBar("进度", "正在导入NPC对话立绘", 1);
  141. List<string> files = ImportRes(NpcPicSSrcPaths, NpcPicSTargetPath, PicSMd5FileSaveName);
  142. //NPC对战立绘
  143. EditorUtility.DisplayProgressBar("进度", "正在导入NPC对战立绘", 1);
  144. files = ImportRes(NpcPicSrcPaths, NpcPicTargetPath, PicFMd5FileSaveName);
  145. if (files != null && files.Count > 0)
  146. {
  147. EditorUtility.DisplayDialog("提示", "有NPC立绘更新,需要设置坐标原点!", "OK", "");
  148. }
  149. EditorUtility.ClearProgressBar();
  150. AssetDatabase.Refresh();
  151. Debug.LogWarning("导入美术资源成功!");
  152. }
  153. public static List<string> ImportRes(string[] sourceDirs, string targetDir, string saveName)
  154. {
  155. List<string> files = null;
  156. if (!Directory.Exists(targetDir))
  157. {
  158. Directory.CreateDirectory(targetDir);
  159. }
  160. foreach (string dir in sourceDirs)
  161. {
  162. files = FileUtil.CopyFilesTo(dir, targetDir, saveName, new string[] { ".png", ".jpg", ".mp3", ".meta", ".mat" }, ragule);
  163. foreach (var file in files)
  164. {
  165. Debug.LogFormat("更新{0}", file);
  166. }
  167. }
  168. return files;
  169. }
  170. public static void ImportClipImage()
  171. {
  172. ImportClip(DressUpSrcPaths, DressUpTargetPath);
  173. }
  174. public static void ImportClip(string[] sourceDirs, string targetDir)
  175. {
  176. //换装部件
  177. if (!Directory.Exists(targetDir))
  178. {
  179. Directory.CreateDirectory(targetDir);
  180. }
  181. Dictionary<string, string> sourceImageMD5 = new Dictionary<string, string>();
  182. sourceImageMD5 = ImagesClip.ReadSourceImagesMD5(DressUpMd5FileSaveName);
  183. foreach (string dir in sourceDirs)
  184. {
  185. GFGEditor.FileUtil.ForeachFileInDir(dir, null, (string file) =>
  186. {
  187. string fileName = Path.GetFileName(file);
  188. if (fileName == "saveMD5" || !FileUtil.CheckStringByRegular(fileName, ragule))
  189. {
  190. return;
  191. }
  192. if (!File.Exists(targetDir + fileName) || !sourceImageMD5.ContainsKey(file) || sourceImageMD5[file] != FileUtil.md5file(file))
  193. {
  194. sourceImageMD5[file] = FileUtil.md5file(file);
  195. ImagesClip.CutImageWhitePart(file, targetDir, fileName);
  196. }
  197. });
  198. }
  199. ImagesClip.WriteSourceImagesMD5(sourceImageMD5, DressUpMd5FileSaveName);
  200. AssetDatabase.Refresh();
  201. }
  202. public static List<string> ImportFileAndDir(string[] sourceDirs, string targetDir, string[] excludeExtentions = null)
  203. {
  204. List<string> files = null;
  205. if (!Directory.Exists(targetDir))
  206. {
  207. Directory.CreateDirectory(targetDir);
  208. }
  209. foreach (string dir in sourceDirs)
  210. {
  211. files = FileUtil.CopyDirsAndFilesInSubDirTo(dir, targetDir, excludeExtentions, ragule);
  212. foreach (var file in files)
  213. {
  214. Debug.LogFormat("更新{0}", file);
  215. }
  216. }
  217. return files;
  218. }
  219. }
  220. }