Unity 플러그인 Odin 시작하기

스토어 주소: Odin
오딘은 에디터를 확장하기 위한 플러그인으로, 다양한 데이터를 직렬화하고 다양한 에디터 인터페이스를 편리하게 생성할 수 있습니다.
여기에 이미지 설명 삽입

여기에 이미지 설명 삽입
Tool–Odin Inspector–Getting Started에 표시된 대로 플러그인을 가져온 후 Odin에서 제공하는 개요 인터페이스를 볼 수 있습니다.
여기에 이미지 설명 삽입
속성 개요 열기를 클릭하면 속성 및 필드 편집 관련 예제가 표시되어 Inspector 인터페이스의 내용을 쉽게 편집할 수 있습니다. Leran More를 클릭하면 일부 팝업 인터페이스를 사용자 정의하는 데 편리한 일부 창 관련 예제가 표시됩니다.
여기에 이미지 설명 삽입
일부 장면 샘플은 추가 연구를 위해 개요 아래에 제공됩니다.
여기에 이미지 설명 삽입
먼저 위 그림과 같이 필드 관련 예제를 보면 왼쪽이 카테고리, 오른쪽 상단이 Inspector 인터페이스에 그려진 내용, 오른쪽 하단이 해당 코드로 복사가 가능합니다. 직접 사용합니다.
Odin은 100개 이상의 속성(Attribute)을 제공하며 위의 스타일을 표시하려면 필드에 속성을 추가하기만 하면 됩니다. 특성은 단순히 필드, 메서드 및 클래스와 같은 요소를 표시하는 데 사용됩니다. 너무 많은 기능을 기억하기 어렵고 일반적으로 적합한 스타일을 찾는 것이 필요합니다.

	//AssetsOnly表示只能拖拽Assets目录下的资源,场景中的资源是无法拖动
	[AssetsOnly]
	public GameObject SomePrefab;
	
	//SceneObjectsOnly相反,只能拖拽Scene场景中的资源
	[SceneObjectsOnly]
	public GameObject SomeSceneObject;

다음은 일반적으로 사용되는 몇 가지 기능을 요약한 것입니다.

1. 값 범위, 슬라이더, 진행률 표시줄 제한

여기에 이미지 설명 삽입

    [Range(0, 100)]
    public int Field = 2;
    
    [MinValue(0)]
    public int IntMinValue0;

    [MaxValue(0)]
    public int IntMaxValue0;

    [ProgressBar(0, 100)]
    public float ProgressBar = 50;

2. 값이 변경되면 특정 방법을 트리거합니다.

	[OnValueChanged("OnValueChanged")]
    public int DelayedField;
    
    //ShowInInspector用于将属性显示到界面上
    [ShowInInspector]
    [OnValueChanged("OnValueChanged")]
    public string DelayedProperty {
    
     get; set; }

    private void OnValueChanged()
    {
    
    
        Debug.Log("Value changed!");
    }

3. 색상

여기에 이미지 설명 삽입

	//字段添加颜色
    [GUIColor(0.3f, 0.8f, 0.8f, 1f)]
    public int ColoredInt1;
    
    //调色板
    [ColorPalette("Fall")]
    public Color Color1;
    
    //按钮添加颜色
    [GUIColor(0, 1, 0)]
    [Button("ButtonName", ButtonSizes.Small)]
    private void ButtonMethod()
    {
    
    
    }

4. 신속한 정보

여기에 이미지 설명 삽입

    //HideLabel用于隐藏字段名
    [Title("Vector3标题")]
    [HideLabel]
    public Vector3 WideVector1;
    
    //Space用于添加一行空隙
    [Space]
    [InfoBox("提示1")]
    public int Int1;
    
    //MyGameObject为空时才会提示
    [Required]
    public GameObject MyGameObject;

5. 입력 확인

여기에 이미지 설명 삽입

    [ValidateInput("HasMeshRenderer")]
    public GameObject DynamicMessage;
    
    private bool HasMeshRenderer(GameObject gameObject, ref string errorMessage)
    {
    
    
        if (gameObject == null) return true;

        if (gameObject.GetComponentInChildren<MeshRenderer>() == null)
        {
    
    
            errorMessage = "\"" + gameObject.name + "\" 必须包含MeshRenderer组件";
            return false;
        }

        return true;
    }
    
    
    [ValidateInput("CheckSpace", "字符串不能有空格", InfoMessageType.Warning)]
    public string Message = "Dynamic";

    private bool CheckSpace(string value)
    {
    
    
        return value.IndexOf(' ') < 0;
    }

6. 드롭다운 목록

