Unity 6.6의 Dictionary 키·값 편집, 중복 키 경고, Prefab 인덱스 주의를 공식 문서에 맞춰 재구성한 설명도입니다.
Unity 6.6의 Dictionary 키·값 편집, 중복 키 경고, Prefab 인덱스 주의를 공식 문서에 맞춰 재구성한 설명도입니다.

6.6부터 Dictionary를 직접 저장할 수 있습니다

Unity 6.6은 Dictionary<TKey, TValue>를 직접 직렬화하고 Inspector에서 키와 값을 두 열로 편집할 수 있습니다. 다만 기존 필드처럼 선언만 해서는 안 됩니다. public 필드라도 Dictionary 직렬화는 명시적으로 선택해야 하므로 [SerializeField]를 붙입니다. 선언 형식도 인터페이스나 사용자 정의 파생형이 아니라 정확히 Dictionary<TKey, TValue>여야 합니다.

```csharp using System.Collections.Generic; using UnityEngine;

public sealed class EnemyHealthTable : MonoBehaviour { [SerializeField] private Dictionary<string, int> enemyHealth = new(); }

List<Dictionary<string, int>>를 그대로 노출하는 대신 List<StageRewards>로 바꾸는 형태입니다. 래퍼 안의 Dictionary에도 [SerializeField]가 필요합니다.

`IDictionary<string, int>`나 Dictionary를 상속한 형식으로 선언하면 같은 기능을 기대할 수 없습니다. Dictionary 필드에 `[SerializeReference]`를 붙이는 방식도 지원되지 않습니다. Inspector에 필드가 나타나지 않는다면 Unity 버전, 실제 선언 형식, `[SerializeField]` 세 가지부터 확인하면 됩니다.

## 키와 값으로 쓸 수 있는 형식이 다릅니다
키와 값에는 기본형, 32비트 이하 enum, Unity 내장형, `[Serializable]`을 붙인 사용자 클래스·구조체, `UnityEngine.Object` 참조를 쓸 수 있습니다. 컬렉션은 값으로 둘 수 있지만 키로는 쓸 수 없습니다. 또 Dictionary를 List나 배열 안에 바로 넣는 중첩 구조는 지원되지 않습니다. 이런 경우 직렬화 가능한 래퍼 형식으로 한 단계를 감쌉니다.

```csharp
using System;
using System.Collections.Generic;
using UnityEngine;

[Serializable]
public sealed class StageRewards
{
    [SerializeField]
    private Dictionary<string, int> rewards = new();
}

public sealed class RewardDatabase : MonoBehaviour
{
    [SerializeField]
    private List<StageRewards> stages = new();
}

Inspector 정렬은 저장 순서를 바꾸지 않습니다

Inspector에서는 행을 추가·삭제하고 열 제목을 눌러 키나 값 기준으로 정렬할 수 있습니다. 이 정렬은 화면 표시만 바꾸며 삽입 순서나 직렬화 순서를 다시 쓰지 않습니다. 검색과 필터, 여러 오브젝트 동시 편집은 지원되지 않습니다.

중복 키가 들어오면 Editor는 해당 행을 보존한 채 경고를 표시합니다. 런타임 Dictionary에는 직렬화된 첫 번째 항목이 들어갑니다. 경고를 본 상태로 두기보다 중복 키를 없애고 저장하는 편이 안전합니다.

Prefab Override는 키가 아니라 인덱스를 따라갑니다

Dictionary가 Prefab에 들어가면 Override는 직렬화된 항목의 인덱스에 연결됩니다. 원본 Prefab이나 에셋에서 중간 항목을 추가·삭제하면 인스턴스의 Override가 다른 항목에 적용될 수 있습니다. Inspector의 Show Serialized Order로 실제 저장 순서를 확인한 뒤 원본 구조를 바꾸고, 기존 인스턴스의 Override를 다시 점검해야 합니다.

검증 범위

공식 문서 대조

검증일

Unity 6.6 Dictionary 직렬화 매뉴얼과 Unity 직렬화 규칙 문서를 대조했습니다. 로컬 Editor 재현이나 성능 측정은 하지 않았으며, Inspector 동작과 제약은 공식 문서 범위로 적었습니다.