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")