解決單個虛幻指令碼虛擬機器處理多個LUA狀態機

2022-07-16 07:36:12 字數 2394 閱讀 6452

前幾回初步實現了在lua層中新建uclass,讓c++自動呼叫lua函式,但因為虛幻是單個指令碼狀態機,不方便處理多個lua狀態機,本文嘗試初步解決該問題。

參考unlua外掛程式後暫時擱置在lua中新建uclass的方式,改用hook的形式修改先修的uclass裡面的函式實現c++自動呼叫lua函式。

這裡的hook僅僅實在指令碼層面的api攔截,並不在c++層面;通過修改ufunction的nativefunc實現呼叫lua函式。

讓單個虛幻指令碼虛擬機器處理多個lua狀態機,需要乙個tmap記錄每個gameinstance關聯的lua狀態機,這個在呼叫lua函式時,

根據當前uobject所屬的gameinstance去呼叫對應的lua狀態機;這對於所有actor型別自然毫無問題,但對於某些與gameinstance無關的類就沒法處理,

比如uengine類,後續再想想更合適方式。

首先hook就是用乙個lua表裡面的函式代替虛幻指令碼函式,實現如下:

int fastluahelper::hookufunction(lua_state* inl)

); bisbindtoreset = true;

} lual_newmetatable(inl, "hookue");

int32 hooktableindex = lua_gettop(inl);

fstring clsname = cls->getname();

const char* clsname_c = tchar_to_utf8(*clsname); }

if (!lua_istable(inl, -1))

lua_pushnil(inl);

while (lua_next(inl, -2))

else

}if (foundfunc)

else

}lua_pushboolean(inl, 1);

return 1;

}//重啟lua時解除hook,否則重啟lua後。uclass裡面任然是上次hook的lua函式

static void unhookallufunction(lua_state* inl)

lual_getmetatable(inl, "hookue");

if (lua_istable(inl, -1) == false)

lua_pushnil(inl);

while (lua_next(inl, -2))

if (func && func->hasanyflags(rf_transient))

lua_pop(inl, 1);

}}

void fastluahelper::callluafunction(uobject* context, fframe& thestack, result_decl)

int32 tp = lua_gettop(luastate);

lual_getmetatable(luastate, "hookue");

if (lua_istable(luastate, -1) == false)

lua_rawgetp(luastate, -1, thestack.node);

if (lua_isfunction(luastate, -1))

else

}//call lua function

int32 callret = lua_pcall(luastate, paramsnum, returnparam ? 1 : 0, 0);

if (callret)

if (returnparam)

}lua_settop(luastate, tp);

}

測試用法

--bp_rpgcharacter_c.lua

bp_rpgcharacter_c = bp_rpgcharacter_c or {}

function bp_rpgcharacter_c:receivebeginplay()

print(1)

endfunction bp_rpgcharacter_c:receivetick(indeltatime)

endfunction bp_rpgcharacter_c:receiveendplay(inreason)

print(3)

endreturn bp_rpgcharacter_c

--main.lua

local playerctrl = gameplaystatics:getplayercontroller(g_gameinstance, 0)

local pawn = playerctrl:k2_getpawn()

unreal.luahookufunction(pawn)

workstation 搭建多個虛擬機器

1,安裝workstation 10 1 安裝完畢後設定網路 虛擬網路編輯器 這裡又bridge,nat,host only模式,一般企業用法,推薦使用bridge模式,各個主機之間和外部可以相互通訊 如果又多個網絡卡,還可以分配多個bridge,均衡網路頻寬 2 設定檔案共享系統,設定各種許可權 ...

Nginx配置多個虛擬機器

訪問主機http rabbitmq1 到 訪問主機或 到http?127.0.0.1 9090 6 window端設定c windows system32 drivers etc hosts檔案,新增主機名解析 192.168.169.100 rabbitmq1 192.168.169.100 ra...

hyperv 虛擬機器多個vlan

只能通過命令的方式設定 1,將虛擬機器的網路介面卡名字改變。只能新增乙個改乙個,暫時沒有找到別的方法 命令 rename vmnetworkadapter vmname ikuai name 網路介面卡 newname p2 2.然後使用set vmnetworkadaptervlan 命令進行修改...