Photon Quantum3 Component 定義、セット、取得

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)) {
        // 処理を記述
    }
}
タイトルとURLをコピーしました