단위 편집기 확장에서 레이어 MaskField 표시

거치다


Unity의 기본 Editor GUIlayout에는 Mask 편집 API(레이어 자체 설정 API)가 없는 이유를 알 수 없으므로 자체 제작이 필요합니다.
참조 페이지

샘플 스크립트


다음 스크립트를 Unity 프로젝트의 Editor 폴더 아래에 배치하면 사용할 수 있습니다.
편집기 폴더에 설정하면 게임 논리 측면에서 사용하는 스크립트 내부 #if UNITY_EDITOR 에 포함된 부분의 편집기 확장 부분을 호출할 수 없습니다. (편집기 폴더 안에서만 편집기 확장부의 구조를 만들면 문제없을 것입니다.)
아래 스크립트에서도 사용할 수 있습니다.
그러나 이렇게 하면 일반적인 게임 논리에서도 호출할 수 있기 때문에 파일 출력을 실행할 때 구축 오류가 발생할 수 있습니다...좋은 방법 없어요?
#if UNITY_EDITOR

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

public static class MyEditorGUILayout
{

    // LayerMaskFieldはデフォルトでは無いので自作.
    public static LayerMask LayerMaskField(
        string label,
        LayerMask layerMask)
    {
        List<string> layers = new List<string>();
        List<int> layerNumbers = new List<int>();

        for (var i = 0; i < 32; ++i)
        {
            string layerName = LayerMask.LayerToName(i);
            if (!string.IsNullOrEmpty(layerName))
            {
                layers.Add(layerName);
                layerNumbers.Add(i);
            }
        }

        int maskWithoutEmpty = 0;
        for (var i = 0; i < layerNumbers.Count; ++i)
        {
            if (0 < ((1 << layerNumbers[i]) & layerMask.value))
                maskWithoutEmpty |= 1 << i;
        }

        maskWithoutEmpty = EditorGUILayout.MaskField(label, maskWithoutEmpty, layers.ToArray());
        int mask = 0;
        for (var i = 0; i < layerNumbers.Count; ++i)
        {
            if (0 < (maskWithoutEmpty & (1 << i)))
                mask |= 1 << layerNumbers[i];
        }
        layerMask.value = mask;

        return layerMask;
    }
}
#endif
사용 방법

using UnityEngine;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif

namespace sample
{
    public class Sample : MonoBehaviour
    {

        [SerializeField] LayerMask mask;

#if UNITY_EDITOR

        // エディタ拡張部分.
        [CustomEditor(typeof(Sample))]
        public class SampleEditor : Editor
        {

            public override void OnInspectorGUI()
            {
                var component = target as Sample;
                component.mask = MyEditorGUILayout.LayerMaskField("Layer Mask", component.mask);
            }
        }

#endif

    }
}


실행 화면


상술한 견본 스크립트를 설치하면 다음과 같다.

언젠가 저를 묵인하게 지지해주셨으면 좋겠어요.

좋은 웹페이지 즐겨찾기