Unity에서 Dictionary 자료구조를 Inspector에 띄우는 방법

YSK·2024년 9월 25일

컴퓨터 정보

목록 보기
3/18

그냥 SerializeField로 해서는 안되고,
Dictionary 클래스를 부모로 상속받는 클래스를 따로 만들어서 이 클래스를 사용해야 한다.

<코드>

using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>,  ISerializationCallbackReceiver
{
    [SerializeField] private List<TKey> keys = new List<TKey>();
    [SerializeField] private List<TValue> values = new List<TValue>(); 

    public void OnBeforeSerialize()
    {
        keys.Clear();
        values.Clear();
        foreach (KeyValuePair<TKey, TValue> kvp in this)
        {
            keys.Add(kvp.Key); 
            values.Add(kvp.Value); 
        }
    }

    public void OnAfterDeserialize()
    {
        this.Clear();

        if(keys.Count != values.Count)
        {
            throw new System.Exception("No Key"); 
        }

        for(int i=0; i<keys.Count; ++i)
        {
            this.Add(keys[i], values[i]);  
        }
    }
}

이 클래스를 불러올때는 그냥 Dictionary를 위에서 새로 상속받아 만든 클래스 이름으로 바꿔서 선언하면 된다.


이렇게 Inspector에 키와 값 형태로 출력되서 수정할 수 있게 된다.

<출처>

https://code-piggy.tistory.com/entry/Unity-SerializeField%EC%A7%81%EB%A0%AC%ED%99%94-SystemSerializable

(여기서는 클래스를 불러올때 약간 다르게 선언했는데 사실 그냥 Dictionary 쓰는 방식으로 이름만 바꿔서 바로 선언해도 상관없다.)

<2024-09-29 수정>

Dictionary 클래스 뿐만 아니라 ISerializationCallbackReceiver 인터페이스도 상속받아야 한다.
그렇지 않으면 Inspector에 뜨기는 하는데 실제로 가져오면 아무것도 들어오지 않는다.
보니까 OnBeforeSerialize 메소드와 OnAfterDeserialize 메소드가 작동되지 않는듯.

profile
1999.10.03/Software&Games Developer

0개의 댓글