Unity 3 dでLuaを使用します

11142 ワード

携帯ゲームについては、オンラインでバグ修正や新機能追加などの更新が可能であれば、そのメリットは言うまでもない.
C〓〓〓の反射の構造を通じて(通って)、ある程度のシナリオ級の更新をも実現することができて、具体的に参考にすることができます.
http://docs.unity3d.com/Documentation/Manual/scriptsinassetbundles.html
ただし、iOSでは反射がサポートされていないことも明確に指摘されている.自然に、Lua、Pythonなどのスクリプト言語を使って需要を解決したいです.Pythonはともかく、Luaを見に来ました.
Luua自身はC言語を使って実現していますので、良いクロスプラットフォーム特性を持っています.しかし、C萼を使って、主な開発言語として、Luaとの混合開発を実現するには、C葃版のLuaが一番いいです.万能的なgoogleの助けでUniLua(https://github.com/xebecnan/UniLua)を見つけました.特にその作者xebecnanに感謝します.PS:xebecnanは雲風(雲風ブログ)チームのようです.UniLuaは国人が実現したもので、雲風のユニティ3 dプロジェクトも使用しているのを見たら、すぐに試してみます.
 
今のプロジェクトの前に、Luaの使用経験はほとんどありません.まったく初めからです.国内ではLuaに関する書籍や資料が少ないようですが、本は公式の「Luaプログラミング」が必読です.「Luaゲーム開発実践ガイド」も素早く翻訳できます.個人的には有用な資源があります.
公式ガイドブック-日常旅行必須:http://www.lua.org/manual/5.2/
簡明教程  http://coolshell.cn/articles/10739.html 
LuaとC++の混合プログラミング入門  http://blog.csdn.net/jason3/article/details/5653487
 
Unity 3 dでUniLuaをどのように使うかについては、wikiで説明したように分かります.ここでは、LuaでC((zhi)を呼び出す方法についても言及していますが、静的なメンバ関数を呼び出す例だけを示しています.ここでは、LuaでC(zhi)の非静的なメンバ関数を呼び出す方法を記録します.
既存のCピラーの中のPeople類は以下の通りです.
 1 public class People 

 2 {    

 3     public People(int age)

 4     {

 5         Age = age;

 6     }

 7     

 8     public int Age

 9     {

10         get;

11         set;

12     }

13     

14     public bool IsYounger(People other)

15     {

16         return (Age < other.Age);

17     }

18 }
どのようにluaでPeopleのメンバー関数Is Youngerを呼び出しますか? 
1.C〓〓の対象にどうやってアクセスしますか?light userdataを使って、つまりUniLuaから提供されたPusLight UserData()とToUserData()を使います.
2.C嗲のメンバー関数にどうやってアクセスするか:主にPush CSharpFunction()インターフェースを利用するが、プロセスはやや面倒である.
2.1 C⼕類のメンバー関数を静的メンバー関数としてパッケージ化する(後述の例示コード)
2.2上記の静的メンバ関数をluaのグローバル変数に設定し、luaで呼び出します.
 サンプルコード:
 1 public class PeopleLuaWrapper

 2 {

 3     const string CLASS_NAME = "People";

 4     

 5     public static void RegisterCSharpMethod(ILuaState lua)

 6     {

 7         lua.NewTable();

 8         int method_table = lua.GetTop();

 9         

10         lua.PushString("IsYounger");

11         lua.PushCSharpFunction(IsYounger);

12         lua.SetTable(method_table);    //      table     

13         

14         lua.SetGlobal(CLASS_NAME);    //    CLASS_NAME    

15     }

16     

17         //!                  

18     private static int IsYounger(ILuaState lua)

19     {

20         People invoker = (People)lua.ToUserData(1);    //          

21         People other = (People)lua.ToUserData(2);    //         

22         lua.Pop(2);

23         

24         bool is_younger = invoker.IsYounger(other);

25         lua.PushBoolean(is_younger);    //       

26         

27         return 1;

28     }

29 }
luaからC嗳メンバー関数を呼び出します.
 1 local function Lua_IsYounger(pa, pb)

 2     is_younger = People.IsYounger(pa, pb)

 3     return is_younger

 4 end

 5 

 6 

 7 return

 8 {

 9     Lua_IsYounger = Lua_IsYounger, 

10 }
C〓〓の中でluaコードを呼び出します:
 1         ILuaState lua = LuaAPI.NewState();

 2         lua.L_OpenLibs();

 3         

 4         PeopleLuaWrapper.RegisterCSharpMethod(lua);

 5         

 6         People pa = new People(12);

 7         People pb = new People(123);        

 8         

 9         var status = lua.L_DoFile("People.lua");

10         

11         lua.GetField(-1, "Lua_IsYounger");

12         lua.PushLightUserData(pa);

13         lua.PushLightUserData(pb);

14         lua.Call(2, 1);

15         

16         bool is_younger = lua.ToBoolean(-1);
例のコードは実用的ではないが、C菗とLuaの間の相互起動をどのように実現するかを説明するのに十分であるべきである.
 
私は純粋にLua初心者です.このようなやり方は合理的かどうか分かりません.あるいはもっと簡単な実現方法があります.教えてください.