Serialize Reference 의 사용법을 모르기 때문에 억지로 사용해 보려고 합니다.

17162 단어 Unity

드디어 인터페이스를 서열화할 수 있는 새로운 기능이 추가되었습니다.


2019.3.0b4
나는 실리콘밸리라는 것을 참을 수 없다.
Obj.cs
public class Obj : MonoBehaviour
{
    [SerializeReference]
    public SomeInterface なんかのインターフェース;
}
Interface.cs
public interface SomeInterface
{
    void NumberChange();
    int Number { get; }
}

[Serializable]
public class SomeImplementType1 : SomeInterface
{

    [SerializeField]
    private int EditableNumber = 0;

    private readonly int ConstantNumber = 8;

    public int Number => EditableNumber + ConstantNumber;

    public void NumberChange()
    {
        EditableNumber++;
    }
}

[Serializable]
public class SomeImplementType2 : SomeInterface
{
    [SerializeField]
    private int EditableNumber = 0;
    [SerializeField]
    private byte EditableNumber_Byte = 0;

    public int Number => EditableNumber + EditableNumber_Byte;

    public void NumberChange()
    {
        EditableNumber = 0;
        EditableNumber_Byte = 0;

    }
}

이게 뭐야???????????????????????????????????????


클릭이든 우클릭이든 아무 일도 일어나지 않기 때문에 왜
이미 보였기 때문에 나는 실리콘밸리를 밟았다
편집 확장에서 억지로 사용하기
PermissionAttribute.cs
using System;
using UnityEngine;

[System.AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
public sealed class PermissionAttribute : PropertyAttribute
{
    public readonly Type[] Types;

    public PermissionAttribute(params Type[] types)
    {
        Types = types;
    }
}
using System.Linq;
using UnityEngine;
using UnityEditor;
using System;

[CustomPropertyDrawer(typeof(PermissionAttribute))]
public class SerializeReferenceDrawer : PropertyDrawer
{

    private int ActivateTypeIndex;
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        var permission = attribute as PermissionAttribute;
        EditorGUI.BeginChangeCheck();
        //fieldInfoはリフレクションのFieldInfo、基底クラスのPropertyDrawerが描画しているPropertyが入っている
        var targetProperty = fieldInfo.GetValue(property.serializedObject.targetObject);
        //Popup用に高さを調整、調整しないとプロパティが触れなくなる
        position.height = 16;
        var popUpTypeText = permission.Types.Select(type => type.ToString()).ToArray();
        var targetObject = property.serializedObject.targetObject;
        if (targetProperty == null)
        {
            ActivateTypeIndex = EditorGUI.Popup(position, ActivateTypeIndex, popUpTypeText);
            var instance = Activator.CreateInstance(permission.Types[ActivateTypeIndex]);
            fieldInfo.SetValue(targetObject, instance);
        }
        else
        {
            ActivateTypeIndex = EditorGUI.Popup(position, Array.IndexOf(permission.Types, targetProperty.GetType()), popUpTypeText);
            if (targetProperty.GetType() != permission.Types[ActivateTypeIndex])
            {
                var instance = Activator.CreateInstance(permission.Types[ActivateTypeIndex]);
                fieldInfo.SetValue(targetObject, instance);
            }
        }
        //Popupでかさが増えた分を描画をしたへずらす
        position.y += 16;
        position.height = EditorGUI.GetPropertyHeight(property, true) + 14;
        EditorGUI.PropertyField(position, property, label, true);
        property.serializedObject.ApplyModifiedProperties();
        EditorGUI.EndChangeCheck();
    }

    public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
    {
        return EditorGUI.GetPropertyHeight(property, label, true) + base.GetPropertyHeight(property, label);
    }
}

사용처


Obj.cs
using UnityEngine;
using UnityEngine.UI;

public class Obj : MonoBehaviour
{
    [SerializeField]
    private Button Button;
    //使いたいものを型で指定する
    [SerializeReference, Permission(typeof(SomeImplementType1), typeof(SomeImplementType2))]
    public SomeInterface なんかのインターフェース;


    private void Awake()
    {
        Button.onClick.AddListener(() =>
        {
            なんかのインターフェース.NumberChange();
            Button.GetComponentInChildren<Text>().text = なんかのインターフェース.Number.ToString();
        });
    }
}

너무 좋아요.



Type1 점증, Type2 재설정 동작
Unity를 리셋하든 게임을 하든 가치가 있기 때문에 사용할 수 있다
Activator를 사용해서 그런지 ↓ 0이 대입된 것은 자신의 코드의 문제이다
private readonly int ConstantNumber = 8;
행동을 바꾸는 데는 많은 진전이 있는 것 같다

그런 거 아니에요.


어쨌든 너를 이렇게 귀찮게 할 수는 없다
뭐 공부 해요?
누가 나에게 좋은 사용법을 가르쳐 줄 수 있겠는가
속성이 있는데 아직 못 쓰나요?

좋은 웹페이지 즐겨찾기