예전에 댓글로 좀비키에서 ScriptableObject 어떻게 활용했는지 궁금하다고 했던 이야기도 있었고,

최근에 ScriptableObject를 왜 쓰는지 모르겠다... 이런 글도 많이 있었던 것 같아서

이번 개발일지는 좀비키의 ScriptableObject의 활용 사례 중 하나를 소개할까 해.



좀비키의 “키”에 해당하는 플레이는 단순하게 Lock과 Key로 구성되어 있어.

Lock은 특정 타입의 Key를 몇 개 먹어야 하는지 보여주고,

다 먹은 상태로 가까이 가면 문이 열리는 식으로 동작하게 되어있음.




플레이어가 Key를 먹을 때 숫자를 올리고,

그에 해당하는 Lock을 깜빡이게 하는 단순한 기능이야.




Key와 Lock은 여러 종류가 있고, 종류에 맞게 동작해야 해.





각각의 Key와 Lock을 종류별로 모두 Prefab으로 만들고

각 스테이지, 즉 Scene에 배치하기로 했어.





이렇게 하고 보니, Key와 Lock 간의 상호작용을 Scene 별로 연결해줘야 해.

플레이어가 Key를 먹을 때 Key GameObject에

OnPickUp이라는 UnityEvent를 발생시키도록 만들었는데,

여기에 Lock GameObject를 끌어와서 Count라는 함수를 부르게 해야 했음.


문제는 Key와 Lock의 종류도 많아지고,

Key의 배치도 레벨 디자인하면서 바꾸고 하니까 자꾸 실수하게 되고 번거롭더라고.




그러다 그냥 Prefab끼리 의존성을 연결하면 안 될까? 라는 생각을 하게 됨.





하지만 이건 안 돼.

Prefab을 Scene에 배치할 때 생성되는 GameObject는 그냥 Prefab의 복제본일 뿐이라서,

이 상태로 Scene에 배치하면 엉뚱하게 Lock GameObject가 Key Prefab이랑 연결되거든.





이때 Key Prefab과 Lock Prefab을 연결해주는 장치로 ScriptableObject를 사용할 수 있어.

Slot이라는 ScriptableObject를 만들고, OnPickUp 시에 Slot의 Count를 호출하면,

Slot은 OnCount를 불러서 Lock에 이 이벤트를 전달하게 만들었어.


코드도 아주 단순해.

using System;
using UnityEngine;

[CreateAssetMenu(fileName = "LockCountSlot", menuName = "Zignpost/LockCountSlot")]
public class LockCountSlot : ScriptableObject
{
public event Action OnCount;

public void Count()
{
OnCount?.Invoke();
}
}


Lock 쪽에선 그냥 OnEnable / OnDisable에 OnCount 이벤트에 Count 핸들러를 연결하기만 하면 돼.

public class LockCount : MonoBehaviour
{
[SerializeField] private LockCountSlot slot;

void OnEnable()
{
slot.OnCount += Count;
}

void OnDisable()
{
slot.OnCount -= Count;
}

private void Count() { /* 구현 */ }
}





ScriptableObject는 Asset이기 때문에

GameObject든 Prefab이든 구분 없이 의존하더라도 똑같은 개체거든.

그래서 이 상태로 Prefab을 Scene에 배치하면





새로 생성된 GameObject들은 똑같은 ScriptableObject를 참조하게 되고. 둘은 잘 연결돼.


이렇게 하면 Key는 Key대로, Lock은 Lock대로 Scene에 배치하면 알아서 서로 잘 동작하고,

단순히 귀찮음을 줄여준 것 이상으로 편리했던 것은

Slot이 “숫자 세는 로직”을 분리해서 가지고 있으니까

디버깅용 기능을 만들기도 편리했음.




정리

ScriptableObject는 내가 작성한 코드를
Asset의 형태로 실행할 수 있다는 것이 가장 큰 장점이 아닐까 싶어.

그리고 설계에는 항상 장단점이 있는 법이니까 어떤 방법을 무조건적으 쓰겠다,
이게 아니라 그 설계의 장단점을 이해하고 내 상황에 잘 맞게 쓰는 것이 중요하다고 생각함.


ScriptableObject 활용에 관심있으면 예전에도 한 번 소개한

이 영상을 추천해.




https://store.steampowered.com/app/1167150/Zombies_and_Keys/

좀비키도 꼭 찜해주세요.