分析のxlua原則

バージョン履歴

日付 説明 著者
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)

クラスの例

  1. プッシュ(Re​​alStatePtr 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); }
  1. GetObject(RealStatePtr L、int型のインデックス、型タイプ)

達成xlua


  1. 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

  1. コール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
    1. LUA必須リサイクル
      meditor C#のコールバックへの参照、参照はそれが登録されています

    2. C#の必須リサイクル
      ガベージコレクションを待って引用されていないmeditor、

    3. LUA二必須リサイクル
      meditorリサイクル成功

おすすめ

転載: www.cnblogs.com/marcher/p/12161503.html