EnemyWeaponMigrationTool.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.IO;
  4. /// <summary>
  5. /// Editor utility to help migrate EnemyCharacterData assets to use WeaponItem references
  6. /// instead of WeaponType enums
  7. /// </summary>
  8. public class EnemyWeaponMigrationTool : EditorWindow
  9. {
  10. private bool showInstructions = true;
  11. private Vector2 scrollPosition;
  12. [MenuItem("RPG Tools/Enemy Weapon Migration Tool")]
  13. static void Init()
  14. {
  15. EnemyWeaponMigrationTool window = (EnemyWeaponMigrationTool)EditorWindow.GetWindow(typeof(EnemyWeaponMigrationTool));
  16. window.titleContent = new GUIContent("Enemy Weapon Migration");
  17. window.Show();
  18. }
  19. void OnGUI()
  20. {
  21. GUILayout.Label("Enemy Weapon Migration Tool", EditorStyles.boldLabel);
  22. GUILayout.Space(10);
  23. showInstructions = EditorGUILayout.Foldout(showInstructions, "Instructions");
  24. if (showInstructions)
  25. {
  26. EditorGUILayout.HelpBox(
  27. "This tool helps migrate existing EnemyCharacterData assets to use WeaponItem references instead of WeaponType enums.\n\n" +
  28. "BEFORE MIGRATION:\n" +
  29. "1. Create WeaponItem assets for your desired weapons\n" +
  30. "2. Configure weapon stats, prefabs, and class names\n" +
  31. "3. Save the WeaponItem assets in your project\n\n" +
  32. "MIGRATION PROCESS:\n" +
  33. "1. Click 'Find Enemy Assets' to scan for EnemyCharacterData assets\n" +
  34. "2. Review the list of enemies found\n" +
  35. "3. For each enemy, drag the appropriate WeaponItem into the field\n" +
  36. "4. Click 'Apply Changes' to update the assets\n\n" +
  37. "NOTE: This migration is manual to ensure you assign the correct weapons.",
  38. MessageType.Info);
  39. }
  40. GUILayout.Space(10);
  41. if (GUILayout.Button("Create Sample WeaponItem Assets"))
  42. {
  43. CreateSampleWeaponItems();
  44. }
  45. GUILayout.Space(10);
  46. if (GUILayout.Button("Find EnemyCharacterData Assets"))
  47. {
  48. FindEnemyAssets();
  49. }
  50. GUILayout.Space(10);
  51. // Display found assets
  52. if (enemyAssets != null && enemyAssets.Length > 0)
  53. {
  54. GUILayout.Label($"Found {enemyAssets.Length} Enemy Assets:", EditorStyles.boldLabel);
  55. scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
  56. for (int i = 0; i < enemyAssets.Length; i++)
  57. {
  58. var enemy = enemyAssets[i];
  59. if (enemy != null)
  60. {
  61. EditorGUILayout.BeginHorizontal("box");
  62. EditorGUILayout.LabelField(enemy.enemyName, GUILayout.Width(120));
  63. EditorGUILayout.LabelField($"Health: {enemy.maxHealth}", GUILayout.Width(80));
  64. // Show current weapon assignment
  65. enemy.preferredWeapon = (WeaponItem)EditorGUILayout.ObjectField(
  66. "Weapon:",
  67. enemy.preferredWeapon,
  68. typeof(WeaponItem),
  69. false,
  70. GUILayout.Width(200));
  71. if (GUILayout.Button("Select Asset", GUILayout.Width(100)))
  72. {
  73. Selection.activeObject = enemy;
  74. EditorGUIUtility.PingObject(enemy);
  75. }
  76. EditorGUILayout.EndHorizontal();
  77. }
  78. }
  79. EditorGUILayout.EndScrollView();
  80. GUILayout.Space(10);
  81. if (GUILayout.Button("Save All Changes"))
  82. {
  83. SaveAllChanges();
  84. }
  85. }
  86. }
  87. private EnemyCharacterData[] enemyAssets;
  88. void FindEnemyAssets()
  89. {
  90. string[] guids = AssetDatabase.FindAssets("t:EnemyCharacterData");
  91. enemyAssets = new EnemyCharacterData[guids.Length];
  92. for (int i = 0; i < guids.Length; i++)
  93. {
  94. string path = AssetDatabase.GUIDToAssetPath(guids[i]);
  95. enemyAssets[i] = AssetDatabase.LoadAssetAtPath<EnemyCharacterData>(path);
  96. }
  97. Debug.Log($"Found {enemyAssets.Length} EnemyCharacterData assets");
  98. }
  99. void CreateSampleWeaponItems()
  100. {
  101. // Create a folder for sample weapons if it doesn't exist
  102. string folderPath = "Assets/Resources/SampleWeapons";
  103. if (!AssetDatabase.IsValidFolder(folderPath))
  104. {
  105. AssetDatabase.CreateFolder("Assets/Resources", "SampleWeapons");
  106. }
  107. // Create sample sword
  108. var sword = ScriptableObject.CreateInstance<WeaponItem>();
  109. sword.itemName = "Enemy Sword";
  110. sword.description = "A basic sword for enemy characters";
  111. sword.minDamage = 2;
  112. sword.maxDamage = 6;
  113. sword.range = 2;
  114. sword.weaponModifier = 0;
  115. sword.attackSpeed = 1.0f;
  116. sword.weaponType = WeaponType.Sword;
  117. sword.weaponClassName = "SimpleSword";
  118. sword.goldCost = 10;
  119. AssetDatabase.CreateAsset(sword, $"{folderPath}/EnemySword.asset");
  120. // Create sample bow
  121. var bow = ScriptableObject.CreateInstance<WeaponItem>();
  122. bow.itemName = "Enemy Bow";
  123. bow.description = "A basic bow for enemy archers";
  124. bow.minDamage = 1;
  125. bow.maxDamage = 6;
  126. bow.range = 100;
  127. bow.weaponModifier = 0;
  128. bow.attackSpeed = 2.0f;
  129. bow.weaponType = WeaponType.Bow;
  130. bow.weaponClassName = "SimpleBow";
  131. bow.goldCost = 15;
  132. AssetDatabase.CreateAsset(bow, $"{folderPath}/EnemyBow.asset");
  133. // Create sample dagger
  134. var dagger = ScriptableObject.CreateInstance<WeaponItem>();
  135. dagger.itemName = "Enemy Dagger";
  136. dagger.description = "A fast dagger for quick enemies";
  137. dagger.minDamage = 1;
  138. dagger.maxDamage = 4;
  139. dagger.range = 1;
  140. dagger.weaponModifier = 1;
  141. dagger.attackSpeed = 0.8f;
  142. dagger.weaponType = WeaponType.Dagger;
  143. dagger.weaponClassName = "SimpleSword"; // Using sword class as base
  144. dagger.goldCost = 8;
  145. AssetDatabase.CreateAsset(dagger, $"{folderPath}/EnemyDagger.asset");
  146. AssetDatabase.SaveAssets();
  147. AssetDatabase.Refresh();
  148. Debug.Log("Created sample WeaponItem assets in " + folderPath);
  149. EditorUtility.DisplayDialog("Sample Weapons Created",
  150. $"Created sample weapon assets:\n• Enemy Sword\n• Enemy Bow\n• Enemy Dagger\n\nLocation: {folderPath}",
  151. "OK");
  152. }
  153. void SaveAllChanges()
  154. {
  155. if (enemyAssets == null) return;
  156. int updatedCount = 0;
  157. foreach (var enemy in enemyAssets)
  158. {
  159. if (enemy != null)
  160. {
  161. EditorUtility.SetDirty(enemy);
  162. updatedCount++;
  163. }
  164. }
  165. AssetDatabase.SaveAssets();
  166. AssetDatabase.Refresh();
  167. Debug.Log($"Updated {updatedCount} enemy assets");
  168. EditorUtility.DisplayDialog("Migration Complete",
  169. $"Successfully updated {updatedCount} enemy assets.\n\nAll changes have been saved.",
  170. "OK");
  171. }
  172. }