Lua казнь заблокирована - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь запустить функцию каждый кадр с Lua (привязан к моему коду C ++).

Все отлично работает с этим кодом (Вызывается каждый кадр, ведите журнал правильно):

Script.lua (функция OnUpdate)

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 останавливается на добавленной строкепосле второго вызова (в консоли появляется только одна строка отладки, но то, что находится до того, как добавленная строка все еще работает, как и ожидалось).

Метод C ++ "GetTransform" успешно вызывается из Lua (простая точка останова подтвердила меняthis), и «владелец» отправляется в 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;
}

Реализация PushNativeUserdataAsMetatable

template<typename T>
inline void EasyLua::PushNativeUserdataAsMetatable(T& p_userdata)
{
    EasyLua::PushNativeUserdata(static_cast<void*>(&p_userdata));
    EasyLua::PushLuaTypeMetaTable<T>();
    EasyLua::MoveToMetatable(-2);
}

Есть лиВ любом случае, нативный вызов может сначала увенчаться успехом, а каждый раз заканчиваться неудачей?Я что-то пропустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...