Files
Northbound/Assets/Scripts/Editor/PlayerPrefabSetup.cs
dal4segno cc475bce3e 업그레이드 데이터 입력 로직 및 기능 추가
캐릭터 스탯을 PlayerStats 컴포넌트에서 모아서 관리하도록 변경
코드에서도 마찬가지
2026-02-23 00:21:44 +09:00

88 lines
3.6 KiB
C#

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<GameObject>(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<PlayerStats>();
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<AttackAction>();
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}");
}
}
}