PartnerViewSystem.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. local PartnerViewSystem = class("PartnerViewSystem")
  2. local MultiTypeAssetLoadSystem = require("MultiTypeAssetLoadSystem")
  3. local previewLayer = 15
  4. local hideLayer = 12
  5. local function SetTransformLayer(trans, layer)
  6. if not trans then return end
  7. trans.gameObject.layer = layer
  8. for i = 0, trans.childCount - 1 do
  9. SetTransformLayer(trans:GetChild(i), layer)
  10. end
  11. end
  12. local function SetGoLayer(modelGo, layer)
  13. if not modelGo then return end
  14. if tolua.isnull(modelGo) then return end
  15. SetTransformLayer(modelGo.transform, layer)
  16. end
  17. local TableToVector2 = function(table)
  18. if not table then return Vector2.zero end
  19. local x = table[1] or 0
  20. local y = table[2] or 0
  21. return Vector2.New(x, y)
  22. end
  23. local function GetAnimatorControllerPath(partnerCfg, partnerInEnvType)
  24. if Enum.RoleInEnvType.Transfer == partnerInEnvType then
  25. return Constants.AnimatorPath, partnerCfg.TransferShowCtrl
  26. -- elseif Enum.RoleInEnvType.MainCity == roleInEnvType then
  27. -- return Constants.AnimatorPath, roleCfg.CityCtrl
  28. elseif Enum.RoleInEnvType.RoleMainView == partnerInEnvType then
  29. return Constants.AnimatorPath, partnerCfg.ShowCtrl
  30. else
  31. return Constants.AnimatorPath, partnerCfg.BattleCtrl
  32. end
  33. end
  34. function PartnerViewSystem:ctor()
  35. self.partnerRoleMap = {}
  36. self.partnerRoleEffectMap = {}
  37. self.curLoadCfgId = nil
  38. self.curStrengthLv = nil
  39. self.singleStrengthEffectLoad = false
  40. self.ownercb = nil
  41. self.cb = nil
  42. self.loadSystem = MultiTypeAssetLoadSystem:new()
  43. self.loadSystem:SetCompleteCB(self, self.PreloadedAssets)
  44. end
  45. function PartnerViewSystem:Dispose()
  46. self:RecycleAll()
  47. previewSystem = nil
  48. self.loadSystem:Dispose()
  49. end
  50. function PartnerViewSystem:GetExistPartnerView(cfgId)
  51. return self.partnerRoleMap[cfgId]
  52. end
  53. function PartnerViewSystem:RefreshView(partnerInEnvType, cfgId, createdOwner, createdCB, strengthLv)
  54. -- 角色模型已经生成成功了
  55. self.partnerInEnvType = partnerInEnvType or Enum.RoleInEnvType.RoleMainView
  56. local role = self:GetExistPartnerView(cfgId)
  57. if role == nil then
  58. self.curLoadCfgId = cfgId
  59. self.curStrengthLv = strengthLv
  60. self.ownercb = createdOwner
  61. self.cb = createdCB
  62. self:RefreshLoadSystem()
  63. self:BeginCreate()
  64. else
  65. self:CancelCreate()
  66. if createdOwner and createdCB then
  67. createdCB(createdOwner, role, (role ~= nil))
  68. end
  69. self.ownercb = nil
  70. self.cb = nil
  71. self.curLoadCfgId = nil
  72. self.curStrengthLv = nil
  73. self.singleStrengthEffectLoad = false
  74. end
  75. return role ~= nil
  76. end
  77. function PartnerViewSystem:RefreshStrengthLv(cfgId, strengthLv, owner, cb)
  78. if self.partnerRoleEffectMap[cfgId] then
  79. SetGoLayer(self.partnerRoleEffectMap[cfgId], hideLayer)
  80. local effectName = self.partnerRoleEffectMap[cfgId].name
  81. local effect = self.partnerRoleEffectMap[cfgId]
  82. if effect then
  83. ManagerContainer.ResMgr:RecycleGO(Constants.EffectPath, effectName, effect)
  84. end
  85. self.partnerRoleEffectMap[cfgId] = nil
  86. end
  87. self.singleStrengthEffectLoad = true
  88. self.curLoadCfgId = cfgId
  89. self.curStrengthLv = strengthLv
  90. self.loadSystem:RemoveLoadAllAsset()
  91. self.ownercb = owner
  92. self.cb = cb
  93. -- 特效
  94. if self.curLoadCfgId then
  95. self.loadSystem:AddLoadAsset(Enum.ResourceType.GameObject, Constants.EffectPath, Constant.PartnerStrengthEffectPath..self.curStrengthLv)
  96. end
  97. self:BeginCreate()
  98. end
  99. function PartnerViewSystem:RefreshLoadSystem()
  100. self.loadSystem:RemoveLoadAllAsset()
  101. local assetName = nil
  102. -- 基本骨骼
  103. if self.curLoadCfgId then
  104. local roleCfg = ManagerContainer.CfgMgr:GetPartnerDataById(self.curLoadCfgId)
  105. if roleCfg == nil then
  106. LogError(self.curLoadCfgId .. "isnt exist in PartnerCfg")
  107. return
  108. end
  109. local avatarData = ManagerContainer.CfgMgr:GetAvatarCfgById(roleCfg.AvatarId)
  110. if avatarData == nil then
  111. LogError(roleCfg.AvatarId .. "isnt exist in AvatarCfg")
  112. return
  113. end
  114. local assetPath, assetName = GetAnimatorControllerPath(roleCfg, self.partnerInEnvType)
  115. self.loadSystem:AddLoadAsset(Enum.ResourceType.GameObject, Constants.ModelPath, avatarData.AvatarPrefab)
  116. self.loadSystem:AddLoadAsset(Enum.ResourceType.AnimatorController, assetPath, assetName)
  117. if self.curStrengthLv and self.curStrengthLv > 0 then
  118. local lv = self.curStrengthLv
  119. if self.curStrengthLv >= 6 then
  120. lv = 6
  121. end
  122. self.loadSystem:AddLoadAsset(Enum.ResourceType.GameObject, Constants.EffectPath, Constant.PartnerStrengthEffectPath..lv)
  123. end
  124. end
  125. end
  126. ---@generic 预加载的资源已加载完成
  127. function PartnerViewSystem:PreloadedAssets()
  128. self:Create()
  129. end
  130. function PartnerViewSystem:BeginCreate()
  131. self.loadSystem:Begin()
  132. end
  133. function PartnerViewSystem:CancelCreate()
  134. if self.curLoadCfgId == nil then return end
  135. self.loadSystem:Cancel()
  136. self.curLoadCfgId = nil
  137. end
  138. function PartnerViewSystem:RecycleAll()
  139. for k,v in pairs(self.partnerRoleMap) do
  140. self:Recycle(k)
  141. end
  142. self.partnerRoleMap = {}
  143. end
  144. function PartnerViewSystem:Recycle(cfgId)
  145. self:CancelCreate()
  146. if self.partnerRoleMap[cfgId] then
  147. local animator = self.partnerRoleMap[cfgId]:GetComponent(Enum.TypeInfo.Animator)
  148. animator.runtimeAnimatorController = nil
  149. local roleCfg = ManagerContainer.CfgMgr:GetPartnerDataById(cfgId)
  150. local avatarData = ManagerContainer.CfgMgr:GetAvatarCfgById(roleCfg.AvatarId)
  151. ManagerContainer.ResMgr:RecycleGO(Constants.ModelPath, avatarData.AvatarPrefab, self.partnerRoleMap[cfgId])
  152. if self.partnerRoleEffectMap[cfgId] then
  153. local effectName = self.partnerRoleEffectMap[cfgId].name
  154. local effect = self.partnerRoleEffectMap[cfgId]
  155. if effect then
  156. ManagerContainer.ResMgr:RecycleGO(Constants.EffectPath, effectName, effect)
  157. end
  158. self.partnerRoleEffectMap[cfgId] = nil
  159. end
  160. self.partnerRoleMap[cfgId] = nil
  161. end
  162. self.ownercb = nil
  163. self.cb = nil
  164. self.curStrengthLv = nil
  165. self.singleStrengthEffectLoad = false
  166. end
  167. -- 需要预先加载好了资源
  168. function PartnerViewSystem:Create()
  169. if not self.singleStrengthEffectLoad then
  170. local assetName = nil
  171. local go = nil
  172. -- 基本骨骼
  173. if self.curLoadCfgId then
  174. local roleCfg = ManagerContainer.CfgMgr:GetPartnerDataById(self.curLoadCfgId)
  175. if roleCfg == nil then
  176. LogError(self.curLoadCfgId .. "isnt exist in PartnerCfg")
  177. return
  178. end
  179. local avatarData = ManagerContainer.CfgMgr:GetAvatarCfgById(roleCfg.AvatarId)
  180. if avatarData == nil then
  181. LogError(roleCfg.AvatarId .. "isnt exist in AvatarCfg")
  182. return
  183. end
  184. go = ManagerContainer.ResMgr:GetGoFromPool(Constants.ModelPath, avatarData.AvatarPrefab)
  185. if go then
  186. self.partnerRoleMap[self.curLoadCfgId] = go
  187. if ManagerContainer.LuaModelMgr and ManagerContainer.LuaModelMgr.ModelRoot then
  188. go.transform:SetParent(ManagerContainer.LuaModelMgr.ModelRoot.transform)
  189. else
  190. go.transform.parent = nil
  191. end
  192. go.transform.position = Vector3.zero;
  193. go.transform.rotation = Quaternion.identity;
  194. go:SetActive(true)
  195. local assetPath, assetName = GetAnimatorControllerPath(roleCfg, self.partnerInEnvType)
  196. local animatorController = ManagerContainer.ResMgr:GetAsset(assetPath, assetName)
  197. local animator = go:GetComponent(Enum.TypeInfo.Animator)
  198. if not animator then
  199. animator = go:AddComponent(Enum.TypeInfo.Animator)
  200. end
  201. animator.runtimeAnimatorController = animatorController
  202. if self.curStrengthLv and self.curStrengthLv > 0 then
  203. local lv = self.curStrengthLv
  204. if self.curStrengthLv >= #Constant.Quality_HeadFrame_Icons then
  205. lv = #Constant.Quality_HeadFrame_Icons
  206. end
  207. local effectName = Constant.PartnerStrengthEffectPath..lv
  208. local foot = go.transform:Find("Foot_Point")
  209. local effect = ManagerContainer.ResMgr:GetGoFromPool(Constants.EffectPath, effectName)
  210. if effect then
  211. effect.name = effectName
  212. effect.transform:SetParent(foot)
  213. effect.transform.localPosition = Vector3.zero
  214. effect.transform.localScale = Vector3.one
  215. self.partnerRoleEffectMap[self.curLoadCfgId] = effect
  216. end
  217. end
  218. end
  219. end
  220. self.curLoadCfgId = nil
  221. if self.ownercb and self.cb then
  222. self.cb(self.ownercb, go, (go ~= nil))
  223. end
  224. self.ownercb = nil
  225. self.cb = nil
  226. return go
  227. else
  228. local go = self.partnerRoleMap[self.curLoadCfgId]
  229. if self.curStrengthLv and self.curStrengthLv > 0 then
  230. local lv = self.curStrengthLv
  231. if self.curStrengthLv >= #Constant.Quality_HeadFrame_Icons then
  232. lv = #Constant.Quality_HeadFrame_Icons
  233. end
  234. local effectName = Constant.PartnerStrengthEffectPath..lv
  235. local foot = go.transform:Find("Foot_Point")
  236. local effect = ManagerContainer.ResMgr:GetGoFromPool(Constants.EffectPath, effectName)
  237. if effect then
  238. effect.name = effectName
  239. effect.transform:SetParent(foot)
  240. effect.transform.localPosition = Vector3.zero
  241. effect.transform.localScale = Vector3.one
  242. self.partnerRoleEffectMap[self.curLoadCfgId] = effect
  243. end
  244. --SetGoLayer(effect, previewLayer)
  245. end
  246. self.singleStrengthEffectLoad = false
  247. if self.ownercb and self.cb then
  248. local effect = self.partnerRoleEffectMap[self.curLoadCfgId]
  249. self.cb(self.ownercb, effect, (effect ~= nil))
  250. end
  251. self.curLoadCfgId = nil
  252. self.ownercb = nil
  253. self.cb = nil
  254. end
  255. end
  256. function PartnerViewSystem:HasGameObjects()
  257. return next(self.partnerRoleMap)
  258. end
  259. function PartnerViewSystem:GetGameObject(cfgId)
  260. return self.partnerRoleMap[cfgId]
  261. end
  262. function PartnerViewSystem:GetRoleEffect(cfgId)
  263. return self.partnerRoleEffectMap[cfgId]
  264. end
  265. function PartnerViewSystem:RolePlayAni(go, aniName)
  266. if go == nil then return end
  267. local animator = go:GetComponent(Enum.TypeInfo.Animator)
  268. if animator == nil then return end
  269. animator:Play(aniName)
  270. end
  271. return PartnerViewSystem