Unity

유니티 SerializeHashSet, HashSet직렬화

washble2 2026. 2. 3. 17:05

Unity Inspector에 HashSet을 Serialize하고 쓸 수 있게 해줍니다.

 

 

Dictionary를 Serialize하고 싶으시면 아래 링크를 참고해주세요

https://blog.naver.com/washble2/222950029589

 

유니티 SerializeDictionary, Dictionary직렬화

유니티에서는 inspector에 Dictionary가 보이지 않습니다. 이럴 때 유용히 쓰는 것에 SerializeDictiona...

blog.naver.com

 

 

 

전체 코드입니다.

using System;
using System.Collections.Generic;
using UnityEngine;

[Serializable]
public class SerializeHashSet<T> : HashSet<T>, ISerializationCallbackReceiver
{
    [SerializeField] private T[] setData = Array.Empty<T>();

    public void OnBeforeSerialize()
    {
        if (!Application.isPlaying) { return; }
        
        RefreshDataType();
    }

    public void OnAfterDeserialize()
    {
        Clear();
        for (int i = 0; i < setData.Length; ++i)
        {
            Add(setData[i]);
        }
    }

    public T[] GetDataType()
    {
        return setData;
    }

    public void RefreshDataType()
    {
        if (this.Count != setData.Length) { setData = new T[this.Count]; }
        int num = 0;
        foreach (T item in this) { setData[num++] = item; }
    }

    public SerializeHashSet() { }
    public SerializeHashSet(IEnumerable<T> collection) : base(collection) { }
    public SerializeHashSet(IEnumerable<T> collection, IEqualityComparer<T> comparer) : base(collection, comparer) { }
    public SerializeHashSet(IEqualityComparer<T> comparer) : base(comparer) { }
    public SerializeHashSet(int capacity) : base(capacity) { }
    public SerializeHashSet(int capacity, IEqualityComparer<T> comparer) : base(capacity, comparer) { }
    protected SerializeHashSet(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
}

 

 

ISerializationCallbackReceiver를 사용하여

- OnBeforSerialize는 HashSet에 값이 들어가기 전에 작동해야할 것을 구현해 줍니다.

- OnAfterDeserialize는 HashSet에 Deserialize한 후 작동해야할 것을 구현해 줍니다.

 

또한 상속시켜서 필요한 함수들을 추가하여 원하는 기능들을 넣을 수 있습니다.