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