我正在尝试使用Lua在每帧中运行一个函数(绑定到我的C ++代码中)。
使用此代码,一切都可以正常工作(每帧调用一次,正确记录日志):
function InputTest:OnUpdate(deltaTime)
self.x = self.x + deltaTime
if Inputs.GetKey(KEY_LEFT_SHIFT) then speed = 3 else speed = 1 end
if Inputs.GetKey(KEY_D) then self.x = self.x - deltaTime * speed end
if Inputs.GetKey(KEY_A) then self.x = self.x + deltaTime * speed end
if Inputs.GetKey(KEY_S) then self.z = self.z - deltaTime * speed end
if Inputs.GetKey(KEY_W) then self.z = self.z + deltaTime * speed end
if Inputs.GetKey(KEY_E) then self.y = self.y + deltaTime * speed end
if Inputs.GetKey(KEY_Q) then self.y = self.y - deltaTime * speed end
if Inputs.IsMousePressed(MOUSE_BUTTON_LEFT) then self:LogMousePosition() end
Debug.Log(self.x)
end
但是当我添加test = self.owner:GetTransform()
在Debug.Log(self.x)
行之前
然后,函数OnUpdate在第二次调用后在添加的行处停止(控制台中仅显示一条调试行,但是添加的行之前的内容仍按预期工作)。
从Lua成功调用了C ++方法“ GetTransform”(一个简单的断点确认了这一点),并将“所有者”发送到GetTransform(感谢“:”)。所有者的内存地址每帧都是相同的,但仍只运行一次。
int OvCore::Scripting::Bindings::LuaActor::GetTransform(lua_State * L)
{
if (EasyLua::IsUserdata(1))
{
ECS::Actor* instance = static_cast<ECS::Actor*>(EasyLua::ToUserData(1));
EasyLua::PushNativeUserdataAsMetatable<ECS::Components::CTransform>(*instance->GetComponent<ECS::Components::CTransform>());
return 1;
}
return 0;
}
template<typename T>
inline void EasyLua::PushNativeUserdataAsMetatable(T& p_userdata)
{
EasyLua::PushNativeUserdata(static_cast<void*>(&p_userdata));
EasyLua::PushLuaTypeMetaTable<T>();
EasyLua::MoveToMetatable(-2);
}
有什么办法可以使本地调用首先成功,然后每隔一次失败?我错过了什么吗?