--lua端的资源管理器 LuaResManager = LuaResManager or BaseClass() local LuaResManager = LuaResManager local soundMgr = soundMgr local resMgr = resMgr local Array_New = Array.New local Time = Time LuaResManager.RES_TYPE = { PREFAB = 1, SPRITE = 2, RENDERTEXTURE = 3, TEXTASSET = 4, } function LuaResManager:__init() LuaResManager.Instance = self --assetbundle包资源引用列表 self.ref_count_list = {} --延迟unload的资源列表 self.delay_unload_list = {} --界面显示模型对象列表 self.role_mode_list = {} --3dUIRt对象列表 self.ui_rt_mode_list = {} --每隔多长时间执行一次内存清理 self.clear_memory_time = 10 if SystemRuntimePlatform.IsIphone() then self.clear_memory_time = 5 elseif SystemRuntimePlatform.IsAndroid() then if SystemMemoryLevel.Cur == SystemMemoryLevel.Low then self.clear_memory_time = 15 end end --定时清理资源函数 local function onCheckToClearObjPool() self:CheckToClearObjPool() end GlobalTimerQuest:AddPeriodQuest(onCheckToClearObjPool, self.clear_memory_time, -1) --资源对象池 self.obj_pool_list = {} --对象池总ab包对象数量 self.obj_pool_ab_count = 0 --静态的缓存对象名字列表 self.static_obj_name_list = {} --静态的缓存对象列表 self.static_obj_pool_list = {} self.static_obj_pool_container = GameObject.New("static_obj_pool_container").transform self.static_obj_pool_container:SetParent(panelMgr:GetParent("SceneObjContainer")) self.static_obj_pool_container.gameObject:SetActive(false) self.canvas_root = GameObject.Find("root/Canvas").transform --外部资源使用记录,处理请求未返回时触发的二次请求 self.outsize_list = {} local callfunc = function(module_name,func) if module_name == "res" and func == "objlist" then local data = {} for k,v in pairs(self.static_obj_pool_list) do print("---static----",k,v) data["static_" .. k] = true end for k,v in pairs(self.obj_pool_list) do for resname,obj in pairs(v["res_name_list"]) do print("---obj----",resname,obj) if not data["obj_" .. resname] then data["obj_" .. resname] = 0 end data["obj_" .. resname] = data["obj_" .. resname] + 1 end end GlobalEventSystem:Fire(EventName.SENT_MODULE_DEBUG_DATA,"res", data) end end GlobalEventSystem:Bind(EventName.DO_MODULE_DEBUG_FUNC,callfunc) local func = function() callfunc("res","objlist") end GlobalEventSystem:Bind(EventName.CHECK_MODULE_DEBUG_DATA,func) end function LuaResManager:getInstance() if LuaResManager.Instance == nil then LuaResManager.Instance = LuaResManager.New() end return LuaResManager.Instance end ----------------------------资源引用计数------------------------------------------- --增加引用数 function LuaResManager:addRefCount(ref_tar,abName,count) count = count or 1 if count > 0 and abName then local ref_info = self.ref_count_list[ref_tar] or {} local ref_count = ref_info[abName] and ref_info[abName] + count or count ref_info[abName] = ref_count self.ref_count_list[ref_tar] = ref_info --发现资源在待卸载列表,更新其使用时间 local delay_info = self.delay_unload_list[abName] if delay_info then delay_info.use_time = Time.time end end end --减少引用数 function LuaResManager:reduceRefCount(ref_tar,abName) if self.ref_count_list[ref_tar] and self.ref_count_list[ref_tar][abName] and self.ref_count_list[ref_tar][abName] > 0 then self.ref_count_list[ref_tar][abName] = self.ref_count_list[ref_tar][abName] - 1 end end --清除关联对象的所有资源关联信息 function LuaResManager:clearReference(ref_tar) self:clearRefCount(ref_tar) self:clearRoleMode(ref_tar) end --清除该对象的所有资源引用 function LuaResManager:clearRefCount(ref_tar) local ref_count_obj = self.ref_count_list[ref_tar] if ref_count_obj then for abName,ref_count in pairs(ref_count_obj) do if ref_count and ref_count > 0 then local delay_info = self.delay_unload_list[abName] if delay_info == nil then delay_info = { use_time = Time.time, ref_count = ref_count, } self.delay_unload_list[abName] = delay_info else delay_info.use_time = Time.time delay_info.ref_count = delay_info.ref_count + ref_count end end end self.ref_count_list[ref_tar] = nil end end --清除该对象的所有角色模型的引用 function LuaResManager:clearRoleMode(ref_tar) local ref_count_obj = self.role_mode_list[ref_tar] if ref_count_obj then for p,uiModelClass in pairs(ref_count_obj) do uiModelClass:DeleteMe() end self.role_mode_list[ref_tar] = nil end end --清除该对象的所有3d的引用 function LuaResManager:clearRtUIMode(ref_tar) local ref_count_obj = self.ui_rt_mode_list[ref_tar] if ref_count_obj then for p,uiRtModelClass in pairs(ref_count_obj) do uiRtModelClass:DeleteMe() end self.ui_rt_mode_list[ref_tar] = nil end end -------------------------------------------对象缓存池管理----------------------------------------------- --添加游戏对象列表进入缓存池 通过loadPrefabs加载的资源对象列表 function LuaResManager:AddObjListToPool(ref_tar, abName, resName_list, gameObject_list) if gameObject_list then self:CreateABObjPool(abName) local resName = "resName_list" .. table.concat(resName_list, "_") local res_list = self.obj_pool_list[abName]["res_name_list"][resName] if res_list == nil then res_list = Array_New() self.obj_pool_list[abName]["res_name_list"][resName] = res_list end if res_list:GetSize() > self:GetMaxChildPoolObjCount() then for i, go in ipairs(gameObject_list) do destroy(go) end else self:reduceRefCount(ref_tar, abName) for i, go in ipairs(gameObject_list) do go.transform:SetParent(self.obj_pool_list[abName].container) end res_list:PushBack(gameObject_list) self.obj_pool_list[abName].last_change_time = Time.time end end end --添加游戏对象进入缓存池 通过loadPrefab加载的资源对象 function LuaResManager:AddObjToPool(ref_tar, abName, resName, gameObject, alpha, is_default_color) if gameObject then --非静态缓存对象 if abName and (not self.static_obj_name_list[abName] or self.static_obj_pool_list[abName]) then self:CreateABObjPool(abName) local res_list = self.obj_pool_list[abName]["res_name_list"][resName] if res_list == nil then res_list = Array_New() self.obj_pool_list[abName]["res_name_list"][resName] = res_list end if res_list:GetSize() > self:GetMaxChildPoolObjCount() then --大于限制的相同对象缓存数量,不放入缓存 destroy(gameObject) else if not IsNull(gameObject) then --放入缓存后减少引用计数 self:reduceRefCount(ref_tar, abName) gameObject.transform:SetParent(self.obj_pool_list[abName].container) res_list:PushBack(gameObject) self.obj_pool_list[abName].last_change_time = Time.time end end else --静态缓存对象 if not abName or self.static_obj_pool_list[abName] then --只缓存一个相同的静态对象 destroy(gameObject) else --重置shader -- if (alpha and alpha < 1) or is_default_color == false then -- local skinned_mesh_renderer = gameObject:GetComponentInChildren(typeof(UnityEngine.SkinnedMeshRenderer)) -- if skinned_mesh_renderer then -- local sd = SceneManager:getInstance():GetTextureShader() -- if sd then -- skinned_mesh_renderer.material.shader = sd -- end -- end -- end self:reduceRefCount(ref_tar, abName) self.static_obj_pool_list[abName] = gameObject gameObject.transform:SetParent(self.static_obj_pool_container) --设置引用计数10000,避免静态缓存对象异常情况引用归零被销毁 self:addRefCount(self.static_obj_pool_list, abName, 10000) end end end end --添加缓存对象时初始化缓存信息 function LuaResManager:CreateABObjPool(abName) if not self.obj_pool_container then self.obj_pool_container = UiFactory.createChild(panelMgr:GetParent("SceneObjContainer"), UIType.EmptyObject, "obj_pool_container").transform self.obj_pool_container.gameObject:SetActive(false) end if self.obj_pool_list[abName] == nil then --缓存AB包超过最大数量时,强制清理最久未使用的那个资源 if self.obj_pool_ab_count >= self:GetMaxPoolObjCount() then local min_change_time = 9999999 local min_abName = nil for pool_abName, ab_info in pairs(self.obj_pool_list) do if ab_info.last_change_time < min_change_time and ab_info then min_change_time = ab_info.last_change_time min_abName = pool_abName end end if min_abName then self:ClearObjPool(min_abName) end end self.obj_pool_ab_count = self.obj_pool_ab_count + 1 self.obj_pool_list[abName] = {last_change_time = Time.time, res_name_list = {}, container = UiFactory.createChild(self.obj_pool_container, UIType.EmptyObject, abName .. "_container").transform} end end --从缓存池中获取游戏对象列表 function LuaResManager:GetObjListFormPool(ref_tar, abName, resName_list) local resName = "resName_list" .. table.concat(resName_list, "_") if self.obj_pool_list[abName] and self.obj_pool_list[abName]["res_name_list"][resName] then local gameObject_list = self.obj_pool_list[abName]["res_name_list"][resName]:PopBack() if gameObject_list then self.obj_pool_list[abName].last_change_time = Time.time self:addRefCount(ref_tar, abName) return gameObject_list end end end --从缓存池中获取游戏对象 function LuaResManager:GetObjFormPool(ref_tar, abName, resName) if self.static_obj_name_list[abName] then local go = self.static_obj_pool_list[abName] if go then self.static_obj_pool_list[abName] = nil self:addRefCount(ref_tar, abName) return go end end if self.obj_pool_list[abName] and self.obj_pool_list[abName]["res_name_list"][resName] then local gameObject = self.obj_pool_list[abName]["res_name_list"][resName]:PopBack() if gameObject then self.obj_pool_list[abName].last_change_time = Time.time self:addRefCount(ref_tar, abName) return gameObject end end end --清除单个ab包的缓存游戏对象 function LuaResManager:ClearObjPool(abName, ab_info) ab_info = ab_info or self.obj_pool_list[abName] if ab_info then local all_ref_count = 0 for resName, res_list in pairs(ab_info.res_name_list) do if res_list and res_list:GetSize() > 0 then all_ref_count = all_ref_count + res_list:GetSize() end end self:addRefCount(self.obj_pool_container, abName, all_ref_count) self:clearReference(self.obj_pool_container) destroy(ab_info.container.gameObject) self.obj_pool_list[abName] = nil self.obj_pool_ab_count = self.obj_pool_ab_count - 1 end end --清除所有缓存池游戏对象,切换场景时调用 function LuaResManager:ClearAllObjPool() local obj = nil if self.obj_pool_container then local all_ref_count = 0 for abName, ab_info in pairs(self.obj_pool_list) do all_ref_count = 0 for resName, res_list in pairs(ab_info.res_name_list) do if res_list and res_list:GetSize() > 0 then all_ref_count = all_ref_count + res_list:GetSize() end end self:addRefCount(self.obj_pool_container, abName, all_ref_count) end self:clearReference(self.obj_pool_container) destroy(self.obj_pool_container.gameObject, true) self.obj_pool_container = nil end self.obj_pool_list = {} self.obj_pool_ab_count = 0 self:CheckToClearObjPool(true) end --有10秒定时器检测,切换场景时自动调用一次 function LuaResManager:CheckToClearObjPool(force_unload) local unload_count = 0 for abName,vo in pairs(self.delay_unload_list) do if force_unload or Time.time - vo.use_time >= self.clear_memory_time then --延迟一定时间unload ab包 unload_count = unload_count + 1 if not force_unload and unload_count > 10 then --自动unload的时候 避免一次性交互过多 return end --print("-------UnloadAssetBundle---------",abName) resMgr:UnloadAssetBundle(abName,true,vo.ref_count) self.delay_unload_list[abName] = nil end end end --获得最大的缓存AB包数量 function LuaResManager:GetMaxPoolObjCount() if SystemMemoryLevel.Cur == SystemMemoryLevel.Low and SystemRuntimePlatform.IsIphone() then return 10 else if SystemRuntimePlatform.IsIphone() then return 50 else return 100 end end end --获得最大的缓存子对象数量 function LuaResManager:GetMaxChildPoolObjCount() if SystemMemoryLevel.Cur == SystemMemoryLevel.Low and SystemRuntimePlatform.IsIphone() then return 3 else if SystemRuntimePlatform.IsIphone() then return 10 else return 10 end end end ---------------------------------静态对象缓存------------------------------------ --res_name 静态资源名字 --res_type 资源类型 0默认 永不删除的类型 function LuaResManager:AppendStaticObjName(res_name, res_type) if res_name and res_name ~= "" then self.static_obj_name_list[res_name] = res_type or 0 end end --删除制定类型的静态资源 function LuaResManager:RemoveStaticObj(remove_res_type) for res_name, res_type in pairs(self.static_obj_name_list) do if remove_res_type == res_type then self.static_obj_name_list[res_name] = nil local go = self.static_obj_pool_list[res_name] if go then self.static_obj_pool_list[res_name] = nil destroy(go) local delay_info = self.delay_unload_list[res_name] if delay_info == nil then delay_info = { use_time = Time.time, ref_count = 10000, } self.delay_unload_list[res_name] = delay_info else delay_info.use_time = Time.time delay_info.ref_count = delay_info.ref_count + 10000 end end end end end ---------------------------------------------界面显示模型使用----------------------------------------------- function LuaResManager:GetPartModel(ref_tar, parent) local ref_info = self.role_mode_list[ref_tar] or {} local curr_roleModel = ref_info[parent] return curr_roleModel end --[[ UI直接挂接模型的接口,与rt区分 ref_tar:必须是继承baseclass的对象 parent:父容器 career:职业 sex:性别 clothe_res_id:衣服模型id weapon_res_id:武器模型id weapon_clothe_id: 武器时装 type:类型 layer_name:层级 rotate:旋转度数 action_name_list:动作集 can_rotate:是否支持左右旋转 scale:缩放 position:位置 fashion_model_id:时装模型id texture_id:时装贴图id action_delta:动作间隔 free_param, ignore_param, skill_id:技能id callBack:加载完成的回调,返回modelClass wing_id:翅膀id image_id, head_wear_id, head_clothe_id, footmark_id:足迹id layout_file:是否支持配置控制模型大小,位置,角度参数 --]] function LuaResManager:SetRoleModel(ref_tar, parent, model_data) if parent and not ref_tar._use_delete_method then local ref_info = self.role_mode_list[ref_tar] or {} local curr_roleModel = ref_info[parent] if curr_roleModel then curr_roleModel:DeleteMe() ref_info[parent] = nil end model_data = self:ModelDataDefineVar(model_data) ref_info[parent] = UIModelClass.New(nil,parent, model_data) self.role_mode_list[ref_tar] = ref_info end end --[[ 使用设置摄像机的targetTexture模式 ref_tar必须是继承baseclass的对象 parent:父容器 model_data = { career:职业 clothe_res_id:衣服模型id weapon_res_id:武器模型id weapon_clothe_id: 武器时装 role_type:类型 size:大小 rotate:读书 action_name_list:动作集 can_rotate:是否支持左右旋转 scale:缩放 position:位置 fashion_model_id:时装模型id texture_id:时装贴图id action_delta: renderSize:自定义RenderTexture尺寸 lCallBack:加载完成的回调,返回modelClass wing_id:翅膀id partner_id: skill_id: head_wear_id image_id footmark_id use_bloom:使用泛光效果 } ]] function LuaResManager:SetRoleModelByRT(ref_tar, parent, model_data) if ClientConfig.is_use_model_render then self:SetBackRoleModel(ref_tar, parent, model_data) else local function loadCameraCallBack(objs) if parent and not ref_tar._use_delete_method and objs and objs[0] then local go = newObject(objs[0]) local ref_info = self.role_mode_list[ref_tar] or {} local curr_roleModel = ref_info[parent] if curr_roleModel then curr_roleModel:DeleteMe() ref_info[parent] = nil end model_data = self:ModelDataDefineVar(model_data) ref_info[parent] = UIModelClassByRT.New(go, parent, model_data) self.role_mode_list[ref_tar] = ref_info go.transform:SetParent(self.canvas_root) end end -- self:loadPrefab(ref_tar,"common","RoleMode", loadCameraCallBack) self:loadPrefab(ref_tar,"uiComponent","UIRoleMode", loadCameraCallBack) end end function LuaResManager:SetRtUIMode(ref_tar, parent, root, model_data) local function loadRtUImodelCallBack(objs) if parent and not ref_tar._use_delete_method and objs and objs[0] then local go = newObject(objs[0]) local ref_info = self.ui_rt_mode_list[ref_tar] or {} local cur_rt_model = ref_info[parent] if cur_rt_model then cur_rt_model:DeleteMe() ref_info[parent] = nil end ref_info[parent] = UIRtModelClass.New(go, parent, root, model_data) self.ui_rt_mode_list[ref_tar] = ref_info go.transform:SetParent(self.canvas_root) end end self:loadPrefab(ref_tar,"uiComponent","UIRtMode", loadRtUImodelCallBack) end function LuaResManager:SetBackRoleModel(ref_tar, parent, model_data) if parent and not ref_tar._use_delete_method then local ref_info = self.role_mode_list[ref_tar] or {} local curr_roleModel = ref_info[parent] if curr_roleModel then curr_roleModel:DeleteMe() ref_info[parent] = nil end model_data = self:ModelDataDefineVar(model_data) ref_info[parent] = UIBackModelClass.New(nil,parent, model_data) self.role_mode_list[ref_tar] = ref_info end end function LuaResManager:ModelDataDefineVar(model_data) model_data = model_data or {} model_data.career = model_data.career model_data.clothe_res_id = model_data.clothe_res_id model_data.weapon_res_id = model_data.weapon_res_id model_data.weapon_clothe_id = model_data.weapon_clothe_id or "" model_data.role_type = model_data.type or model_data.role_type model_data.size = model_data.size model_data.rotate = model_data.rotate model_data.action_name_list = model_data.action_name_list model_data.can_rotate = model_data.can_rotate model_data.scale = model_data.scale model_data.position = model_data.position model_data.fashion_model_id = model_data.fashion_model_id model_data.texture_id = model_data.texture_id model_data.action_delta = model_data.action_delta model_data.renderSize = model_data.renderSize model_data.partner_id = model_data.partner_id model_data.skill_id = model_data.skill_id model_data.lCallBack = model_data.callBack model_data.wing_id = model_data.wing_id model_data.image_id = model_data.image_id model_data.head_wear_id = model_data.head_wear_id model_data.head_clothe_id = model_data.head_clothe_id model_data.footmark_id = model_data.footmark_id model_data.raycastParent = model_data.raycastParent model_data.show_shadow = model_data.show_shadow model_data.use_bloom = model_data.use_bloom model_data.skill_preview = model_data.skill_preview model_data.skill_preview_callback = model_data.skill_preview_callback model_data.camera_args = model_data.camera_args model_data.using_material = model_data.using_material model_data.using_sprite_bg = model_data.using_sprite_bg model_data.role_position_offset = model_data.role_position_offset model_data.light_id = model_data.light_id model_data.talisman_id = model_data.talisman_id model_data.layer_name = model_data.layer_name model_data.pearl_vo = model_data.pearl_vo model_data.pearl_pos = model_data.pearl_pos model_data.shadow2_plane_pos = model_data.shadow2_plane_pos model_data.shadow2_light_pos = model_data.shadow2_light_pos model_data.hat_wear_id = model_data.hat_wear_id model_data.dynamic_bone = model_data.dynamic_bone model_data.attach_game_root = model_data.attach_game_root model_data.use_green_screen = model_data.use_green_screen model_data.green_screen_camera_type = model_data.green_screen_camera_type model_data.model_rotation = model_data.model_rotation model_data.use_light_data = model_data.use_light_data model_data.psionic_effect = model_data.psionic_effect -- 圣物光环特效 model_data.pokemon_diamond_effect = model_data.pokemon_diamond_effect -- 宠物宝石光环特效 model_data.show_baby_attack_effect = model_data.show_baby_attack_effect -- 宝宝攻击特效 model_data.show_jarvis_all_figure_data = model_data.show_jarvis_all_figure_data -- ai娘模型展示包括翅膀磁炮幻甲全套装备 model_data.effect_obj_type = model_data.effect_obj_type --特效主体类型 model_data.load_dance_pose = model_data.load_dance_pose --是否加载舞姿 model_data.role_action_sound = model_data.role_action_sound --动作音效 model_data.do_not_main_role_cloth_res_change = model_data.do_not_main_role_cloth_res_change --时装更改广播之后,不要刷新uimodelcommon的改变 return model_data end --------------------------------------动态设置纹理使用------------------------------------------------------------ --设置Sprite的图片:图片资源在外部icon或iconjpg目录的情况 function LuaResManager:setOutsideSpriteRender(ref_tar, sp_render, respath,call_back) local function loadedCallBack(sp) if sp_render and not ref_tar._use_delete_method then if sp then sp_render.sprite = sp[0] end if call_back then call_back() end end end local abName, res_name = GameResPath.GetOutSideResAbName(respath) self:addRefCount(ref_tar,abName) resMgr:LoadSprites(abName, {res_name}, loadedCallBack, ASSETS_LEVEL.HIGHT) end --设置image的图片:图片资源在外部icon或iconjpg目录的情况 function LuaResManager:setOutsideImageSprite(ref_tar, image, respath, setNativeSize, call_back, force_sprite) if image then self.outsize_list[image] = self.outsize_list[image] or {} local list = {ref_tar=ref_tar,image=image,respath=respath,setNativeSize=setNativeSize,call_back=call_back} table.insert(self.outsize_list[image], list) --资源已在请求中 if #self.outsize_list[image] > 1 then return end end local function loadedCallBack(sp) if image then table.remove(self.outsize_list[image], 1) end if not image or #self.outsize_list[image]==0 then if image and not image:IsDestroyed() then if sp ~= nil and sp[0] then local sprite = sp[0] if force_sprite then -- if force_sprite or sprite:GetType().FullName ~= "UnityEngine.Sprite" then sprite = Util.TextureToSprite(sprite) end image.sprite = sprite if setNativeSize then image:SetNativeSize() end end end if not ref_tar._use_delete_method and call_back then call_back(sp) end else --已有新的加载请求 local list = image and self.outsize_list[image][1] if list then local abName, res_name = GameResPath.GetOutSideResAbName(list.respath) self:addRefCount(ref_tar,abName) resMgr:LoadSprites(abName, {res_name}, loadedCallBack, ASSETS_LEVEL.HIGHT) end end end local abName, res_name = GameResPath.GetOutSideResAbName(respath) self:addRefCount(ref_tar,abName) resMgr:LoadSprites(abName, {res_name}, loadedCallBack, ASSETS_LEVEL.HIGHT) end --设置rawimage的图片:图片资源在外部icon或iconjpg目录的情况 function LuaResManager:setOutsideRawImage(ref_tar, image, respath, setNativeSize, call_back, force_texture) local function loadedCallBack(texture) if image and not image:IsDestroyed() then if texture and texture[0] then local now_res = texture[0] if force_texture then -- if force_texture or now_res:GetType().FullName ~= "UnityEngine.Texture2D" then now_res = now_res.texture end image.texture = now_res if setNativeSize then image:SetNativeSize() end else logWarn("资源"..respath.."缺失!!") end if not ref_tar._use_delete_method and call_back then call_back() end end end local abName, res_name = GameResPath.GetOutSideResAbName(respath) self:addRefCount(ref_tar,abName) resMgr:LoadTexture(abName, {res_name}, loadedCallBack, ASSETS_LEVEL.HIGHT) end --设置image的图片:图片资源在UI预制中的情况 --ref_tar必须是继承baseclass的对象 --not_insert 不是外部设置新的图片,不用插入队列中 function LuaResManager:setImageSprite(ref_tar,image,abName,resName,setNativeSize, call_back, load_level, not_insert) if not not_insert then if image then local list = {ref_tar=ref_tar,image=image,abName=abName,resName=resName,setNativeSize=setNativeSize,call_back=call_back,load_level=load_level} self.image_list = self.image_list or {} self.image_list[image] = self.image_list[image] or {} table.insert(self.image_list[image], list) if self.image_list[image] and #self.image_list[image] > 1 then return end end end load_level = load_level or ASSETS_LEVEL.HIGHT local function loadedCallBack(objs) if not ref_tar._use_delete_method and image and not image:IsDestroyed() then if objs and objs[0] then image.sprite = objs[0] if setNativeSize then image:SetNativeSize() end end if not ref_tar._use_delete_method and call_back then call_back(objs) end end if image and self.image_list[image] then if #self.image_list[image] > 0 then table.remove(self.image_list[image], 1) end if #self.image_list[image] > 0 then local next_image = self.image_list[image][1] self:setImageSprite(next_image.ref_tar,next_image.image,next_image.abName,next_image.resName,next_image.setNativeSize, next_image.call_back, next_image.load_level, true) end end end self:loadSprite(ref_tar, abName, resName, loadedCallBack, load_level) end --设置rawimage的图片:图片资源在UI预制中的情况 --ref_tar必须是继承baseclass的对象 function LuaResManager:setRawImage(ref_tar,image,abName,resName,setNativeSize, call_back) local function loadedCallBack(objs) if not ref_tar._use_delete_method and image and not image:IsDestroyed() then if objs and objs[0] then image.texture = objs[0] if setNativeSize then image:SetNativeSize() end end if not ref_tar._use_delete_method and call_back then call_back() end end end self:loadTexture(ref_tar,abName,{resName},loadedCallBack, ASSETS_LEVEL.HIGHT) end -----------------------------------------对象加载---------------------------------------------------------- --目前只有baseview使用 function LuaResManager:LoadRes(ref_tar, res_type, abName, pfNameList, callBack) if res_type == nil or res_type == LuaResManager.RES_TYPE.PREFAB then self:loadPrefabs(ref_tar, abName, pfNameList, callBack, nil, ASSETS_LEVEL.HIGHT) elseif res_type == LuaResManager.RES_TYPE.SPRITE then self:loadSprites(ref_tar, abName, pfNameList, callBack, ASSETS_LEVEL.HIGHT) end end --加载一个预设 function LuaResManager:loadPrefab(ref_tar,abName,pfName,callBack, ignore_pool, load_level) load_level = load_level or ASSETS_LEVEL.NORMAL if not ref_tar or ref_tar._use_delete_method then return end local reload_prefab = true if not ignore_pool then local obj_pool = self:GetObjFormPool(ref_tar, abName, pfName) if obj_pool and not IsNull(obj_pool) then reload_prefab = false if callBack then --print("--------LoadPool-------",abName) callBack({[0] = obj_pool}, true) -- print("---------loadPrefab from pool -----",abName,pfName) end end end if reload_prefab then self:addRefCount(ref_tar,abName) -- print("--------LoadPrefab-------",abName) resMgr:LoadPrefab(abName, {pfName}, callBack, load_level) -- print("---------loadPrefab from create -----",abName,pfName) -- PrintCallStack() end end --加载多个预设 function LuaResManager:loadPrefabs(ref_tar,abName,pfNameList,callBack, ignore_pool, load_level) load_level = load_level or ASSETS_LEVEL.NORMAL if not ref_tar or ref_tar._use_delete_method then return end if not ignore_pool then local obj_pool = self:GetObjListFormPool(ref_tar, abName, pfNameList) if obj_pool then if callBack then callBack(obj_pool, true) end else self:addRefCount(ref_tar,abName) resMgr:LoadPrefab(abName, pfNameList, callBack, load_level) end else self:addRefCount(ref_tar,abName) resMgr:LoadPrefab(abName, pfNameList, callBack, load_level) end end --加载一个对象 function LuaResManager:loadObject(ref_tar,abName,pfName,callBack, ignore_pool, load_level) load_level = load_level or ASSETS_LEVEL.NORMAL if not ref_tar or ref_tar._use_delete_method then return end local reload_prefab = true if not ignore_pool then local obj_pool = self:GetObjFormPool(ref_tar, abName, pfName) if obj_pool then reload_prefab = false if callBack then callBack({[0] = obj_pool}, true) end end end if reload_prefab then self:addRefCount(ref_tar,abName) resMgr:LoadObject(abName, pfName, callBack, load_level) end end --加载一个材质 function LuaResManager:loadMateaial(ref_tar,abName,pfName,callBack, load_level) load_level = load_level or ASSETS_LEVEL.NORMAL if not ref_tar or ref_tar._use_delete_method then return end self:addRefCount(ref_tar,abName) resMgr:LoadMaterial(abName, pfName, callBack, load_level) end --加载一个精灵 function LuaResManager:loadSprite(ref_tar,abName,pfName,callBack,load_level) load_level = load_level or ASSETS_LEVEL.HIGHT self:addRefCount(ref_tar,abName) resMgr:LoadSprite(abName, pfName, callBack, load_level) end --加载多个精灵 function LuaResManager:loadSprites(ref_tar,abName,pfNameList,callBack,load_level) load_level = load_level or ASSETS_LEVEL.HIGHT self:addRefCount(ref_tar,abName) resMgr:LoadSprites(abName, pfNameList, callBack, load_level) end --加载一张纹理 function LuaResManager:loadTexture(ref_tar,abName,pfNameList,callBack,load_level) load_level = load_level or ASSETS_LEVEL.HIGHT self:addRefCount(ref_tar,abName) resMgr:LoadTexture(abName, pfNameList, callBack, load_level) end --加载二进制数据 function LuaResManager:loadTextAsset(ref_tar,abName,pfName,callBack,load_level) load_level= load_level or ASSETS_LEVEL.NORMAL self:addRefCount(ref_tar,abName) resMgr:LoadTextAsset(abName, pfName, callBack,load_level) end --加载并播放声音 function LuaResManager:loadSound(ref_tar, abName, resName, is_loop,vol_modulus, speed) local custom_speed = speed or 1 if abName ~= LuaSoundManager.SOUND_PRE[LuaSoundManager.SOUND_TYPE.SKILL] then self:addRefCount(ref_tar, abName) end if tonumber(AppConst.EnglineVer) >= 89 then return soundMgr:PlayEffect(abName, resName, is_loop,vol_modulus, custom_speed) else return soundMgr:PlayEffect(abName, resName, is_loop,vol_modulus) end end --加载外部二进制文件,目前只有db加载使用,是常驻内存的,不需引用计数 function LuaResManager:loadOutsideTextAsset(ref_tar, respath, callBack) outsideResMgr:LoadTextAsset(respath, callBack,OutSideFileType.BYTE) end --停止一个声音 function LuaResManager:stopSound(ref_tar, abName, effect_id) if abName ~= LuaSoundManager.SOUND_PRE[LuaSoundManager.SOUND_TYPE.SKILL] then -- self:reduceRefCount(ref_tar, abName) end if effect_id then local res_id = tonumber(effect_id) if res_id then soundMgr:StopEffect(effect_id) else logWarn("stopSound error abName = " .. abName) end end end function LuaResManager:LoadPrefabView(ref_tar, abName, pfName, callBack) local item = { DeleteMe=LuaResManager.__DestroyPrefab, is_loaded = false, gameObject = false, transform = false, SetPosition = function(item, x, y) if item.is_loaded then SetLocalPosition(item.transform, x, y, 0) else item.cache_pos = {x=x, y=y} end end, SetVisible = function(item, is_show) if item.is_loaded then item.gameObject:SetActive(is_show) else item.cache_visible = is_show end end, SetData = function(item, i, v) if item.is_loaded and item.UpdateView then item:UpdateView(i, v) else item.cache_data = {index=i, data=v} end end, AddUIComponent = UIPartical.AddUIComponent, RemoveUIComponent = UIPartical.RemoveUIComponent, } local on_load_prefab = function ( prefab ) if not prefab or not prefab[0] then return end if not ref_tar or ref_tar._use_delete_method or item._use_delete_method then return end local go = newObject(prefab[0]) go.name = pfName item.gameObject = go item.transform = go.transform item.is_loaded = true UIPartical.BeforeLoad(item) if callBack then callBack(item) end if item.cache_visible ~= nil then item.gameObject:SetActive(item.cache_visible) item.cache_visible = nil end if item.cache_pos then SetLocalPosition(item.transform, item.cache_pos.x, item.cache_pos.y, 0) item.cache_pos = nil end if item.cache_data and item.UpdateView then item:UpdateView(item.cache_data.index, item.cache_data.data) item.cache_data = nil end end if not IsUseLocalResource then LuaResManager:getInstance():loadPrefab(ref_tar,abName,pfName, on_load_prefab, true, ASSETS_LEVEL.HIGHT) else --延迟到下一帧再加载,模拟异步加载 local function delay_method( ) local prefab = LuaFramework.PanelMgrEx.GetInstance():LoadPrefabInLocalByFile("Assets/LuaFramework/AssetBundleRes/ui/"..abName.."/prefab/"..pfName..".prefab") on_load_prefab({[0]=prefab}) end setTimeout(delay_method, 0.001) end return item end function LuaResManager.__DestroyPrefab( self ) --回收从LoadPrefabView用的,外部别调用本接口 if self.is_loaded and self.gameObject then UIPartical.AfterDestroy(self) if self.destroy_callback then self.destroy_callback(self) end destroy(self.gameObject) end self._use_delete_method = true end