示例#1
0
        private AbstractParams _LuaRetCall(int oldTop)
        {
            AbstractParams retparams = null;

            LuaState luastate = this.luafunc.GetLuaState();
            int      pos      = oldTop;

            while (!luastate.LuaIsNil(pos) && !luastate.lua_isnone(pos))
            {
                pos++;

                if (retparams == null)
                {
                    retparams = GenericParams.Create();
                }

                if (luastate.lua_isboolean(pos))
                {
                    retparams.WriteBool(this.luafunc.CheckBoolean());
                }
                else if (luastate.lua_islightuserdata(pos))
                {
                    /**
                     * 因为目前TOlua的版本不开放获取intptr的途径,无法自己判断lua类型,所以需要修改代码:在luastate中加入:
                     *         public LuaValueType GetValueType(int Pos)
                     *          {
                     *              return LuaDLL.tolua_getvaluetype(L,Pos);
                     *          }
                     *
                     *          public LuaTypes GetLuaType(int Pos)
                     *          {
                     *              return LuaDLL.lua_type(L,Pos);
                     *          }
                     * */
                    LuaValueType type = luastate.GetValueType(pos);
                    if (type == LuaValueType.Bounds)
                    {
                        retparams.WriteObject(this.luafunc.CheckBounds());
                    }
                    else if (type == LuaValueType.Color)
                    {
                        retparams.WriteObject(this.luafunc.CheckColor());
                    }
                    else if (type == LuaValueType.Vector2)
                    {
                        retparams.WriteObject(this.luafunc.CheckVector2());
                    }
                    else if (type == LuaValueType.Vector3)
                    {
                        retparams.WriteObject(this.luafunc.CheckVector3());
                    }
                    else if (type == LuaValueType.Vector4)
                    {
                        retparams.WriteObject(this.luafunc.CheckVector4());
                    }
                    else if (type == LuaValueType.Quaternion)
                    {
                        retparams.WriteObject(this.luafunc.CheckQuaternion());
                    }
                    else if (type == LuaValueType.Ray || type == LuaValueType.RaycastHit)
                    {
                        retparams.WriteObject(this.luafunc.CheckRay());
                    }
                    else if (type == LuaValueType.LayerMask)
                    {
                        retparams.WriteObject(this.luafunc.CheckLayerMask());
                    }
                    else if (type == LuaValueType.None)
                    {
                        retparams.WriteObject(this.luafunc.CheckObject(typeof(System.Object)));
                    }
                    else
                    {
                        LogMgr.LogErrorFormat("不支持的类型 {0}", type);
                    }
                    //Touch ------
                }
                else if (luastate.LuaIsNumber(pos))
                {
                    retparams.WriteDouble(this.luafunc.CheckNumber());
                }
                else if (luastate.LuaIsString(pos))
                {
                    retparams.WriteString(this.luafunc.CheckString());
                }
                else if (luastate.lua_istable(pos))
                {
                    retparams.WriteObject(this.luafunc.CheckLuaTable());
                }
                else if (luastate.lua_isfunction(pos))
                {
                    retparams.WriteObject(this.luafunc.CheckLuaFunction());
                }
                else if (luastate.LuaIsUserData(pos))
                {
                    /**
                     * 因为目前TOlua的版本不开放获取intptr的途径,无法自己判断lua类型,所以需要修改代码:在luastate中加入:
                     *         public LuaValueType GetValueType(int Pos)
                     *          {
                     *              return LuaDLL.tolua_getvaluetype(L,Pos);
                     *          }
                     *
                     *          public LuaTypes GetLuaType(int Pos)
                     *          {
                     *              return LuaDLL.lua_type(L,Pos);
                     *          }
                     * */
                    LuaValueType type = luastate.GetValueType(pos);

                    if (type == LuaValueType.Bounds)
                    {
                        retparams.WriteObject(this.luafunc.CheckBounds());
                    }
                    else if (type == LuaValueType.Color)
                    {
                        retparams.WriteObject(this.luafunc.CheckColor());
                    }
                    else if (type == LuaValueType.Vector2)
                    {
                        retparams.WriteObject(this.luafunc.CheckVector2());
                    }
                    else if (type == LuaValueType.Vector3)
                    {
                        retparams.WriteObject(this.luafunc.CheckVector3());
                    }
                    else if (type == LuaValueType.Vector4)
                    {
                        retparams.WriteObject(this.luafunc.CheckVector4());
                    }
                    else if (type == LuaValueType.Quaternion)
                    {
                        retparams.WriteObject(this.luafunc.CheckQuaternion());
                    }
                    else if (type == LuaValueType.Ray || type == LuaValueType.RaycastHit)
                    {
                        retparams.WriteObject(this.luafunc.CheckRay());
                    }
                    else if (type == LuaValueType.LayerMask)
                    {
                        retparams.WriteObject(this.luafunc.CheckLayerMask());
                    }
                    else if (type == LuaValueType.None)
                    {
                        retparams.WriteObject(this.luafunc.CheckObject(typeof(System.Object)));
                    }
                    else
                    {
                        LogMgr.LogErrorFormat("不支持的类型 {0}", type);
                    }
                    //Touch ------
                }
                else if (luastate.lua_isthread(pos))
                {
                    retparams.WriteObject(this.luafunc.CheckLuaThread());
                }
            }

            return(retparams);
        }