using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Cysharp.Threading.Tasks; using UnityEditor; using UnityEngine; using VketCloudGUITools.Runtime; using VketCloudGUITools.Serialization; namespace VketCloudGUITools.Editor { public class VCGUICanvasImporterEditorSettings { /// /// Editor用インポート動作補助 /// public class EditorImporterSettingsAgent { /// /// を参照。 /// private string _inputDataPath = string.Empty; /// /// を参照。 /// private string _outputAssetPath = string.Empty; /// /// Editor用:インポートの外部アセット読込先ルートを指定。 /// public string InputDataPath { get => _inputDataPath; set => _inputDataPath = value; } /// /// Editor用:インポート時のUnityアセット保存先ルートを指定。 /// public string OutputAssetPath { get => _outputAssetPath; set => _outputAssetPath = value; } /// /// Editor用:Spriteインポート動作 /// /// /// /// /// public async UniTask EditorOnImportSprite(string assetID, ImportProgress importProgress, VCCanvasImporterSettings settings) { await settings.SmartYield(); ImportAsset(InputDataPath, assetID, OutputAssetPath); await settings.SmartYield(); importProgress.Done(); return null; } /// /// Editor用:Sprite読み込み動作 /// /// /// /// /// public async UniTask EditorOnLoadSprite(string assetID, ImportProgress loadProgress, VCCanvasImporterSettings settings) { if (assetID.StartsWith("./")) { assetID = assetID.Substring(2); } await settings.SmartYield(); Sprite sprite = UnityEditor.AssetDatabase.LoadAssetAtPath($"{OutputAssetPath}/{assetID}"); await settings.SmartYield(); loadProgress.Done(); return sprite; } public async UniTask EditorOnImportHeliodorScript(string assetID, ImportProgress importProgress, VCCanvasImporterSettings settings) { await settings.SmartYield(); ImportAsset(InputDataPath, assetID, OutputAssetPath, true); await settings.SmartYield(); importProgress.Done(); return null; } public async UniTask EditorOnLoadHeliodorScript(string assetID, ImportProgress loadProgress, VCCanvasImporterSettings settings) { int index = assetID.IndexOf("Canvas"); if (index != -1) { // Add the length of "Canvas/" to the index to start after this substring assetID = assetID.Substring(index); } else { Debug.Log("Substring 'Canvas' not found."); } await settings.SmartYield(); TextAsset textAsset = UnityEditor.AssetDatabase.LoadAssetAtPath($"{OutputAssetPath}/{assetID}"); await settings.SmartYield(); loadProgress.Done(); return textAsset; } /// /// Canvas名を確定する。ImportDataPathのファイル名(拡張子なし)。 /// /// public string DeterminateCanvasNameFromImportDataPath() { return Path.GetFileNameWithoutExtension(InputDataPath); } /// /// CanvasTypeを確定する。ImportDataPathからキーワード検索。 /// /// public CanvasType DeterminateCanvasTypeFromImportDataPath() { var canvasType = CanvasType.None; // フォルダ階層を上へ順に見る var directoryNames = InputDataPath.Replace('\\', '/').Split('/').Reverse(); for (int i = 0; i < directoryNames.Count(); ++i) { // フォルダ名にキーワードがあれば確定 var name = directoryNames.ElementAt(i); if (Regex.IsMatch(name, "landscape", RegexOptions.IgnoreCase)) { canvasType = Runtime.CanvasType.LandScape; break; } else if (Regex.IsMatch(name, "portrait", RegexOptions.IgnoreCase)) { canvasType = Runtime.CanvasType.Portrait; break; } } return canvasType; } } /// /// エディタ用インポート基本設定 /// /// /// /// public static VCCanvasImporterSettings EditorDefaults(string importInputDataPath, string importOutputAssetPath) { var settings = new VCCanvasImporterSettings(); var agent = new EditorImporterSettingsAgent(); agent.InputDataPath = importInputDataPath; agent.OutputAssetPath = importOutputAssetPath; settings.onImportSprite = agent.EditorOnImportSprite; settings.onLoadSprite = agent.EditorOnLoadSprite; settings.onImportHeliodorScript = agent.EditorOnImportHeliodorScript; settings.onLoadHeliodorScript = agent.EditorOnLoadHeliodorScript; settings.determinateCanvasName = agent.DeterminateCanvasNameFromImportDataPath; settings.determinateCanvasType = agent.DeterminateCanvasTypeFromImportDataPath; settings.taskSafeIntervalMS = 1000; return settings; } /// /// 外部アセットを保存 /// /// インポート対象ファイルパス /// インポート元のルートパス /// インポート先のルートパス private static void ImportAsset(string importTargetPath, string assetInputPath, string assetOutputPath, bool isText = false) { var dataFolder = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(importTargetPath))); // ターゲットが"data"ディレクトリ直下ではないとき // "data"ディレクトリを得る //if (Path.GetFileName(Path.GetDirectoryName(dataFolder)) != "data") //{ // // 空白のときは明示的なnullアセットとみなす // if (string.IsNullOrEmpty(dataFolder)) // return; // // ディレクトリ名に"data"が見つかるまで親ディレクトリを探す // dataFolder = Path.GetDirectoryName(dataFolder); // while (Path.GetFileName(Path.GetDirectoryName(dataFolder)) != "data") // { // dataFolder = Path.GetDirectoryName(dataFolder); // if (string.IsNullOrEmpty(dataFolder)) // return; // } // // "data"ディレクトリを得る // dataFolder = Path.GetDirectoryName(dataFolder); //} if(isText) { // Find the index of "Canvas" in the string int index = assetInputPath.IndexOf("Canvas"); if (index != -1) { // Add the length of "Canvas/" to the index to start after this substring assetInputPath = assetInputPath.Substring(index); } else { Debug.Log("Substring 'Canvas' not found."); } } else { // Remove leading "./" if present if (assetInputPath.StartsWith("./")) { assetInputPath = assetInputPath.Substring(2); } } // アセット出力先ディレクトリ var destDir = Path.GetDirectoryName($"{assetOutputPath}/{assetInputPath}"); // アセット読込先 var importedAssetsPath = $"{assetOutputPath}/{assetInputPath}"; // 出力先ディレクトリがなければ作る if (!Directory.Exists(destDir)) Directory.CreateDirectory(destDir); // 読込先ファイルがなければエラー if (!File.Exists($"{dataFolder}/{assetInputPath}")) { Debug.LogError($"Copy Asset Failed: Missing Source File(from {dataFolder}/{assetInputPath}"); return; } // 読込先から出力先へアセットをコピーしAssetDatabaseに登録 File.Copy($"{dataFolder}/{assetInputPath}", importedAssetsPath, true); AssetDatabase.ImportAsset(importedAssetsPath, ImportAssetOptions.ForceUpdate); if (!isText) { var importer = AssetImporter.GetAtPath(importedAssetsPath) as UnityEditor.TextureImporter; importer.textureType = TextureImporterType.Sprite; AssetDatabase.WriteImportSettingsIfDirty(importedAssetsPath); importer.SaveAndReimport(); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } } }