using Northbound.Data; using UnityEditor; using UnityEngine; namespace Northbound.Editor { public class PlayerPrefabSetup : IPrefabSetup { public string GetTemplateName() { return "Player"; } public static void UpdatePlayerPrefab(PlayerData playerData) { string prefabPath = playerData.prefabPath; if (!prefabPath.EndsWith(".prefab")) { prefabPath += ".prefab"; } GameObject prefabObj = AssetDatabase.LoadAssetAtPath(prefabPath); if (prefabObj == null) { Debug.LogError($"[PlayerPrefabSetup] Player prefab not found at: {prefabPath}"); return; } SetupPrefabComponents(prefabObj, playerData); EditorUtility.SetDirty(prefabObj); PrefabUtility.SavePrefabAsset(prefabObj); Debug.Log($"[PlayerPrefabSetup] Player prefab updated from: {prefabPath}"); } public void SetupPrefab(GameObject prefab, ScriptableObject data) { if (!(data is PlayerData playerData)) { Debug.LogWarning($"[PlayerPrefabSetup] Expected PlayerData, got {data.GetType().Name}"); return; } SetupPrefabComponents(prefab, playerData); } private static void SetupPrefabComponents(GameObject prefab, PlayerData playerData) { // PlayerStats에 모든 스탯 설정 var playerStats = prefab.GetComponent(); if (playerStats != null) { SerializedObject so = new SerializedObject(playerStats); so.FindProperty("baseMaxHp").intValue = playerData.maxHp; so.FindProperty("baseDamage").intValue = playerData.atkDamage; so.FindProperty("baseCapacity").intValue = playerData.capacity; so.FindProperty("baseManpower").floatValue = playerData.manpower; so.FindProperty("baseMoveSpeed").floatValue = playerData.moveSpeed; so.FindProperty("baseSight").floatValue = playerData.sight; so.FindProperty("baseAttackRange").floatValue = playerData.atkRange; so.ApplyModifiedProperties(); Debug.Log($"[PlayerPrefabSetup] Updated PlayerStats: " + $"maxHp={playerData.maxHp}, damage={playerData.atkDamage}, " + $"capacity={playerData.capacity}, manpower={playerData.manpower}, " + $"moveSpeed={playerData.moveSpeed}, sight={playerData.sight}, " + $"attackRange={playerData.atkRange}"); } else { Debug.LogWarning($"[PlayerPrefabSetup] PlayerStats component not found on prefab!"); } // AttackAction의 attackCooldown은 별도 설정 (스탯이 아님) var attackAction = prefab.GetComponent(); if (attackAction != null) { SerializedObject so = new SerializedObject(attackAction); so.FindProperty("attackCooldown").floatValue = playerData.atkIntervalSec; so.ApplyModifiedProperties(); Debug.Log($"[PlayerPrefabSetup] Updated AttackAction: attackCooldown={playerData.atkIntervalSec}"); } EditorUtility.SetDirty(prefab); PrefabUtility.SavePrefabAsset(prefab); Debug.Log($"[PlayerPrefabSetup] Player prefab updated successfully from {playerData.name}"); } } }