🤖

Godot4/GDExtension(C++) RefCountedされたクラスをインスタンス化するにはRef<T>を使う

2023/12/25に公開

Godot4のGDExtension(C++)にて、godot::RefCountedを継承したクラスをインスタンス化する時は、godot::Ref<T>で変数を宣言しgodot::Ref::instantiate()にてインスタンス化します。

godot::ArrayMeshをインスタンス化する例。godot::ArrayMeshgodot::RefCountedを継承しています。

Ref<ArrayMesh> mesh;
mesh.instantiate();
// 好きに使う
mesh->add_surface_from_arrays(/* ... */);

出典

余談

こちらのドキュメントでは以下の通りインスタンス化するよう書かれています。[1]

Ref<MyReference> myref(memnew(MyReference));

しかしながら、私の環境では上の方法でインスタンス化するとメンバ関数を呼び出しした時点でSegmentation Faultになってしまいました。godot::Ref::instantiate()はおおむね上と同じようなことをしているように見えるので、なぜうまく動かないのかは不明です。[2]

脚注
  1. このドキュメントはエンジン開発者向けのドキュメントの一部で、GDExtensionの解説をするドキュメントからはリンクされていません。Experimentalな機能のドキュメントなんてそんなものなんでしょうが、わかりにくい……。 ↩︎

  2. 出典部分の上にあるExample::return_extended_ref()のコメント内容が理由な気がしますが、C++にもgodot::RefCountedにも詳しくないのでよく理解できていないです。 ↩︎

Discussion