Last active
December 8, 2015 02:10
-
-
Save yamashita8655/f88593d322eabf921af6 to your computer and use it in GitHub Desktop.
Luaメモ2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
■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