EntityView.lua 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. local EntityView = class("EntityView")
  2. local MultiTypeAssetLoadSystem = require("MultiTypeAssetLoadSystem")
  3. local GameObject = UnityEngine.GameObject
  4. --- 构造
  5. ---@param pos Vector3 初始坐标
  6. ---@param rot Vector3 初始方向
  7. function EntityView:ctor(uid, pos, rot)
  8. self.uid = uid
  9. self.pos = pos:Clone()
  10. self.rot = rot:Clone()
  11. self.isInWorld = false
  12. self.isCreated = false
  13. self.loadSystem = MultiTypeAssetLoadSystem:new()
  14. self.loadSystem:SetCompleteCB(self, self.PreloadedAssets)
  15. end
  16. --- 销毁
  17. function EntityView:Dispose()
  18. if self.isInWorld then self:ExitWorld() end
  19. if self.loadSystem then
  20. self.loadSystem:Dispose()
  21. self.loadSystem = nil
  22. end
  23. self.uid = nil
  24. self.pos = nil
  25. self.rot = nil
  26. self.isInWorld = nil
  27. self.isCreated = nil
  28. end
  29. function EntityView:EnterMap()
  30. self:CollectPreloadAssets()
  31. end
  32. function EntityView:ExitMap()
  33. self:ExitWorld()
  34. end
  35. --- 进入游戏世界
  36. function EntityView:EnterWorld()
  37. self.isInWorld = true
  38. self.isCreated = false
  39. self:CreateContainer()
  40. self:BeginLoadAssets()
  41. end
  42. --- 退出游戏世界
  43. function EntityView:ExitWorld()
  44. if self.loadSystem then
  45. self.loadSystem:Cancel()
  46. end
  47. self.avatarGo = nil
  48. self.avatarTrans = nil
  49. if self.gameObject then GameObject.Destroy(self.gameObject) end
  50. self.gameObject = nil
  51. self.transform = nil
  52. self.isInWorld = false
  53. self.isCreated = false
  54. end
  55. --- 更新
  56. function EntityView:Update(deltaTime)
  57. end
  58. --- 获得名字
  59. function EntityView:GetName()
  60. return self:getClassName()
  61. end
  62. --- 获得根节点
  63. function EntityView:GetParent()
  64. return nil
  65. end
  66. function EntityView:GetTransform()
  67. return self.transform
  68. end
  69. function EntityView:CreateContainer()
  70. -- 创建容器
  71. self.gameObject = GameObject(self:GetName())
  72. self.transform = self.gameObject.transform
  73. self.transform:SetParent(self:GetParent())
  74. self.transform:SetPositionAndRotation(self.pos, Quaternion.identity)
  75. -- 创建转向容器(模型需要转向,而UI则不需要转向)
  76. self.avatarGo = GameObject("Avatar")
  77. self.avatarTrans = self.avatarGo.transform
  78. self.avatarTrans:SetParent(self.transform)
  79. self.avatarTrans:SetPositionAndRotation(self.pos, self.rot)
  80. end
  81. function EntityView:CollectPreloadAssets()
  82. self.loadSystem:RemoveLoadAllAsset()
  83. end
  84. function EntityView:BeginLoadAssets()
  85. self.loadSystem:Begin()
  86. end
  87. --- 获得需要预加载的资源内容
  88. ---@return nil or table(Enum.ResourceType, table(string, int))
  89. function EntityView:StatisticsPreloadAssets(multiTypeAssetLoadSystem)
  90. if not multiTypeAssetLoadSystem then return end
  91. self.loadSystem:AddToLoadSystem(multiTypeAssetLoadSystem)
  92. end
  93. --- 预加载的资源已加载完成
  94. function EntityView:PreloadedAssets()
  95. if not self.isCreated then
  96. self.isCreated = true
  97. self:InitGenerateView()
  98. end
  99. self:OtherGenerateView()
  100. end
  101. function EntityView:InitGenerateView()
  102. end
  103. function EntityView:OtherGenerateView()
  104. end
  105. function EntityView:_SetLayer(trans, layer, enterChild)
  106. if not trans then return end
  107. trans.gameObject.layer = layer
  108. if not enterChild then return end
  109. for i = 0, trans.childCount - 1 do
  110. self:_SetLayer(trans:GetChild(i), layer, enterChild)
  111. end
  112. end
  113. function EntityView:_SetTag(trans, tag, enterChild)
  114. if not trans then return end
  115. trans.tag = tag
  116. if not enterChild then return end
  117. for i = 0, trans.childCount - 1 do
  118. self:_SetTag(trans:GetChild(i), tag, enterChild)
  119. end
  120. end
  121. function EntityView:_SetLayerAndTag(trans, layer, tag, enterChild)
  122. if not trans then return end
  123. trans.tag = tag
  124. trans.gameObject.layer = layer
  125. if not enterChild then return end
  126. for i = 0, trans.childCount - 1 do
  127. self:_SetLayerAndTag(trans:GetChild(i), layer, tag, enterChild)
  128. end
  129. end
  130. return EntityView