EnemyWeaponMigrationTool.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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. }
  98. void CreateSampleWeaponItems()
  99. {
  100. // Create a folder for sample weapons if it doesn't exist
  101. string folderPath = "Assets/Resources/SampleWeapons";
  102. if (!AssetDatabase.IsValidFolder(folderPath))
  103. {
  104. AssetDatabase.CreateFolder("Assets/Resources", "SampleWeapons");
  105. }
  106. // Create sample sword
  107. var sword = ScriptableObject.CreateInstance<WeaponItem>();
  108. sword.itemName = "Enemy Sword";
  109. sword.description = "A basic sword for enemy characters";
  110. sword.minDamage = 2;
  111. sword.maxDamage = 6;
  112. sword.range = 2;
  113. sword.weaponModifier = 0;
  114. sword.attackSpeed = 1.0f;
  115. sword.weaponType = WeaponType.Sword;
  116. sword.goldCost = 10;
  117. AssetDatabase.CreateAsset(sword, $"{folderPath}/EnemySword.asset");
  118. // Create sample bow
  119. var bow = ScriptableObject.CreateInstance<WeaponItem>();
  120. bow.itemName = "Enemy Bow";
  121. bow.description = "A basic bow for enemy archers";
  122. bow.minDamage = 1;
  123. bow.maxDamage = 6;
  124. bow.range = 100;
  125. bow.weaponModifier = 0;
  126. bow.attackSpeed = 2.0f;
  127. bow.weaponType = WeaponType.Bow;
  128. bow.goldCost = 15;
  129. AssetDatabase.CreateAsset(bow, $"{folderPath}/EnemyBow.asset");
  130. // Create sample dagger
  131. var dagger = ScriptableObject.CreateInstance<WeaponItem>();
  132. dagger.itemName = "Enemy Dagger";
  133. dagger.description = "A fast dagger for quick enemies";
  134. dagger.minDamage = 1;
  135. dagger.maxDamage = 4;
  136. dagger.range = 1;
  137. dagger.weaponModifier = 1;
  138. dagger.attackSpeed = 0.8f;
  139. dagger.weaponType = WeaponType.Dagger;
  140. dagger.goldCost = 8;
  141. AssetDatabase.CreateAsset(dagger, $"{folderPath}/EnemyDagger.asset");
  142. AssetDatabase.SaveAssets();
  143. AssetDatabase.Refresh();
  144. EditorUtility.DisplayDialog("Sample Weapons Created",
  145. $"Created sample weapon assets:\n• Enemy Sword\n• Enemy Bow\n• Enemy Dagger\n\nLocation: {folderPath}",
  146. "OK");
  147. }
  148. void SaveAllChanges()
  149. {
  150. if (enemyAssets == null) return;
  151. int updatedCount = 0;
  152. foreach (var enemy in enemyAssets)
  153. {
  154. if (enemy != null)
  155. {
  156. EditorUtility.SetDirty(enemy);
  157. updatedCount++;
  158. }
  159. }
  160. AssetDatabase.SaveAssets();
  161. AssetDatabase.Refresh();
  162. EditorUtility.DisplayDialog("Migration Complete",
  163. $"Successfully updated {updatedCount} enemy assets.\n\nAll changes have been saved.",
  164. "OK");
  165. }
  166. }