스파르타코딩클럽_Unity개발과정

유니티 심화 개인주차 (2) - Json, 오브젝트 풀링, 스크립터블 오브젝트

ybbro 2025. 6. 5. 23:24

1. 간단한 JSON을 이용한 PlayerPrefs에 데이터 저장/불러오기

int형으로 각각 나눠서 stage, wave, gold 등 이렇게 각 타입별로 넣고는 했는데

 

오늘 강의에서 한번에 해결하는 것을 보고 큰 충격을 받았습니다.

사고가 굳었는지 기존에는 이렇게 할 생각을 하지 못했네요.

고정관념의 벽을 하나 허물은 느낌입니다.

 

JSON으로 데이터를 직렬화하면 그 데이터들이 하나의 문자열이 됩니다.

이는 UnityEngine 네임 스페이스 안의 JsonUtility를 써서 클래스를 문자열로 바꿀 수 있습니다.

 

몇가지 제약 조건이 있는데 아래와 같습니다.

1) [System.Serializable] 클래스

2) 기본 자료형인 public 변수 (GameObject, Transform과 같은 유니티 객체는 직렬화 불가)

3) 딕셔너리 직렬화 불가

4) 루트에 리스트/배열이 있을 경우 직렬화 불가

5) 인터페이스, 추상화 클래스 직렬화 불가

 

대부분의 제약은 Newtonsoft.Json을 사용하면 해결이 가능합니다.

해당 패키지를 설치하여 사용한다면,

위의 3) ~ 5) 제약이 없어지고 직렬화 가능해집니다.

그리고 2) public이 아닌 private 변수에도 [JsonProperty] 를 붙여 직렬화 가능하죠.

 

Json에 대한 간단한 설명은 마치고

직렬화하여 나온 문자열을 통째로 PlayerPrefs에 저장하더군요.

간단한 싱글게임에서는 아주 단순하게 저장 가능한 방법이 되리라 생각합니다.

 

 

2. 인터페이스를 활용한 오브젝트 풀링

기존에도 오브젝트 풀링을 쓰긴 했지만,

이번엔 강의에서 인터페이스를 활용하여 구현하는 것을 보아 이 방법을 정리하면서 복습하고자 합니다.

 

1) 인터페이스

using System;

public interface IPoolable
{
    void Initialize(Action<GameObject> returnAction);
    void OnDespawn();
}

 

2) 인터페이스를 상속하여 구현

    Action<GameObject> returnToPool;

    // 초기화 때 풀에 돌아가는 액션 등록
    public void Initialize(Action<GameObject> returnAction)
    {
        returnToPool = returnAction;
    }

    // 오브젝트를 풀에 다시 넣고 비활성화
    public void OnDespawn()
    {
        returnToPool?.Invoke(gameObject);
    }

 

3) 오브젝트 풀 호출 시

            // 해당 풀에 남은 오브젝트가 있다면
            if (pools[prefabIndex].Count > 0)
            {
                // 큐에서 하나 빼주기
                obj = pools[prefabIndex].Dequeue();
            }
            // 해당 풀에 남은 게 없다면, 새로 만들어서 풀에 돌아가는 메서드를 넣어주기
            else
            {
                obj = Instantiate(prefabs[prefabIndex]);
                if (obj.TryGetComponent(out IPoolable poolable))
                    poolable.Initialize(x => ReturnObject(prefabIndex, x));
            }

 

오브젝트를 생성하면서 Initialize()에 풀로 되돌아오고 비활성화하는 Action을 넣어줍니다.

해당 Action을 OnDespawn()에 받아서 오브젝트 사용이 끝났을 때 호출하면 오브젝트를 풀에서 꺼내고 다시 넣는 순환이 완성됩니다.

 

 

 

3. 스크립터블 오브젝트