0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

defold の `go.get_position()` みたいな関数はどこで定義されているのか

Posted at

tl;dr

go. で始まる関数は、ゲームエンジンのレイヤーに C++ で実装されており、C++ と lua を連携させる機能によって lua から叩けるようになっている。

背景

defold のチュートリアル をやっていると、突然 go.get_position() のようなコードが現れ、

The name go does not refer to the current game object. It is the name of the Lua module that contains all game object functions.

などとあっさり説明されるが、lua のことをよくわかっていないのも相まっていまいち腑に落ちない。

気になってチュートリアルの内容が頭に入ってこなくなってしまったので、深入りしない範囲で調べた。

調査

github の defold リポジトリを get_position で雑に検索すると、下記のコードがヒットする。ファイル名からしていかにもそれっぽい。ゲームエンジン自体のソースコードで、C++ で実装されているようだ。

よく見ると、検索にヒットしたのは doc コメントの部分で、関数自体は Script_GetPosition という名前だった。そこで今度はこの Script_GetPosition で検索すると、同ファイル内に GO_methods という連想配列のようなものがヒットする。

最後にその GO_methods で検索すると、再び同ファイル内に luaL_register(L, "go", GO_methods); なるコードがヒットする。名前からしてそれっぽいが、luaL_register は C 言語の関数を lua へ連携するときに使う関数のようだ。第二引数が "go" なのもそれっぽい。

まとめ

go. で始まる関数の呼び出し経路がざっくりとわかったのでよかった。とりあえず「天から降ってきた関数」とでも思っておけばよさそうだ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?