2021. 12. 16. 16:39
Unity
https://docs.unity3d.com/kr/2021.3/Manual/editor-PropertyDrawers.html
공식 매뉴얼
비슷한것으론 DecoratorDrawer가 있다
[ReadOnly] 로 사용
이건 내가 만든게 아니다
원문링크 : https://discussions.unity.com/t/how-to-make-a-readonly-property-in-inspector/75448
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
[CustomPropertyDrawer(typeof(ReadOnlyAttribute))]
public class ReadOnlyDrawer : PropertyDrawer
{
public override float GetPropertyHeight(SerializedProperty property,GUIContent label)
{
return EditorGUI.GetPropertyHeight(property, label, true);
}
public override void OnGUI(Rect position,SerializedProperty property,GUIContent label)
{
GUI.enabled = false;
{
EditorGUI.PropertyField(position, property, label, true);
}
GUI.enabled = true;
}
}
#endif
public class ReadOnlyAttribute : PropertyAttribute
{
}
이걸로 다중배열은 안 되니 뻘짓하지 말자
왜냐면 배열은 프로퍼티드로워는 OnGUI에서 하위 항목만 접근 가능하고
다중배열은 접근불가하게 원천으로 차단해버린다
그리고 이걸로 버튼 어트리뷰트 만들어볼려고 했는데 필드에만 선언이 되어서
ContextMenu로 대체했다
자세한건 어트리뷰트 참고
그리고 툴 만들다가 드로워로 클래스별 인스펙터를 구현할 일이 있어서 만들었다
몰론 바로 폐기되었지만 언젠가 또 쓸일이 있을듯
기능제약은 심하지만 간결해서 빠르게 작성할수 있다는점이 좋다
이 코드는 https://github.com/ahzkwid/AhzkwidAvatarTools 이곳에 잠깐 사용되었다가 삭제되었다
#if UNITY_EDITOR
using UnityEditor;
using UnityEditorInternal;
[CustomPropertyDrawer(typeof(BlendshapeSettingDataAttribute))]
public class BlendshapeSettingDataDrawer : PropertyDrawer
{
public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
{
var fieldRect = rect;
fieldRect.width /= 2;
{
var path = nameof(BlendshapeAutoSetter.BlendshapeSettingData.name);
EditorGUI.PropertyField(fieldRect, property.FindPropertyRelative(path), new GUIContent(path), true);
}
fieldRect.x += fieldRect.width;
EditorGUI.PropertyField(fieldRect, property.FindPropertyRelative(nameof(BlendshapeAutoSetter.BlendshapeSettingData.value)), label, true);
}
}
public class BlendshapeSettingDataAttribute : PropertyAttribute
{
}
#endif
public class BlendshapeAutoSetter : MonoBehaviour
{
[System.Serializable]
public class BlendshapeSettingData
{
public string name;
[Range(0,100)]
public float value = 100;
}
[System.Serializable]
public class BlendshapeTarget
{
public Mesh mesh;
[BlendshapeSettingData]
public List<BlendshapeSettingData> blendshapeValues;
//public Dictionary<string,float> keyValuePairs = new Dictionary<string,float>();
}
bool success = false;
public bool autoDestroy = true;
public List<BlendshapeTarget> blendshapeTargets = new List<BlendshapeTarget>();
}