Posted at

luaのrequireについて(cocos2d-x)

More than 1 year has passed since last update.


Env


  • cocos2d-x 3.14.1

  • macOS Sierra 10.12.1


Description

luaファイルを読み込む

また、読み込んで取得したモジュールはキャッシュされるため、

2回目以降requireをしても読み込まず、キャッシュをそのまま返却する


Usage

よくやるやり方とハマるポイントのまとめ

最初は、自分もファイルパスでしかrequireできないと思ってたけど

意外と方法は結構ある


ファイルパスで読み込む

package.pathにluaファイルの検索パスを追記する。

追記する場合は、環境パスに追記するみたいにセミコロン(;)で区切る

ちなみにここが少しcocos2d-xだとハマるポイントで

例えば以下のような階層のA.luaでrequire("B")をしても

not foundになってしまうので注意が必要

src/sample/A.lua

/B.lua

cocos2d-xでは、カレントディレクトリ検索のパスをpackage.pathに追記したとしても

必ずFileUtilsのsearchPathから検索されるため、見つからない

この場合、対処法としては以下のどちらか


  • FileUtilsのsearchPathにsampleを追加する

FileUtils:getInstance():addSearchPath("src/sample")


  • requireのパスを変更する

require("sample.B")


requireできるモジュールを関数で追加する

モジュールを返却する関数をpackages.preloadにインサートする

packages.preload[module_name] = function()

local _M = {}

...

return _M
end

例えば以下のようにすれば、上記のファイルパスで読み込むの手順を踏まなくても

require("B")でsample/B.luaを読み込むことができる

packages.preload["B"] = function()

return require("sample.B")
end


キャッシュに直接モジュールを追加する

packages.loaded[module_name]にrequire(module_name)の結果が

キャッシュされていて次回以降はrequire(module_name)で

packages.loaded[module_name]が返されるようになるというのを利用する

packages.loaded[module_name] = _M

例えば以下のようにすれば、上記のファイルパスで読み込むの手順を踏まなくても

require("B")でsample/B.luaを読み込むことができる

packages.loaded["B"] = require("sample.B")