メモりながらドキュメント読むとめちゃくちゃ理解が捗るじゃん、ってのを今発見しています。すごい。今までなんだったんだ。眠くもならないしすごい。仕事でドキュメント書く必要あるしなというドキュメント駆動はよくやっていたんだけど個人でも有用なんだね(あほ)

前回書いたの: Reality Composer Pro編

Systems編

  • 出典: Implementing systems for entities in a scene
  • 前回書いたのと似たようなSystemの利点が概要に書かれている。特に別のentityの状態に依存するentityのロジックとかにうってつけ。(前回書いたダメージシステムみたいな)
  • Systemプロトコルに従うクラスを作ることでsystemwお作ることができる。
    • init(scene:)update(context:)を実装する。セットアップ的なことを前者でやるか、やることなければ空でいい。後者は毎フレームRealityKitが自動で呼び出す。
    • update(context:)はめちゃ呼び出されるので重いとアプリのフレームレートが落ちるので注意
  • 効率的にentityをsceneから取得するにはEntityQueryを使う。
  • 全entity取得もできるけど、大抵は特定のcomponent
  • を持ってるentityだけ、とか表示されてるやつらだけするだろう、ということでそういうことができる。
  • QueryPredicateを作ってEntityQueryに渡す。
  • queryは呼び出しごとに条件に変更がなければsystem classのスタティックプロパティにする。update呼び出ごとに変わる場合はupdateメソッド内で作る。
  • entities(matching:updatingSystemWhen:)をupdate medhodで呼ぶことでそのsystemが関連するentityをイテレートすることができる。
struct MyComponent: Component {
  // 必要なステートを定義する
}

class MySystem: System {
  private static let query = EntityQuery(where: .has(MyComponent.self))

  required init(scene: Scene) {}

  func update(context: SceneUpdateContext) {
    for entity in context.entities(
      matching: Self.query,
      updatingSystemWhen: .rendering
    ) {
      // entityへ毎アップデートごとの変更を加える。
    }
  }
}
  • Reality Kit ProでAdd Component→New Componentとすると新しいcomponent用のテンプレートでファイルが作られてXcodeで編集できる。Reality Composer Pro package内のファイルで定義したcomponentはReality Composer Pro内のAdd Componentから追加できる。(そして↑で作ったようなsystemでqueryを書いて取得することができる)

  • とあるsystemが別のsystemの後に実行されないといけないなど依存関係を定義するには dependenciesの配列をstatic varで定義して、.after(SystemA.self)みたいな要素を入れる。(元のページ参照のこと)

  • systemのインスタンスは自分では作らない。MySystem.registerSystem()で登録することで勝手にやってくれる。Viewを表示する前にやること。