はじめに
xLua は C# ( Unity、.Net、Mono ) で Lua を使用できるようにするアセットで、
Android、iOS、Windows、Linux、OSX などをサポートしており
GitHub からダウンロードして使用することができます
今回は xLua で C# から Lua のプログラムを実行する方法を紹介していきます
変数の参照
-- example.lua.txt id = 25 name = 'ピカチュウ' isMale = true
// Example.cs var id = luaenv.Global.Get<int>( "id" ); var name = luaenv.Global.Get<string>( "name" ); var isMale = luaenv.Global.Get<bool>( "isMale" ); Debug.Log( id ); Debug.Log( name ); Debug.Log( isMale );
クラスのインスタンスの参照
-- example.lua.txt character = { m_id = 25, m_name = 'ピカチュウ', }
// Example.cs public class Character { public int m_id; public string m_name; } ... var character = luaenv.Global.Get<Character>( "character" ); Debug.Log( character.m_id ); Debug.Log( character.m_name );
リストの参照
-- example.lua.txt character = { 5, 10, 15, }
// Example.cs var character = luaenv.Global.Get<List<int>>( "character" ); Debug.Log( character[ 0 ] ); Debug.Log( character[ 1 ] ); Debug.Log( character[ 2 ] ); Debug.Log( character.Count );
インターフェイスの参照
-- example.lua.txt character = { Id = 25, Name = 'ピカチュウ', Add = function( self, a, b ) print( 'Character.Add' ) return a + b end }
// Example.cs using XLua; ... [CSharpCallLua] public interface ICharacter { int Id { get; set; } string Name { get; set; } int Add( int a, int b ); } ... var character = luaenv.Global.Get<ICharacter>( "character" ); Debug.Log( character.Id ); Debug.Log( character.Name ); Debug.Log( character.Add( 5, 10 ) );
LuaTable による参照
-- example.lua.txt character = { m_id = 25, m_name = 'ピカチュウ', }
// Example.cs var character = luaenv.Global.Get<LuaTable>( "character" ); Debug.Log( character.Get<int>( "m_id" ) ); Debug.Log( character.Get<string>( "m_name" ) );
関数の参照
-- example.lua.txt function Log() print( 'リザードン' ) end
// Example.cs using System; ... var log = luaenv.Global.Get<Action>( "Log" ); log(); log = null;
複雑な関数の参照
-- example.lua.txt function Battle( id, name ) print( id, name ) return "勝利", { m_coin = 512, m_exp = 1024 } end
// Example.cs using XLua; ... public class Result { public int m_coin; public int m_exp; } [CSharpCallLua] public delegate string Battle( int id, string name, out Result c ); ... var func = luaenv.Global.Get<Battle>( "Battle" ); Result result; var message = func( 25, "ピカチュウ", out result ); func = null; Debug.Log( message ); Debug.Log( result.m_coin ); Debug.Log( result.m_exp );
デリゲートの参照
-- example.lua.txt function ShowMessage() print( '5 ダメージ!' ) end function Attack() print( '攻撃' ) return ShowMessage end
// Example.cs using XLua; ... [CSharpCallLua] public delegate Action Attack(); ... var attack = luaenv.Global.Get<Attack>( "Attack" ); var showMessage = attack(); showMessage(); attack = null; showMessage = null;
LuaFunction による参照
-- example.lua.txt function ShowMessage() print( 'カメックス' ) end
// Example.cs using XLua; ... var showMessage = luaenv.Global.Get<LuaFunction>( "ShowMessage" ); showMessage.Call();