믹스인
믹스인은 상속을 사용할 수 없는 상황에서 다양한 엔티티 간에 코드를 재사용하는 방법이에요. 데이터 인풋과 트리거를 포함한 재사용 가능한 로직의 집합이라고 생각할 수 있어요.
타입 정의
Mixin 타입을 상속하여 믹스인 타입을 정의할 수 있어요. 아래와 같이 정의해요:
public class PositionMixin : Mixin {
[DataInput]
public Vector3 Position;
[Trigger]
public void GeneratePosition() {
SetDataInput(nameof(Position), new Vector3(Random.value, Random.value, Random.value), broadcast: true);
}
}
이제 이 믹스인을 엔티티 서브타입에 포함할 수 있어요. 예를 들어, PositionMixin을 커스텀 에셋에 포함하려면 다음과 같이 해요:
[AssetType(...)]
public class PositionAsset : Asset {
[Mixin]
public PositionMixin PositionMixin;
}
에셋과 마찬가지로 노드에도 믹스인을 포함할 수 있어요:
[NodeType(...)]
public class PositionNode : Node {
[Mixin]
public PositionMixin PositionMixin;
}
믹스인을 포함할 때는 [Mixin] 속성을 추가해야 해요. 또한 엔티티가 생성될 때 자동으로 인스턴스화되므로 값을 직접 할당할 필요는 없어요. 믹스인의 데이터 인풋과 트리거에 바로 접근할 수 있어요:
// Within entity
public override void OnCreate() {
base.OnCreate();
var initialPosition = PositionMixin.Position;
PositionMixin.GeneratePosition();
}
하지만 SetDataInput과 InvokeTrigger 같은 메서드는 믹스인 자체에서는 사용할 수 없어요. 데이터 인풋과 트리거는 기술적으로 믹스인을 포함하는 엔티티에 속해 있으므로 다음과 같이 작성해야 해요:
// Within entity
SetDataInput(nameof(PositionMixin.Position), new Vector3(1, 2, 3), broadcast: true);
InvokeTrigger(nameof(PositionMixin.GeneratePosition));
믹스인 내부에서 엔티티와 해당 메서드에 접근하려면 Owner 속성을 사용해요:
// Within mixin
Position = new Vector3(9, 8, 7);
Owner.BroadcastDataInput(nameof(Position));
Owner.Watch(nameof(Position), OnPositionChanged);