ComponentはQuantum ESCで使用でき、.qtn拡張子ファイルに記述でき、Entityにアタッチできる構造体に変換されます。
生成されたComponentの値を変更し、Entityの状態を管理します。
UnityDOTsのComponentをQUANTUM ENTITY PROTOTYPEで管理するのがQuantum Componentです。
コード
.qtn
component SomethingComponent
{
FP Something;
}
component
このラベルを付けることで自動でC#構造体に変換され、GameSceneのGameObjectにアタッチしているQUANTUM ENTITY PROTOTYPEのEntity Componentの+ボタンを押すことで、作成したComponent名の最初にQPrototypeがついたComponentを選択できるようになります。
SomethingComponentでは、QPrototypeSomethingComponentが選択できるようになります。
FP
型名で、FPはQuantumの決定論的な型で、似ている型はfloat型です。
フィールドの値をまとめる
struct型を使用することでフィールドの値をまとめることができます。
.qtn
struct Something
{
FP Value;
FP MaxValue;
FP MinValue;
}
.qtn
component SomethingConfig
{
Something Health;
Something Power;
Something Speed;
}
EntityのComponent取得
Filterを使用する
SystemMainThreadFilter<T.Filter>を使用する方法で、UnityDOTsで例えるならforeach()内のRefRWのようです。
SomethingSystem.cs
namespace Quntum
{
public unsafe class SomethingSystem : SystemMainThreadFilter<SomethingSystem.Filter>
{
public override void Update(Frame f, ref Filter filter)
{
// 処理を記述
filter.SComponent->Something = filter.SConfig->Health.Value
}
public struct Filter
{
// 必ず指定
public EntityRef Entity;
// 取得したいComponentには「*」ポインターを付ける
public SomethingComponent* SComponent;
public SomethingConfig* SConfig;
}
}
}
Entityから直接探す
Get<T>(EntityRef)を使用することで引数のEntityにTのComponentを取得する。
この時に指定は.qtnで指定した名前。
UnityDOTsで例えるならSystemAPI.GetComponent<T>(entity);のような感じ。
// 例外が返る可能性のある記述
private void SetSomething(Frame f, EntityRef entity, FP value){
// Componentがアタッチされていない場合例外が出力される
var sComponent = frame.Get<SomethingComponent>(entity);
// Componentの値を変更
sComponent.Something = value;
// 変更したComponentをEntityにセットする
frame.Set(entity, sComponent);
}
// 安全な記述
public void Something(Frame f, EntityRef entity, FP value) {
// コンポーネントが無い場合はfalse
if (f.TryGet<SomethingComponent>(entity, out var somethingComponent)) {
// 処理を記述
}
// コンポーネントが無い場合はfalse
if (f.Has<SomethingComponent>(entity)) {
// 処理を記述
}
}
