Unity inspector에서 인터페이스 받고 싶어요.
하고 싶은 일.
이벤트를 느낌이 좋은observable의handler로 변환하기
b. observer
c.subscribe에서 처리하는 것들
나는 이 b와 c가 함께 쓴 반을 비교하고 싶다. 헤어지고 싶다!
b의 inspector에서 c를 바꿀 수 있도록!!
예컨대
uml
(잘 썼는지 자신이 없다)
이상 01 명
Observer
DragObserver.cs
public class DragObserver : MonoBehaviour
{
[SerializeField] private IDragHandler handler;
[SerializeField] private int pointerCount;
[Inject] private UIDragHandler dragHandler;
void Start()
{
dragHandler.OnDragDeltaAsObservable(pointerCount)
.Subscribe(handler.OnDrag);
}
}
interface
IDragHandler.cs
interface IDragHandler
{
void OnDrag(Vector2 delta);
}
이루어지다
TransformRotator.cs
public class TransformRotator : MonoBehaviour, IDragHandler
{
public void OnDrag(Vector2 delta)
{
Rotate();
}
}
리얼리티
물론 인터페이스는 inspector에 표시되지 않습니다.
어떻게든 인터페이스 사용하고 싶어요!시나리오
[Serialize Field]를 소유한 쪽에서 거래하는 경우
base class
InterfaceSerializeFieldMonoBehaviour.cs
public class InterfaceSerializeFieldMonoBehaviour<T> : MonoBehaviour
where T : class
{
[SerializeField] private MonoBehaviour implementsMonoBehaviour;
private T _interface;
protected T Interface
{
get
{
if (_interface == default(T))
{
_interface = implementsMonoBehaviour as T;
}
return _interface;
}
}
protected void OnValidate()
{
var t = implementsMonoBehaviour as T;
if (t == default(T))
{
implementsMonoBehaviour = null;
}
}
}
참조: https://forum.unity3d.com/threads/c-interface-wont-show-in-inspector.383886/#post-2498475Observer
DragObserver.cs
public class DragObserver : InterfaceSerializeFieldMonoBehaviour<IDragHandler>
{
[SerializeField] private int pointerCount;
[Inject] private UIDragHandler dragHandler;
void Start()
{
dragHandler.OnDragDeltaAsObservable(pointerCount)
.Subscribe(Interface.OnDrag);
}
}
응,응
기본적으로 설치
IDragHandler
MonoBehaviour
가 없으면 찔러 상처를 입을 수 없다.abstract로 얼버무리는 방안
abstract class
DragObserverBase.cs
public abstract class DragObserverBase : MonoBehaviour
{
[SerializeField] private int pointerCount;
[Inject] private UIDragHandler dragHandler;
void Start()
{
dragHandler.OnDragDeltaAsObservable(pointerCount)
.Subscribe(OnDrag);
}
protected abstract void OnDrag(Vector2 delta);
}
이루어지다
TransformRotator.cs
public sealed class TransformRotator : DragObserverBase
{
protected override void OnDrag(Vector2 delta)
{
Rotate(delta);
}
}
그야말로
둘 다 안 예뻐요.
Reference
이 문제에 관하여(Unity inspector에서 인터페이스 받고 싶어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/noir_neo/items/8c6222163bc50df1ba43텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)