源战役客户端
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

343 lines
13 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 经验副本主界面,动态创建的怪物模型组件
  4. -- *>
  5. ExpHangupMonModelItem = ExpHangupMonModelItem or BaseClass(BaseItem)
  6. local ExpHangupMonModelItem = ExpHangupMonModelItem
  7. local Status = Status
  8. function ExpHangupMonModelItem:__init(parent_wnd,prefab_asset,layer_name)
  9. self.base_file = "expDun"
  10. self.layout_file = "ExpHangupMonModelItem"
  11. self.parent_wnd = parent_wnd
  12. self.layer_name = layer_name
  13. self.pos_origin = Vector2(250, -25) -- 怪物模型坐标原点
  14. self.first_loaded = true -- 首次加载,如果处在第二阶段首次加载要随机血量,并且需要加载一次模型
  15. self.hp_node_changed = false -- 在动画开始的时候需要将血条外置并置于最底层,避免覆盖
  16. self.is_dead = false -- 该怪物是否已经死亡
  17. self.mon_ran_pos = ExpDunAnimConst.MonRamPos
  18. self.model = ExpDunModel:getInstance()
  19. self:Load()
  20. end
  21. function ExpHangupMonModelItem:Load_callback()
  22. local nodes = {
  23. "mon_con:obj", "hp_bg:obj",
  24. -- 血条表现相关
  25. "hp_bg/fill:img",
  26. -- 爆炸效果节点
  27. "explode_effect:obj",
  28. -- 经验特效节点
  29. "exp_effect:obj",
  30. -- 击中效果
  31. "hit_effect:obj",
  32. }
  33. self:GetChildren(nodes)
  34. --微调位置
  35. SetAnchoredPositionY(self.hit_effect, 40)
  36. self:AddEvents()
  37. self:InitNodeEffects()
  38. if self.need_refreshData then
  39. self:UpdateView()
  40. end
  41. end
  42. function ExpHangupMonModelItem:AddEvents( )
  43. end
  44. -- 预先加载特效资源,后面就不需要重复获取了
  45. function ExpHangupMonModelItem:InitNodeEffects( )
  46. -- 爆炸特效
  47. local function explode_load_callback()
  48. -- 加载完成后马上隐藏节点
  49. self.explode_effect_obj:SetActive(false)
  50. end
  51. self:AddUIEffect("guajibaozha", self.explode_effect, self.layer_name, Vector2(0,0), nil, false, -1, nil, nil, explode_load_callback)
  52. -- 经验飘字特效
  53. local function exp_load_callback()
  54. self.exp_effect_obj:SetActive(false)
  55. end
  56. self:AddUIEffect("guajiexp", self.exp_effect, self.layer_name, Vector2(0,0), nil, false, -1, nil, nil, exp_load_callback)
  57. -- 受击特效
  58. local function hit_load_callback()
  59. self:PlayOrStopHitEffect(false)
  60. end
  61. self:AddUIEffect("effect_fangzhi_shouji", self.hit_effect, self.layer_name, Vector2(0,10), nil, true, -1, nil, nil, hit_load_callback)
  62. end
  63. function ExpHangupMonModelItem:UpdateView( )
  64. if self.stage then
  65. if self.first_loaded then
  66. self:ChangeHpParentNode()
  67. if self.stage ~= 1 then
  68. self:UpdateMonModel()
  69. end
  70. end
  71. if self.stage == 1 then -- 玩家飞行阶段,这个时候怪物从远处飘过来集合(需要利用蒙版,所以要控制的是怪物模型里面的位置而不是本节点位置)
  72. self:UpdateStageOne()
  73. elseif self.stage == 2 then -- 战斗阶段,这个时候要接收怪物战斗表现和血条掉落表现
  74. if self.stage_data and self.stage_data.cur_hp then
  75. -- 初始化血量
  76. self.mon_hp = self.stage_data.cur_hp
  77. end
  78. self.mon_pos_origin = self.transform.anchoredPosition
  79. self:StartMonAutoMove()
  80. elseif self.stage == 3 then -- 将模型节点移出屏幕(如果怪物2阶段先被打倒也会处理这个阶段)
  81. self:StopMonAutoAmin()
  82. end
  83. -- 关闭首次加载
  84. self.first_loaded = false
  85. end
  86. end
  87. -- 设置怪物死亡后的奖励动画位置
  88. function ExpHangupMonModelItem:SetRewardAnimCallback(index, reward_anim_callback)
  89. self.index = index
  90. self.reward_anim_callback = reward_anim_callback
  91. self.transform.name = "ExpHangupMonModelItem_" .. self.index
  92. end
  93. -- 将血条的节点放在item外,避免出现模型盖住的问题
  94. function ExpHangupMonModelItem:SetHpParentNode(parent_node)
  95. self.hp_parent_node = parent_node or self.hp_parent_node
  96. self:ChangeHpParentNode()
  97. end
  98. function ExpHangupMonModelItem:ChangeHpParentNode()
  99. if not self.hp_node_changed and self.hp_parent_node then
  100. self.hp_bg:SetParent(self.hp_parent_node)
  101. self.hp_bg:SetAsLastSibling()
  102. self:BindHpPositionFunc()
  103. self.hp_node_changed = true
  104. end
  105. end
  106. function ExpHangupMonModelItem:BindHpPositionFunc( )
  107. if not self.hp_position_func_id then
  108. local function hp_func()
  109. self.hp_bg.anchoredPosition = Vector2(self.transform.anchoredPosition.x, self.transform.anchoredPosition.y + 100)
  110. end
  111. self.hp_position_func_id = GlobalTimerQuest:AddPeriodQuest(hp_func, 0.02, -1)
  112. end
  113. end
  114. function ExpHangupMonModelItem:UnBindHpPositionFunc( )
  115. if self.hp_position_func_id then
  116. GlobalTimerQuest:CancelQuest(self.hp_position_func_id)
  117. self.hp_position_func_id = nil
  118. end
  119. end
  120. -- 设置阶段参数,用来控制动画表现
  121. function ExpHangupMonModelItem:SetData( stage, mon_id, stage_data )
  122. self.stage = stage
  123. self.mon_id = self.mon_id or mon_id
  124. -- 父节点创建的节点数据
  125. -- stage_data:1阶段 pos 代表本节点的最终位置和 mod_pos 动画开始的模型本身起点位置
  126. self.stage_data = stage_data
  127. if self.is_loaded then
  128. self.need_refreshData = false
  129. self:UpdateView()
  130. else
  131. self.need_refreshData = true
  132. end
  133. end
  134. -- 加载怪物模型
  135. function ExpHangupMonModelItem:UpdateMonModel( )
  136. if not self.mon_con_obj.activeSelf then
  137. self.mon_con_obj:SetActive(true)
  138. end
  139. self.transform.anchoredPosition = self.pos_origin + self.stage_data.pos
  140. -- 获取目标宽度和高度,计算缩放比例,避免RT太大导致出现穿透出界面的情况
  141. local left_max = 615
  142. local size_x = (left_max - math.abs(self.transform.anchoredPosition.x)) * 2
  143. local ratio_x = size_x / 1200
  144. if not self.last_anim_mon_id or self.last_anim_mon_id ~= self.mon_id then -- 随机到不同的模型之后要重新加载模型
  145. local res_data = {
  146. father_node = self,
  147. transform = self.mon_con,
  148. fashion_type = FuncOpenModel.TypeId.Monster,
  149. figure_id = tonumber(self.mon_id),
  150. size = Vector2(600,360),
  151. -- raycast_size = Vector2(200, 200),
  152. action_name_list = action_list,
  153. scale = 42,
  154. can_rotate = false,
  155. rotate = Vector3(0, -90, 0),
  156. position = Vector3(0, 180, 0),
  157. show_shadow = false,
  158. ui_model_type = UIModelCommon.ModelType.RT,
  159. }
  160. FuncOpenModel:getInstance():SetModelRes(res_data)
  161. self.last_anim_mon_id = self.mon_id
  162. self.mon_rt_model = lua_resM:GetPartModel(self, self.mon_con)
  163. -- print("Saber:ExpHangupMonModelItem [89] self.mon_rt_model: ",self.mon_rt_model)
  164. end
  165. end
  166. ---------- stage 1
  167. function ExpHangupMonModelItem:UpdateStageOne( )
  168. -- 初始化血量
  169. self.mon_hp = 100
  170. -- self:UpdateGetHit(0) -- 刷新血条
  171. self.is_dead = false
  172. self:UpdateMonModel()
  173. -- 改变怪物模型坐标
  174. local function change_mon_position(x, y, z)
  175. self.mon_rt_model = self.mon_rt_model or lua_resM:GetPartModel(self, self.mon_con)
  176. if self.mon_rt_model then
  177. self.mon_rt_model:ChangeModelLocalPosition(x, y, z)
  178. end
  179. end
  180. -- 设置位移效果
  181. local mon_default_pos = Vector3(0, 180, 0)
  182. local mod_pos = self.stage_data.mod_pos
  183. change_mon_position(mod_pos.x, mod_pos.y)
  184. self:ClearMonModelMoveId()
  185. local cur_time = Status.NowTime
  186. local anim_time = ExpDunAnimConst.Stage1_Time
  187. local function mon_model_move()
  188. local pass_time = Status.NowTime - cur_time
  189. local progress = pass_time / anim_time
  190. if progress <= 1 then
  191. change_mon_position(mon_default_pos.x + mod_pos.x * (1-progress), mon_default_pos.y + mod_pos.y * (1-progress))
  192. else
  193. self:ClearMonModelMoveId()
  194. end
  195. end
  196. self.mon_model_move_id = GlobalTimerQuest:AddPeriodQuest(mon_model_move, 0.02, -1)
  197. end
  198. function ExpHangupMonModelItem:ClearMonModelMoveId( )
  199. if self.mon_model_move_id then
  200. GlobalTimerQuest:CancelQuest(self.mon_model_move_id)
  201. self.mon_model_move_id = nil
  202. end
  203. end
  204. ---------- stage 2
  205. -- 开启怪物自动漫游的逻辑
  206. function ExpHangupMonModelItem:StartMonAutoMove( )
  207. if not self.mon_ram_pos_index then
  208. self.mon_ram_pos_index = math.random(1, #self.mon_ran_pos)
  209. else
  210. local new_pos = self.mon_ram_pos_index
  211. -- 保证获取一个跟上个坐标不相等的位移点
  212. while(new_pos == self.mon_ram_pos_index) do
  213. new_pos = math.random(1, #self.mon_ran_pos)
  214. end
  215. self.mon_ram_pos_index = new_pos
  216. end
  217. local pos_cfg = self.mon_ran_pos[self.mon_ram_pos_index]
  218. local auto_pos = Vector3(self.mon_pos_origin.x + pos_cfg.pos.x, self.mon_pos_origin.y + pos_cfg.pos.y, 0)
  219. local amin_scale = Vector3(pos_cfg.scale, pos_cfg.scale, pos_cfg.scale)
  220. local call_back = function()
  221. self:StartMonAutoMove()
  222. end
  223. self:StopMonAutoAmin()
  224. self.role_model_move_anim_id = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.POS, auto_pos, pos_cfg.anim_time, call_back)
  225. self.role_model_scale_anim_id = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.SCALE, amin_scale, pos_cfg.anim_time)
  226. end
  227. function ExpHangupMonModelItem:StopMonAutoAmin( )
  228. if self.role_model_move_anim_id then
  229. TweenLite.Stop(self.role_model_move_anim_id)
  230. self.role_model_move_anim_id = nil
  231. end
  232. if self.role_model_scale_anim_id then
  233. TweenLite.Stop(self.role_model_scale_anim_id)
  234. self.role_model_scale_anim_id = nil
  235. end
  236. end
  237. -- 更新受击表现
  238. function ExpHangupMonModelItem:UpdateGetHit(damage)
  239. if not self.stage == 2 and self.mon_hp > 0 then return end
  240. if not self.hp_bg_obj.activeSelf then
  241. self.hp_bg_obj:SetActive(true)
  242. end
  243. self.mon_hp = self.mon_hp - damage
  244. self.mon_hp = self.mon_hp < 0 and 0 or self.mon_hp
  245. -- self.val_tmp.text = self.mon_hp .. "%"
  246. self.fill_img.fillAmount = self.mon_hp / 100
  247. if self.mon_hp > 0 then
  248. self:PlayShakeEffect()
  249. self:PlayOrStopHitEffect(true)
  250. else -- 播放销毁特效,并隐藏节点
  251. self:PlayOrStopHitEffect(false)
  252. self.mon_con_obj:SetActive(false)
  253. self.hp_bg_obj:SetActive(false)
  254. self:PlayExplodeEffectAnim()
  255. if self.reward_anim_callback and self.index then
  256. self.reward_anim_callback(self.index)
  257. end
  258. self.is_dead = true
  259. end
  260. end
  261. -- 播放受击抖动效果
  262. function ExpHangupMonModelItem:PlayShakeEffect( )
  263. end
  264. -- 播放爆炸效果特效
  265. function ExpHangupMonModelItem:PlayExplodeEffectAnim( )
  266. self:InitNodesPos()
  267. local function anim_end_fun()
  268. self.explode_effect_obj:SetActive(false)
  269. self.exp_effect_obj:SetActive(false)
  270. end
  271. self.explode_effect_obj:SetActive(true)
  272. self.exp_effect_obj:SetActive(true)
  273. local target_posx = self.explode_effect.anchoredPosition.x - 300
  274. self:ClearExplodeAnimId()
  275. self.explode_effect_anim_id = TweenLite.to(self, self.explode_effect,
  276. TweenLite.UiAnimationType.ANCHORED_POSX, target_posx, ExpDunAnimConst.ExplodeMoveTime,
  277. anim_end_fun, TweenFunc.EASE_IN)
  278. end
  279. function ExpHangupMonModelItem:ClearExplodeAnimId( )
  280. if self.explode_effect_anim_id then
  281. TweenLite.Stop(self.explode_effect_anim_id)
  282. self.explode_effect_anim_id = nil
  283. end
  284. end
  285. function ExpHangupMonModelItem:PlayOrStopHitEffect(play)
  286. -- self.particleSystems = self.particleSystems or self.hit_effect:GetComponentsInChildren(typeof(UnityEngine.ParticleSystem))
  287. -- if self.particleSystems then
  288. -- for i = 0, self.particleSystems.Length - 1 do
  289. -- if play then
  290. -- self.particleSystems[i]:Play()
  291. -- else
  292. -- self.particleSystems[i]:Stop()
  293. -- end
  294. -- end
  295. -- end
  296. if play then
  297. self.hit_effect_obj:SetActive(true)
  298. else
  299. self.hit_effect_obj:SetActive(false)
  300. end
  301. end
  302. ---------- stage 3
  303. -- 初始化各种坐标位置
  304. function ExpHangupMonModelItem:InitNodesPos( )
  305. self.explode_effect.anchoredPosition = Vector2(0, 0)
  306. end
  307. ---------- stage end
  308. -- 获取状态相关
  309. function ExpHangupMonModelItem:GetIsDead( )
  310. return self.is_dead
  311. end
  312. function ExpHangupMonModelItem:GetMonConScale( )
  313. return self.transform.localScale.x
  314. end
  315. function ExpHangupMonModelItem:__delete( )
  316. self:ClearMonModelMoveId()
  317. self:ClearExplodeAnimId()
  318. self:StopMonAutoAmin()
  319. self:UnBindHpPositionFunc()
  320. -- 清除模型引用
  321. lua_resM:clearRoleMode(self)
  322. self:ClearUIEffect(self.explode_effect)
  323. self:ClearUIEffect(self.exp_effect)
  324. self:ClearUIEffect(self.hit_effect)
  325. end