/// <summary> /// 清除自定义敌机的函数 /// </summary> private void UnrefCustomizedEnemy() { // 敌机初始化函数 foreach (KeyValuePair <string, CustomizedDefineData> kv in _customizedEnemyDefMap) { string customizedEnemyName = kv.Key; CustomizedDefineData defData = kv.Value; if (defData.initFuncRef != 0) { _luaState.L_Unref(LuaDef.LUA_REGISTRYINDEX, defData.initFuncRef); #if LogLuaFuncRef _luaRefDic.Remove(defData.initFuncRef); Logger.Log("Unref init function of enemy " + customizedEnemyName + " ref = " + defData.initFuncRef); #endif } if (defData.onKillFuncRef != 0) { _luaState.L_Unref(LuaDef.LUA_REGISTRYINDEX, defData.onKillFuncRef); #if LogLuaFuncRef _luaRefDic.Remove(defData.onKillFuncRef); Logger.Log("Unref onEliminate function of enemy " + customizedEnemyName + " ref = " + defData.onKillFuncRef); #endif } } _customizedEnemyDefMap.Clear(); }
private void RefCustomizedEnemy() { _luaState.GetField(-1, "CustomizedEnemyTable"); string customizedName; if (!_luaState.IsTable(-1)) { Logger.Log("field CustomizedTable is not a table!"); _luaState.Pop(1); return; } _luaState.PushNil(); while (_luaState.Next(-2)) { customizedName = _luaState.ToString(-2); if (!_luaState.IsTable(-1)) { Logger.Log("sub field " + customizedName + " is not a table!"); } CustomizedDefineData defData = new CustomizedDefineData(); _luaState.GetField(-1, "Init"); if (!_luaState.IsFunction(-1)) { Logger.Log("sub field Init is not a function!"); defData.initFuncRef = 0; _luaState.Pop(1); } else { defData.initFuncRef = _luaState.L_Ref(LuaDef.LUA_REGISTRYINDEX); #if LogLuaFuncRef Logger.Log("InitFunction in Customized Class " + customizedName + " is Ref , ref = " + defData.initFuncRef); _luaRefDic.Add(defData.initFuncRef, defData.initFuncRef); #endif } _luaState.GetField(-1, "OnKill"); if (_luaState.IsFunction(-1)) { defData.onKillFuncRef = _luaState.L_Ref(LuaDef.LUA_REGISTRYINDEX); #if LogLuaFuncRef Logger.Log("OnKillFunction in Customized Enemy " + customizedName + " is Ref , ref = " + defData.onKillFuncRef); _luaRefDic.Add(defData.onKillFuncRef, defData.onKillFuncRef); #endif } else { defData.onKillFuncRef = 0; _luaState.Pop(1); } _customizedEnemyDefMap.Add(customizedName, defData); _luaState.Pop(1); } _luaState.Pop(1); }
private void RefBossTable() { _luaState.GetField(-1, "BossTable"); string bossName; if (!_luaState.IsTable(-1)) { Logger.Log("Return value BossTable is not a table!"); } _luaState.PushNil(); while (_luaState.Next(-2)) { bossName = _luaState.ToString(-2); if (!_luaState.IsTable(-1)) { Logger.Log("Boss " + bossName + " in BossTable is invalid"); } // init _luaState.GetField(-1, "Init"); if (!_luaState.IsFunction(-1)) { Logger.Log("Init Funciton of Boss" + bossName + " is invalid"); } // boss与enemy公用一个DefMap CustomizedDefineData defData = new CustomizedDefineData(); defData.initFuncRef = _luaState.L_Ref(LuaDef.LUA_REGISTRYINDEX); _customizedEnemyDefMap.Add(bossName, defData); // 弹出table _luaState.Pop(1); #if LogLuaFuncRef _luaRefDic.Add(initRef, initRef); Logger.Log("Boss " + bossName + " is ref.Init funcRef = " + initRef); #endif } //弹出BossTable _luaState.Pop(1); }