using System.IO; using UnityEditor; using UnityEngine; using BaseGames.Enemies; namespace BaseGames.Editor.AI { /// /// 敌人 AI 配方脚手架。按 AssetFolderSpec 定名定路径: /// Assets/_Game/Data/Enemies/{EnemyID}/ENM_{EnemyID}_Ai.asset /// public sealed class EnemyAiRecipeWizard : EditorWindow { const string DataRoot = "Assets/_Game/Data/Enemies"; string _enemyId = "E001"; [MenuItem("BaseGames/AI/Enemy AI Recipe Wizard")] static void Open() => GetWindow("敌人 AI 配方向导").minSize = new Vector2(420, 160); void OnGUI() { EditorGUILayout.HelpBox( "创建感知型 AI 配方资产。创建后在 Inspector 里选两层模块(未发现 / 交战)," + "再把资产拖到敌人预制体的 EnemyAiBrain._recipe 上。", MessageType.Info); _enemyId = EditorGUILayout.TextField("敌人 ID(如 E001)", _enemyId); string path = TargetPath(_enemyId); EditorGUILayout.LabelField("产出路径", path); using (new EditorGUI.DisabledScope(string.IsNullOrWhiteSpace(_enemyId))) { if (GUILayout.Button("创建配方资产", GUILayout.Height(28))) Create(_enemyId); } } static string TargetPath(string enemyId) => $"{DataRoot}/{enemyId}/ENM_{enemyId}_Ai.asset"; /// 建配方资产。已存在则选中返回,不覆盖用户已配好的内容。 public static PerceptionRecipeSO Create(string enemyId) { string dir = $"{DataRoot}/{enemyId}"; if (!AssetDatabase.IsValidFolder(dir)) { Directory.CreateDirectory(dir); AssetDatabase.Refresh(); } string path = TargetPath(enemyId); var existing = AssetDatabase.LoadAssetAtPath(path); if (existing != null) { Selection.activeObject = existing; EditorGUIUtility.PingObject(existing); Debug.Log($"配方已存在,已选中:{path}"); return existing; } var so = ScriptableObject.CreateInstance(); AssetDatabase.CreateAsset(so, path); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Selection.activeObject = so; EditorGUIUtility.PingObject(so); Debug.Log($"✔ 已创建 AI 配方:{path}"); return so; } } }