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