여기에 이미지 설명 삽입

    [ValueDropdown("TextureSizes")]
    public int SomeSize1;
    
    private static int[] TextureSizes = new int[] {
    
     256, 512, 1024 };
    
    
    [ValueDropdown("FriendlyTextureSizes")]
    public int SomeSize2;
    
    private static IEnumerable FriendlyTextureSizes = new ValueDropdownList<int>()
    {
    
    
        {
    
     "Small", 256 },
        {
    
     "Medium", 512 },
        {
    
     "Large", 1024 },
    };
    

    [ValueDropdown("TreeViewOfInts", ExpandAllMenuItems = true)]
    public List<int> IntTreview = new List<int>() {
    
     1, 2, 7 };
    
    private IEnumerable TreeViewOfInts = new ValueDropdownList<int>()
    {
    
    
        {
    
     "Node 1/Node 1.1", 1 },
        {
    
     "Node 1/Node 1.2", 2 },
        {
    
     "Node 2/Node 2.1", 3 },
        {
    
     "Node 3/Node 3.1", 4 },
        {
    
     "Node 3/Node 3.2", 5 },
        {
    
     "Node 1/Node 3.1/Node 3.1.1", 6 },
        {
    
     "Node 1/Node 3.1/Node 3.1.2", 7 },
    };

7. 그룹화

여기에 이미지 설명 삽입

    //水平分组
    [HorizontalGroup] 
    public float num;
    
    [HorizontalGroup, Button(ButtonStyle.Box)]
    private void Full(float a, float b, out float c)
    {
    
    
        c = a + b;
    }
    
    //Box分组
    [BoxGroup("Titles")]
    public int A;

    [BoxGroup("Titles")]
    public int B;
    
    //按钮分组
    [ButtonGroup]
    private void C() {
    
     }

    [ButtonGroup]
    private void D() {
    
     }

8. 수집

여기에 이미지 설명 삽입
1. 직렬화된 사전은 SerializedMonoBehaviour를 상속해야 하지만 List는 그렇지 않습니다.

public class Odin学习 : SerializedMonoBehaviour
{
    
    
    public Dictionary<int, Material> IntMaterialLookup;
    
    [OnInspectorInit]
    private void CreateData()
    {
    
    
        IntMaterialLookup = new Dictionary<int, Material>()
        {
    
    
            {
    
     1, ExampleHelper.GetMaterial() },
            {
    
     7, ExampleHelper.GetMaterial() },
        };
    }
}

여기에 이미지 설명 삽입
2. 목록은 기능을 추가하지 않고 사용할 수 있습니다.왼쪽의 슬라이더를 드래그하여 요소의 순서를 조정하십시오.TableList는 List를 테이블 형식으로 변환할 수 있습니다.더하기 기호 왼쪽의 버튼을 클릭하면 원래 목록 형식으로 전환됩니다.

    public List<float> FloatList;
    
    [Range(0, 1)]
    public float[] FloatRangeArray;
    
    [TableList(ShowIndexLabels = true, AlwaysExpanded = true)]
    public List<SomeCustomClass> TableListWithIndexLabels = new List<SomeCustomClass>()
    {
    
    
        new SomeCustomClass(),
        new SomeCustomClass(),
    };
    
    [Serializable]
    public class SomeCustomClass
    {
    
    
        [TableColumnWidth(57)]
        [PreviewField(Alignment = ObjectFieldAlignment.Center)]
        public Texture Icon;

        [TextArea]
        public string A, B;
    }

9. 조건

여기에 이미지 설명 삽입

    public bool IsToggled;

    [DisableIf("IsToggled")]
    public int DisableIfToggled;
    
    [EnableIf("IsToggled")]
    public int EnableIfToggled;
    
    [DisableInEditorMode]
    public GameObject A;

    [DisableInPlayMode]
    public Material B;

    [HideIf("IsToggled")]
    public Vector3 HiddenWhenToggled;

    [ShowIf("IsToggled")]
    public Vector2 VisibleWhenToggled;

10. 리소스 목록

여기에 이미지 설명 삽입

	//显示该路径下的材质,路径前面的Assets不用写
    [AssetList(Path = "Materials/")]
    public List<Material> AssetList;
    
    [AssetList(AssetNamePrefix = "Line")]
    public List<Material> MaterialsStartingWithLine;

11. 창

여기에 이미지 설명 삽입

public class Odin窗口 : OdinEditorWindow
{
    
    
    [MenuItem("Tools/简单窗口")]
    private static void OpenWindow()
    {
    
    
        var window = GetWindow<Odin窗口>();
        window.position = GUIHelper.GetEditorWindowRect().AlignCenter(500, 500);
    }

    [EnumToggleButtons]
    public ViewTool SomeField;
}

Supongo que te gusta

Origin blog.csdn.net/sinat_34014668/article/details/125957699
Recomendado
Clasificación