Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Entity hierarchy #55

Closed
rrbox opened this issue Dec 7, 2023 · 7 comments
Closed

Entity hierarchy #55

rrbox opened this issue Dec 7, 2023 · 7 comments
Assignees
Labels
close: Normal 要件が達成された issue tag: v0.2 for version 0.2 type: Enhancement New feature or request
Milestone

Comments

@rrbox
Copy link
Owner

rrbox commented Dec 7, 2023

以下の Component を追加します。

  • Parent
  • Child

Entity 間で親子関係が作られた際に、Child と Parent がそれぞれ子と親に追加されます。Child は親の Entity が含まれています。Parent はこの Entity の配列が含まれます。

@rrbox rrbox changed the title Entity hir Entity hierarchy Dec 7, 2023
@rrbox rrbox added tag: v0.2 for version 0.2 type: Enhancement New feature or request labels Dec 7, 2023
@rrbox
Copy link
Owner Author

rrbox commented Dec 7, 2023

Entity hierarchy と SKNode や SCNNode1 の hierarchy とで連携する必要があります(というより、それが一番の目的です)。SpriteKit や SceneKit1 での使用を前提とするなら、Graphic 関連の plugin に導入してもいいかもしれません。

Footnotes

  1. SceneKit のサポートは v0.1.0 時点では未実装です。あと、今後サポートするかも未定です... 2

@rrbox
Copy link
Owner Author

rrbox commented Dec 8, 2023

仕様

子 Entity 追加時に Graphic の有無をチェックする

Graphic ひもづけ時に、親の有無をチェックする

自分に親がいたら、親に Graphic があるかをチェックし、親がグラフィックを持っていたら addChild です。

Graphic ひもづけ時に、子が Graphic を持っているかチェックする

Graphic を持っていたら、自分の Graphic の子ノードとして addChild します。

子の取り合いをしない(親が複数存在する状態をつくらない & 同じ子を持たない)

Graphic と紐づいていないときもこのチェックは必要になります。

Graphic と紐づけることを必須とする場合は、SKNode が自動的に検知して実行時エラーになるので、特に注意する必要はないです。

親がデスポーンしたら子もデスポーンする

WillDespawnEvent を使えば多分できます。

注意点として、先に SKNode が削除されてしまう場合、unown let の参照先が消えることで despawn 時の自動 remove from parent 実行機能がエラーになる可能性があることです。SKNode 削除前に entity との繋がりをなくす何らかの仕組みを実装したいところです。

@rrbox
Copy link
Owner Author

rrbox commented Dec 8, 2023

let child = commands.spawn().id()

commands.spawn()
    .addChild(child)

@rrbox
Copy link
Owner Author

rrbox commented Dec 8, 2023

struct Child: Component {
    var _parent: Entity
    var parent: Entity {
        self._parent
    }
}

struct Parent: Component {
    var _children: Set<Entity>
    var children: Set<Entity> {
        self._children
    }
}

@rrbox rrbox added this to the version 0.2.0 milestone Jan 16, 2024
@rrbox
Copy link
Owner Author

rrbox commented Feb 13, 2024

Graphic が entity に紐づいていない場合はクラッシュする、という実装も考えられます。これは、entity hierarchy の機能が graphic の座標系に関するものだからです。

上記の実装の場合、setGraphic の際に ChildParent をコンポーネントとして追加し、entity hierarchy の管理を始めるのが最もシンプルだと思います。

また、一度 entity に紐づけられた SKNode, SCNNode を取り外せないようにするべきかもしれません。こうすることで、entity hierarchy 内の graphic が勝手に ECS 管理外になるのを観測する手間が省けます。

@rrbox
Copy link
Owner Author

rrbox commented Feb 29, 2024

Graphic は spawn 後の entity に割り当てられ、基本的に Scene resource で指定された Scene に配置されます。したがって、Add child command はすでに scene を親に持った SKNode を操作することになります。SKNode の removeFromParent を実行すればエラーなしで階層に追加できますが、「親を複数持つ entity の禁止」ができなくなります。

  • spawn された entity は graphic がない
  • graphic がある entity が spawn されると、entity は親を持たず、node は scene を親に持つ
  • すでに spawn された entity に graphic が割り当てられると、node は scene を親に持つ
  • add child すると、entity は他の entity を親とし、node は親 entity の node を親にする

@rrbox
Copy link
Owner Author

rrbox commented May 6, 2024

Entity hierarchy と node hierarchy の連動

内部コンポーネントとして _AddChildTransaction を提案します。

内部

親 entity を nil 許容型で保持します var parentEntity: Entity?。nil の場合、コマンド実行時に SceneResource のノードが親ノードになります。

以下のような System を作成します。

  • Query3<Entity, _AddChildTransaction, Graphic<SKNode>>
  • Query<Graphic>
  • Resource<SceneResource>
  • Commands
  1. 第1引数 第2要素 parentEntity を使用して 第2引数から親ノードを受け取り、 addChild
  2. 第1引数 第2要素 parentEntity が nil の場合、SceneResource から SKScene を引っ張ってきて addChild
  3. 第1引数 第1要素 entity を使用して commands.entity(entity).removeComponent(_AddChildTransaction.self) を実行

Set graphic 内の addChild 処理はすべて削除し、_AddChildTransaction を追加する処理を記述します。

  • 通常は _AddChildTransactionparentEntity = nil を指定します。
  • add child メソッドによるヒエラルキー作成の場合は、親ノードを指定します。

追記

上記のシステムの中で、コンポーネント ChildParent を追加する処理を加えましょう。

@rrbox rrbox self-assigned this May 13, 2024
@rrbox rrbox added status: Merge pending Develop ブランチにマージする直前の issue close: Normal 要件が達成された issue and removed status: Merge pending Develop ブランチにマージする直前の issue labels Jun 2, 2024
@rrbox rrbox closed this as completed Jun 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
close: Normal 要件が達成された issue tag: v0.2 for version 0.2 type: Enhancement New feature or request
Projects
Status: Done
Development

No branches or pull requests

1 participant