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();
}
}
}