Serialize Reference 의 사용법을 모르기 때문에 억지로 사용해 보려고 합니다.
17162 단어 Unity
드디어 인터페이스를 서열화할 수 있는 새로운 기능이 추가되었습니다.
2019.3.0b4
나는 실리콘밸리라는 것을 참을 수 없다.
Obj.cspublic class Obj : MonoBehaviour
{
[SerializeReference]
public SomeInterface なんかのインターフェース;
}
Interface.cspublic 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.csusing 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.csusing 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;
행동을 바꾸는 데는 많은 진전이 있는 것 같다
그런 거 아니에요.
어쨌든 너를 이렇게 귀찮게 할 수는 없다
뭐 공부 해요?
누가 나에게 좋은 사용법을 가르쳐 줄 수 있겠는가
속성이 있는데 아직 못 쓰나요?
Reference
이 문제에 관하여(Serialize Reference 의 사용법을 모르기 때문에 억지로 사용해 보려고 합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Basuhei_Acheron/items/50c949a7d5cb9c17db1f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
public class Obj : MonoBehaviour
{
[SerializeReference]
public SomeInterface なんかのインターフェース;
}
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;
}
}
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);
}
}
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();
});
}
}
private readonly int ConstantNumber = 8;
어쨌든 너를 이렇게 귀찮게 할 수는 없다
뭐 공부 해요?
누가 나에게 좋은 사용법을 가르쳐 줄 수 있겠는가
속성이 있는데 아직 못 쓰나요?
Reference
이 문제에 관하여(Serialize Reference 의 사용법을 모르기 때문에 억지로 사용해 보려고 합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Basuhei_Acheron/items/50c949a7d5cb9c17db1f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)