コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】UnityでLuaを使用できるようにする「xLua」紹介  C# から Lua のプログラムを実行する方法

f:id:baba_s:20170923092213p:plain

はじめに

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 );

f:id:baba_s:20170925174148p:plain

クラスのインスタンスの参照

-- 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 );

f:id:baba_s:20170925174600p:plain

リストの参照

-- 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 );

f:id:baba_s:20170925175334p:plain

インターフェイスの参照

-- 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 ) );

f:id:baba_s:20170925175837p:plain

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" ) );

f:id:baba_s:20170925180216p:plain

関数の参照

-- example.lua.txt

function Log()
    print( 'リザードン' )
end
// Example.cs

using System;

...

var log = luaenv.Global.Get<Action>( "Log" );
log();
log = null;

f:id:baba_s:20170925180546p:plain

複雑な関数の参照

-- 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 );

f:id:baba_s:20170925181342p:plain

デリゲートの参照

-- 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;

f:id:baba_s:20170925181825p:plain

LuaFunction による参照

-- example.lua.txt

function ShowMessage()
    print( 'カメックス' )
end
// Example.cs

using XLua;

...

var showMessage = luaenv.Global.Get<LuaFunction>( "ShowMessage" );
showMessage.Call();

f:id:baba_s:20170925182108p:plain

関連記事