using UnityEngine;
using UnityEditor;
using System.IO;
///
/// Editor utility to help migrate EnemyCharacterData assets to use WeaponItem references
/// instead of WeaponType enums
///
public class EnemyWeaponMigrationTool : EditorWindow
{
private bool showInstructions = true;
private Vector2 scrollPosition;
[MenuItem("RPG Tools/Enemy Weapon Migration Tool")]
static void Init()
{
EnemyWeaponMigrationTool window = (EnemyWeaponMigrationTool)EditorWindow.GetWindow(typeof(EnemyWeaponMigrationTool));
window.titleContent = new GUIContent("Enemy Weapon Migration");
window.Show();
}
void OnGUI()
{
GUILayout.Label("Enemy Weapon Migration Tool", EditorStyles.boldLabel);
GUILayout.Space(10);
showInstructions = EditorGUILayout.Foldout(showInstructions, "Instructions");
if (showInstructions)
{
EditorGUILayout.HelpBox(
"This tool helps migrate existing EnemyCharacterData assets to use WeaponItem references instead of WeaponType enums.\n\n" +
"BEFORE MIGRATION:\n" +
"1. Create WeaponItem assets for your desired weapons\n" +
"2. Configure weapon stats, prefabs, and class names\n" +
"3. Save the WeaponItem assets in your project\n\n" +
"MIGRATION PROCESS:\n" +
"1. Click 'Find Enemy Assets' to scan for EnemyCharacterData assets\n" +
"2. Review the list of enemies found\n" +
"3. For each enemy, drag the appropriate WeaponItem into the field\n" +
"4. Click 'Apply Changes' to update the assets\n\n" +
"NOTE: This migration is manual to ensure you assign the correct weapons.",
MessageType.Info);
}
GUILayout.Space(10);
if (GUILayout.Button("Create Sample WeaponItem Assets"))
{
CreateSampleWeaponItems();
}
GUILayout.Space(10);
if (GUILayout.Button("Find EnemyCharacterData Assets"))
{
FindEnemyAssets();
}
GUILayout.Space(10);
// Display found assets
if (enemyAssets != null && enemyAssets.Length > 0)
{
GUILayout.Label($"Found {enemyAssets.Length} Enemy Assets:", EditorStyles.boldLabel);
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
for (int i = 0; i < enemyAssets.Length; i++)
{
var enemy = enemyAssets[i];
if (enemy != null)
{
EditorGUILayout.BeginHorizontal("box");
EditorGUILayout.LabelField(enemy.enemyName, GUILayout.Width(120));
EditorGUILayout.LabelField($"Health: {enemy.maxHealth}", GUILayout.Width(80));
// Show current weapon assignment
enemy.preferredWeapon = (WeaponItem)EditorGUILayout.ObjectField(
"Weapon:",
enemy.preferredWeapon,
typeof(WeaponItem),
false,
GUILayout.Width(200));
if (GUILayout.Button("Select Asset", GUILayout.Width(100)))
{
Selection.activeObject = enemy;
EditorGUIUtility.PingObject(enemy);
}
EditorGUILayout.EndHorizontal();
}
}
EditorGUILayout.EndScrollView();
GUILayout.Space(10);
if (GUILayout.Button("Save All Changes"))
{
SaveAllChanges();
}
}
}
private EnemyCharacterData[] enemyAssets;
void FindEnemyAssets()
{
string[] guids = AssetDatabase.FindAssets("t:EnemyCharacterData");
enemyAssets = new EnemyCharacterData[guids.Length];
for (int i = 0; i < guids.Length; i++)
{
string path = AssetDatabase.GUIDToAssetPath(guids[i]);
enemyAssets[i] = AssetDatabase.LoadAssetAtPath(path);
}
}
void CreateSampleWeaponItems()
{
// Create a folder for sample weapons if it doesn't exist
string folderPath = "Assets/Resources/SampleWeapons";
if (!AssetDatabase.IsValidFolder(folderPath))
{
AssetDatabase.CreateFolder("Assets/Resources", "SampleWeapons");
}
// Create sample sword
var sword = ScriptableObject.CreateInstance();
sword.itemName = "Enemy Sword";
sword.description = "A basic sword for enemy characters";
sword.minDamage = 2;
sword.maxDamage = 6;
sword.range = 2;
sword.weaponModifier = 0;
sword.attackSpeed = 1.0f;
sword.weaponType = WeaponType.Sword;
sword.goldCost = 10;
AssetDatabase.CreateAsset(sword, $"{folderPath}/EnemySword.asset");
// Create sample bow
var bow = ScriptableObject.CreateInstance();
bow.itemName = "Enemy Bow";
bow.description = "A basic bow for enemy archers";
bow.minDamage = 1;
bow.maxDamage = 6;
bow.range = 100;
bow.weaponModifier = 0;
bow.attackSpeed = 2.0f;
bow.weaponType = WeaponType.Bow;
bow.goldCost = 15;
AssetDatabase.CreateAsset(bow, $"{folderPath}/EnemyBow.asset");
// Create sample dagger
var dagger = ScriptableObject.CreateInstance();
dagger.itemName = "Enemy Dagger";
dagger.description = "A fast dagger for quick enemies";
dagger.minDamage = 1;
dagger.maxDamage = 4;
dagger.range = 1;
dagger.weaponModifier = 1;
dagger.attackSpeed = 0.8f;
dagger.weaponType = WeaponType.Dagger;
dagger.goldCost = 8;
AssetDatabase.CreateAsset(dagger, $"{folderPath}/EnemyDagger.asset");
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
EditorUtility.DisplayDialog("Sample Weapons Created",
$"Created sample weapon assets:\n• Enemy Sword\n• Enemy Bow\n• Enemy Dagger\n\nLocation: {folderPath}",
"OK");
}
void SaveAllChanges()
{
if (enemyAssets == null) return;
int updatedCount = 0;
foreach (var enemy in enemyAssets)
{
if (enemy != null)
{
EditorUtility.SetDirty(enemy);
updatedCount++;
}
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
EditorUtility.DisplayDialog("Migration Complete",
$"Successfully updated {updatedCount} enemy assets.\n\nAll changes have been saved.",
"OK");
}
}