Unity 인스펙터에서 사전과 같은 키-값 쌍을 편집하는 방법은 무엇입니까?


18

작성중인 스펠 시스템이 있는데 그 원리는 다음과 같습니다.

  • 각 주문은 자율적 인 조립식입니다. 인스펙터에서 수정할 수있는 몇 가지 속성 (기본 손상, ​​지속 시간 ...)이 포함 된 스크립트가 포함되어 있습니다.
  • 게임 로직에서 사용되는 코드에 가능한 모든 철자를 나열하는 Spell 열거 형이 있습니다.
  • 주문을 시전하려면이 주문의 조립식을 가져 와서 인스턴스화하고 정보를 읽을 수 있어야합니다.
  • 각 액터 (플레이어 또는 적이든)는 스펠에 사용할 수있는 애니메이션 목록이 있어야합니다.

구현하려는 방법의 문제점은 다음과 같습니다.

  • 각 액터의 애니메이션을 나열하기 위해을 사용할 수 Dictionary<Spell, Animation>있지만 사전은 검사기에서 지원하지 않으므로 여러 액터 유형을 쉽게 편집하기가 어렵습니다.
  • 해당 열거 형에서 주문 프리 팹에 쉽게 액세스 할 수있는 방법이 필요합니다. 여기에서도 사전을 사용할 수는 있지만 코드가 아닌 인스펙터에서 프리 팹 만 참조 할 수 있습니다. 즉,이 사전을 채울 수 없습니다.

스펠 열거 형을 해당 프리 팹 및 애니메이션에 쉽게 연결할 수있는 방법을 찾고 있습니다


1
Unity 관리자에서 사전과 유사한 동작 (키-값 쌍 매핑)을 가져 오기 위해이 질문의 제목을 변경하는 것이 좋습니다. 이렇게하면 이런 종류의 문제를 해결할 아이디어가 있거나 찾는 다른 사용자가 쉽게 질문을 찾을 수 있습니다. 이 특정 사례는 주문에 관한 것이지만 동일한 기술이 더 광범위하게 적용됩니다.
DMGregory

@DM 나는 Unity를 모르지만, 당신의 일반적인 추론은 합리적입니다. 대담 하고 편집하십시오. 롤백 이 저렴합니다.
Anko

답변:


24

Unity 인스펙터에서 키-값 쌍을 얻는 빠른 방법 중 하나는 직렬화 가능한 엔트리 클래스를 정의한 다음 배열 또는 List <>를 사용하는 것입니다. 예를 들어 ...

public class SpellAnimationMap : ScriptableObject
{
   [System.Serializable]
   public class SpellAnimationEntry
   {
       public Spell spell;
       public AnimationClip animation;
   }

   public SpellAnimationEntry[] spellAnimations;    
}

그러면 자동으로 사용자 지정 관리자를 작성할 필요없이 키와 값을 입력 할 수있는 크기 조정 가능한 목록이 관리자에 표시됩니다.

결과는 다음과 같습니다.

자동 생성 검사기

(한 가지 트릭 : 직렬화 된 항목 클래스에 "이름"필드가 포함 된 경우 해당 "문자열 0"머리글 대신 해당 문자열이 표시됩니다.보다 복잡한 데이터를 효율적으로 탐색하려는 경우 유용합니다.

이를 ScriptableObject로 만들면 동일한 애니메이션 세트가 필요한 엔티티 유형 / 인스턴스간에 공유 된 자산으로 처리 할 수 ​​있습니다. (다른 클래스는 Unity에서 인스턴스별로 직렬화되는 경향이 있습니다). 이 경로로 이동하려면 Assets 폴더에 인스턴스를 만들 수 있는 작은 편집기 스크립트를 추가해야 합니다 .


편집 : 이제 훨씬 쉬워졌습니다 . ScriptableObject 위에이 속성을 추가하면됩니다 .

[CreateAssetMenu(fileName = "fileName.asset", menuName = "Some Folder/Menu Label")]

그러면 ScriptableObject가 Create 메뉴에 다음과 같이 배치됩니다. Unity에서 맞춤형 제작 메뉴를 보여주는 스크린 샷


선택적으로 배열을 검사기에 표시되도록 개인용 및 직렬화 할 수 있지만 클라이언트가보다 효율적인 조회를 위해 사용할 수 있도록 공용 사전 (또는 공용 GetAnimation (Spell spell) 방법을 사용하는 개인 사전)을 추가 할 수 있습니다. OnEnable () 메소드에서 SpellAnimationMap은 인스펙터가 채워진 배열을 반복하여이 사전을 한 번 작성하고 모든 클라이언트 인스턴스간에 이점을 다시 공유 할 수 있습니다. (자산이 처음 생성 될 때 편집기에서 OnEnable ()도 호출되므로 배열을 읽기 전에 널이 아닌지 확인하십시오.)

마지막으로이 항목 데이터 유형에 필요한만큼 추가 할 수 있습니다. 예를 들어 프리 팹도 포함 할 수도 있고, 맞춤법 키에 연결하려는 다른 많은 데이터 비트도 포함될 수 있습니다.

Dictionary <,> 필드를 직접 채우기 위해 사용자 지정 관리자를 작성할 수도 있지만 매끄럽게 작업하는 것은 까다로운 일입니다.


대답을 기다리는 동안 내가했던 일을 정확하게 받아들이겠습니다.
Malharhak

0

@DMGregory가 제공 한 설명을 읽으십시오

예를 좋아하는 사람들에게 :

public class SpellHandler : ScriptableObject
{
    public Spell[] keys;
    public Animation[] values;

    private Dictionary<Spell, Animation> dic;

    void Awake()
    {
        int length = keys.Length;
        this.dic= new Dictionary<Spell, Animation>(length);
        for (int i = 0; i < length; i++)
        {
            this.dic.Add(keys[i], values[i]);
        } 
    }    
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.