Quick Reference
authoring data는 Editor에서 만드는 공유 definition이고, runtime state는 한 play session·actor·save slot에서 바뀌는 값입니다. 이 둘은 같은 data model의 field라도 owner와 reset 방식이 다릅니다.
| 값의 성격 | 둘 위치 | reset·저장 owner |
|---|---|---|
| base damage·icon·cooldown rule | ScriptableObject/prefab definition | content build·designer |
| current HP·ammo·remaining cooldown | actor runtime state | spawn/despawn owner |
| quest progress·inventory count | save snapshot | save service·slot |
| scene reference·spawn point | scene composition | scene load/unload |
| runtime에서 바뀌는 shared config | 별도 session config | mode/session owner |
[CreateAssetMenu]
public sealed class WeaponDefinition : ScriptableObject
{
public int baseDamage;
public float cooldownSeconds;
}
[System.Serializable]
public sealed class WeaponState
{
public int currentAmmo;
public float cooldownRemaining;
}source of truth를 정하기
WeaponDefinition은 여러 weapon instance가 reference로 공유할 수 있는 원본입니다. WeaponState는 spawn 때 definition을 읽어 만들고, actor마다 따로 소유합니다. state가 definition을 참조하는 것은 자연스럽지만 definition asset에 currentAmmo를 기록하기 시작하면 같은 asset을 쓴 actor들이 상태를 공유하게 됩니다.
save data는 runtime object 자체가 아니라 stable ID와 필요한 value를 담은 snapshot으로 만듭니다. object instance ID, scene object reference, UI cache를 그대로 저장하면 load 시점과 scene 구조에 묶입니다. migration이 필요한 값은 schema version과 default/fallback policy를 save owner가 가집니다.
Unity asset의 runtime 변경
ScriptableObject는 UnityEngine.Object asset이며, 여러 prefab이 같은 asset을 reference로 공유할 수 있습니다. Editor에서 Play Mode 중 asset을 변경하면 편집 상태에 영향을 줄 수 있어 debugging과 authoring이 섞일 수 있습니다. deployed build에서 ScriptableObject asset을 runtime save store처럼 사용할 수 없으므로, player progress는 save system이나 runtime state에 둡니다.
definition의 값을 runtime에서 temporary modifier로 바꾸고 싶다면 mutable copy 또는 modifier layer를 둡니다. difficulty, live config, experiment처럼 session 전체가 같은 값을 읽어야 하는 경우도 asset을 직접 mutate하기보다 session config가 effective value를 계산하게 합니다. 그래야 reset과 new session의 시작값이 예측됩니다.
reset과 복제 검증
같은 definition을 공유하는 actor 두 개를 spawn해 한쪽의 damage·ammo·cooldown이 다른 쪽에 새지 않는지 test합니다. scene reload, pool release/get, save/load, Editor Play Mode 재시작에서 어떤 값이 definition으로 돌아가고 어떤 값이 snapshot에서 복원되는지도 확인합니다.
Inspector에 보인다는 이유만으로 저장 대상이 되지는 않습니다. 값마다 authoring owner, runtime owner, save owner 중 하나를 먼저 지정해야 shared asset mutation과 reset 버그를 막을 수 있습니다.
참고 링크
2 sources