Skip to content

Instantly share code, notes, and snippets.

@yamashita8655
Last active December 8, 2015 02:10
Show Gist options
  • Save yamashita8655/f88593d322eabf921af6 to your computer and use it in GitHub Desktop.
Save yamashita8655/f88593d322eabf921af6 to your computer and use it in GitHub Desktop.
Luaメモ2
■UnityでLuaを使いたいので、色々行った検証などをメモしておく
▼目次
○そもそも、Luaと他言語連携ってどうやるのよ?
 ・VC++で色々試して、基本的な使い方はわかった
 ・使い方自体は簡単だったが、思っていたほど単純な物ではなかった
  ・Stateを作って、そこで値をやり取りする事
  ・スタック管理で値を取る事
○じゃぁ、UnityでLuaを使うにはどうするんだ?
 ・NLuaってのがGithubにあるらしい
  https://github.com/Mervill/Unity3D-NLua
 ・これなんなん?どうやって使うんや…。
  ⇒色々調べてみた
 ・README.md曰く
  ・KopiLuaからKeraLuaを使っているよ
   ⇒これは、それぞれ別リポジトリで公開されている
    KopiLua⇒https://github.com/NLua/KopiLua
    KeraLua⇒https://github.com/NLua/KeraLua
  ・ネイティブプラグイン使っているから、UnityPro版でしか動かないよ
  ・試したかったら、defineで「UNITY_3D;LUA_CORE;CATCH_EXCEPTIONS;」を追加してね
  ・それに加えて、使いたい方の定義を書いてね「USE_KOPILUA or USE_KERALUA」
  ・試したけど、
   ・Editor/Android実機では動いた
   ・IOS実機では、KopiもKeraも動かなかった。
    ⇒後でもう少し検証する
○そもそも、Lua使うにはどんなファイルが必要なんだ?DLLだけ?
 ・Unity Lua で引っかかるサンプルを動かしてみた
 ・LuaInterface
  ・Unityのアセットストアから無料で落としてこれる
  ・Editorでは動く
  ・実機では動かない
 ・unitylua
  ・https://github.com/dpull/unitylua
  ・Editor/Android実機/IOS実機で全て動いた
 ・差を見てみたら、
  ・unityluaには、
   ・Assets/Plugins/Android/liblua.so
   ・Assets/Plugins/iOS/liblua.a
   が存在した。
  ・さらに、それらを作成する為の物と思われるプロジェクトもあった
 ・つまり…AndroidとIOSで動かしたい場合は、自分でライブラリを作る必要があるのかもしれない
  ・ただ、そうするとNLuaでAndroid実機が動いた謎が残ってしまう…。つまり、NLuaはもう少し調査するべき案件
○じゃぁ、自分で作ったライブラリで本当にLuaが動くのか検証
 ・ライブラリの作り方(Editor)
  ・VisualStudio2012でDLL作成、空のプロジェクトを作る。
  ・srcフォルダを全て突っ込み、lua.c/luac.c/wmain.cはテストコードらしいので削除。含めると、main関数が複数あるよと怒られる。
  ・プリプロセッサ定義を修正。
   WIN32;NDEBUG;_WINDOWS;_USRDLL;LUA_EXPORTS;LUA_BUILD_AS_DLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)
   DLL作る時は、LUA_BUILD_AS_DLLが必要。
   http://d.hatena.ne.jp/shiku_otomiya/20130416/p1
  ・Lua5.1.nと比べて、エントリーポイント名が若干変わっているので、そこを修正する。
  ・作ったDLLを、Assets/Plugins/x86に配置
  ・[DllImport (LIBNAME, CallingConvention = CallingConvention.Cdecl, EntryPoint = "lua_gc")]
   internal static extern int LuaGC (IntPtr luaState, int what, int data);
   こんな感じで、必要な物を全て持ってくる
   ⇒つまり、これ全部自分で作るのは大変だね…。
  ・今までのサンプルがとりあえず動いた。
  ・20150304追記
   Unity5は、x86_64ディレクトリに入れた物をみにいっているようだ。
   そこに、32BIT版でビルドしたDLLを入れたら
   Failed to load 'Assets/Plugins/x86_64/lua523.dll', expected 64 bit architecture (IMAGE_FILE_MACHINE_AMD64), but was IMAGE_FILE_MACHINE_I386.
   ってエラーが出た。
   VisualStudioで64ビット版の設定をしてビルドしたら、動くようになった。
   http://maggothand.at.webry.info/200909/article_3.html
 ・ライブラリの作り方(Android)
  ・AndroidNDKをインストール(というか、ダウンロードして展開)する
  ・PATHを通す
  ・Android.mkとApplication.mkを用意する
   ⇒今回は、UnityLuaのリポジトリにあった物を参考にコピペと修正をして使った
  ・LOCAL_MODULE := lua523で名前変更
  ・Android.mkのLOCAL_SRC_FILES := $(subst src/wmain.c,,$(LOCAL_SRC_FILES)) を追加。これいらないから。
  ・http://retrocatsoft.blogspot.jp/2012/02/lua-520-on-android-1.html
   とりあえず、ピリオド対応
  ・コマンドラインからndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk
   ※$*を付けたらエラーになったので、消した
  ・ビルド成功して、色々吐き出された
   ・http://www.isus.jp/wp-content/uploads/m_cc_getting_started.htm
   ・x86のは動かなかった(DllNotFoundExceptionになった)
   ・armeabiは動いた。UnityLuaのサンプルに合ったのもこれ。これを使わないといけないみたいだね。
  ・作れたので、Unityのテスト環境に移して実機テストしたら動いた。
  ※参考メモ
 ・ライブラリの作り方(IOS)
  ・Xcode ⇒ Create a new Xcode Project ⇒ Cocoa Touch Static Library
  ・srcにすでに存在するサンプルソースはいらないので削除
  ・srcにLuaのソースコードを追加。その際、wmain、lua、luacなど、main()が存在する物はサンプルコードなので、参照から除外
  ・シェルを作成(これは、正直UnityLua作った人のそのまま)
  ・ターミナルから、そのシェルを実行
  ・Release-iphoneos⇒libプロジェクト名.aが出来ている
  ・UnityのAssets/Plugins/iOSにその.aを突っ込んでめでたく使えるようになる
○環境メモ
XCode6.1
Unity4.5.3
Lua5.1.5/5.2.3
○詰まった所、備忘録
・Unity側、ネイティブプラグイン部分の書き方の問題
 ・どうやら、EntryPointと関数名は同じにしておかないと動かなそうという事。
 ・EntryPointに書くのは、実際にC側に書かれている関数名その物
  [DllImport (LIBNAME, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, EntryPoint = "~~~")]
  internal static extern void ~~~ (IntPtr luaState, int stackPos, string meta);
  IOS版の方は、~~~の部分は同じにしないとどうやら動いてくれない模様
・Xcodeのリンク時エラーで~.oが無いとかなんとか言われたら、とりあえずその関数名がリンクしているDLLから見つからないと思った方がいい。
・実際の問題は出てないけど、改行コードをMAC用の物になってないので、それは気にしておいた方がいいかもしれない
○今後の課題
・ガベコレの挙動調査。どの程度の頻度で、どの程度重いのか
・スタック数管理を考える。
・例外のハンドリングの仕方
・注意:C#側で作ったデリゲートは実体を持ち続けていないと、ガベコレ走って解放されて、Lua側から参照できなくなって動作不定になる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment