LuaInterfaceその1

環境構築

手っ取り早く環境を整えたかったのでYaneuraoGameSDK.NETを使用して構築しました。
Lua.NET for Yanesdk.NETとScintilla and SciTEをインストールしました。

Functionの登録

関数の登録をするためにアトリビュートを使用して

    /// <summary>
    /// Luaへ関数を登録するためのアトリビュート
    /// </summary>
    class AttrLuaFunc : Attribute
    {
        /// <summary>
        /// 関数の登録
        /// </summary>
        /// <param name="funcName">登録する関数名</param>
        /// <param name="funcDoc">登録した関数の説明</param>
        public AttrLuaFunc( String funcName, String funcDoc )
        {
            m_FunctionName = funcName;
            m_FunctionDoc = funcDoc;
        }
        /// <summary>
        /// 引数付き関数の登録
        /// </summary>
        /// <param name="funcName">登録する関数名</param>
        /// <param name="funcDoc">登録した関数の説明</param>
        /// <param name="paramDocs">登録した関数の引数の説明</param>
        public AttrLuaFunc( String funcName, String funcDoc, params String[] paramDocs)
        {
            m_FunctionName = funcName;
            m_FunctionDoc = funcDoc;
            m_FunctionParameters = paramDocs;
        }
        public String   FuncName { get { return this.m_FunctionName; } }
        public String   FuncDoc { get { return this.m_FunctionDoc; } }
        public String[ ] FuncParams { get { return this.m_FunctionParameters; } }

        private String m_FunctionName;
        private String m_FunctionDoc;
        private String[ ] m_FunctionParameters = null;
    }

こんな感じに実装してみました。

それで、

    /// <summary>
    /// Luaオブジェクト管理
    /// </summary>
    class LuaObject : YS.Lua
    {
        public LuaObject( )
        {
            m_LuaFuncs = new Hashtable( );
        }

        public void RegisterLuaFunctions( Object target )
        {
            Type targetType = target.GetType( );

            foreach( MethodInfo mInfo in targetType.GetMethods( ) )
            {
                foreach( Attribute attr in Attribute.GetCustomAttributes( mInfo ) )
                {
                    if( attr.GetType( ) == typeof( AttrLuaFunc ) )
                    {
                        AttrLuaFunc attrFunc = ( AttrLuaFunc )attr;

                        String funcName = attrFunc.FuncName;

                        ParameterInfo[ ] prmInfo = mInfo.GetParameters( );

                        m_LuaFuncs.Add( funcName, desc );

                        RegisterFunction( funcName, target, mInfo );
                    }
                }
            }
        }
        private Hashtable m_LuaFuncs = null;
    }

これでクラスが持っている登録すべき関数を一挙に登録できるわけです。
これで関数のヘルプが外部から見れるようにできれば、というのは次回やりたいと思います。