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