バージョン履歴
日付 | 版 | 説明 | 著者 |
---|---|---|---|
2018年7月25日 | 1.0 | xluaのリアライズの概要 | 李6月 |
2018年7月27日 | 2.0 | 達成xlua | 李6月 |
2018年7月30日 | 3.0 | 達成xlua | 李6月 |
lua53オブジェクト型
取ります | C |
---|---|
int64モード | lua_Integer |
ダブル | lua_Number |
ブーリアン | int型 |
ストリング | TString |
関数 | 閉鎖 |
テーブル | テーブル |
ユーザデータ | 結婚 |
typedef union Value {
GCObject *gc; /* collectable objects */
void *p; /* light userdata */
int b; /* booleans */
lua_CFunction f; /* light C functions */ lua_Integer i; /* integer numbers */ lua_Number n; /* float numbers */ } Value;
typedef struct lua_TValue {
TValuefields;
} TValue;
LUAと対話するためのC#
お互いにすべての相互作用は、関数呼び出しに単純化することができます
スタック
インターワーキング機能
オペレーティング | 機能 |
---|---|
lua_push * | lua_pushnil lua_pushnumber lua_pushinteger lua_pushcclosure lua_pushboolean |
lua_to * | lua_tonil lua_tonumber lua_tointeger lua_toclosure lua_toboolean lua_totable |
lua_new * | lua_newuserdata lua_newtable |
lua_pop | lua_pop |
lua_call | lua_call lua_pcall |
登録機能
table.binfind
static int table_clear(lua_State* L)
{
Table* tab = lua_totable(L, 1);
...
return 0; }
lua_getglobal(L, "table")
lua_pushstring(L, "clear")
lua_pushfunction(L, table_clear)
lua_settable(L, -3)
lua_pop(L,1)
クラスの例
- プッシュ(RealStatePtr L、オブジェクトo)
o.GetTypeObjectTransltor.GetTypeIdObjectTransltor.TryDelayWrapLoader *ラップ.__ RegisterObjectTranslator.addObjectxlua_pushcsobjgraph TB A [o.GetType] B [ObjectTransltor.GetTypeId] C [ObjectTransltor.TryDelayWrapLoader] D [*ラップ.__登録] E [ObjectTranslator.addObject] F [xlua_pushcsobj] A - > B B - > C C - > D D - > E E - > F
Utils.BeginObjectRegister(type, L, translator, 0, 4, 1, 1);
Utils.RegisterFunc(L, Utils.METHOD_IDX, "Init", _m_Init);
Utils.RegisterFunc(L, Utils.METHOD_IDX, "ChangeGameState", _m_ChangeGameState);
Utils.RegisterFunc(L, Utils.METHOD_IDX, "DeActive", _m_DeActive); Utils.RegisterFunc(L, Utils.METHOD_IDX, "IsActive", _m_IsActive); Utils.RegisterFunc(L, Utils.GETTER_IDX, "CurGameSate", _g_get_CurGameSate); Utils.RegisterFunc(L, Utils.SETTER_IDX, "CurGameSate", _s_set_CurGameSate); Utils.EndObjectRegister(type, L, translator, null, null,null, null, null);
{
//upvalue --- [1]:getters, [2]:feilds, [3]:base, [4]:indexfuncs, [5]:baseindex
//param --- [1]: obj, [2]: key
__index = cls_indexer,
//upvalue --- [1]:setters, [2]:base, [3]:indexfuncs, [4]:baseindex //param --- [1]: obj, [2]: key, [3]: value __newindex = cls_newindexer, }
LUA_API void xlua_pushcsobj(lua_State *L, int key, int meta_ref, int need_cache, int cache_ref) {
int* pointer = (int*)lua_newuserdata(L, sizeof(int));
*pointer = key;
if (need_cache) cacheud(L, key, cache_ref); lua_rawgeti(L, LUA_REGISTRYINDEX, meta_ref); lua_setmetatable(L, -2); }
- GetObject(RealStatePtr L、int型のインデックス、型タイプ)
達成xlua
- LUAコールのC#
触发メタテーブル.__ newindexImage.sprite&等しく; SpriteUnityEngineUIImageWrap._s_set_spriteObjectTranslator.FastGetCSObjLuaAPI.xlua_tocsobj_fastObjectTranslator.getCsObjgraph TB A [Image.sprite =スプライト] B [UnityEngineUIImageWrap._s_set_sprite] C [ObjectTranslator.FastGetCSObj] D [LuaAPI.xlua_tocsobj_fast] E [ObjectTranslator.getCsObj] A - 触发メタテーブル.__ newIndexが - > B B - > C C - > D D - > E
- コールLUAのC#
EventTriggerListener.AddEventOnPressEventTriggerListenerWrap._m_AddEventOnPressObjectTraslator.GetDelegate&LT; EventTriggerListener.BoolDelegate&GT; ObjectTraslator.CreateDelegateBridgenew DelegateBridgeDelegate.CreateDelegategraph TB A [EventTriggerListener.AddEventOnPress] B [EventTriggerListenerWrap._m_AddEventOnPress] C [ObjectTraslator.GetDelegate <EventTriggerListener.BoolDelegate>] D [ObjectTraslator.CreateDelegateBridge] E [新しいDelegateBridge] F [Delegate.CreateDelegate] A - > B B - > C C - > D D - > E E - > F
問題
コールバックリーク
local btn = GameObject.Find( "/XXXXX" ):GetComponent( "Button" ) btn.OnClick.AddListener( funciton() btn.disabled = true end) btn = nil
ガベージコレクションを待ち
meditorリリース
function DeleteObjectListItem:releas() log("释放".. self.uiName.."index:".. self.index) local tb ={} setmetatable(tb,{__mode ="k"}) local mediator = UIManager:GetUI(self.uiName).mediator tb[mediator] =1 UIManager:removeTargetUI( self.uiName) mediator=nil collectgarbage"collect" LuaHelper.CsSharpGc() collectgarbage"collect" if not next(tb) then self.state =5 self.text_state.text="状态:内存已被回收" self.text_state.color =UIUtil.CodeToColor(ColorCodeType.AssetEnough_Green) self.bt.gameObject:SetActiveVirtual(false) self:setState() else self.state =4 self.text_state.color =UIUtil.CodeToColor(ColorCodeType.AssetNotEnough) self.bt_text.text="查看引用" self:setState() end end
-
LUA必須リサイクル
meditor C#のコールバックへの参照、参照はそれが登録されています -
C#の必須リサイクル
ガベージコレクションを待って引用されていないmeditor、 -
LUA二必須リサイクル
meditorリサイクル成功