LoginSignup
1
2

More than 5 years have passed since last update.

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

Posted at

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