|
|
- -- <*
- -- @Author: Saber
- -- @Description: 经验副本主界面,动态创建的怪物模型组件
- -- *>
- ExpHangupMonModelItem = ExpHangupMonModelItem or BaseClass(BaseItem)
- local ExpHangupMonModelItem = ExpHangupMonModelItem
- local Status = Status
-
- function ExpHangupMonModelItem:__init(parent_wnd,prefab_asset,layer_name)
- self.base_file = "expDun"
- self.layout_file = "ExpHangupMonModelItem"
- self.parent_wnd = parent_wnd
- self.layer_name = layer_name
- self.pos_origin = Vector2(250, -25) -- 怪物模型坐标原点
- self.first_loaded = true -- 首次加载,如果处在第二阶段首次加载要随机血量,并且需要加载一次模型
- self.hp_node_changed = false -- 在动画开始的时候需要将血条外置并置于最底层,避免覆盖
- self.is_dead = false -- 该怪物是否已经死亡
-
- self.mon_ran_pos = ExpDunAnimConst.MonRamPos
- self.model = ExpDunModel:getInstance()
- self:Load()
- end
-
- function ExpHangupMonModelItem:Load_callback()
- local nodes = {
- "mon_con:obj", "hp_bg:obj",
- -- 血条表现相关
- "hp_bg/fill:img",
- -- 爆炸效果节点
- "explode_effect:obj",
- -- 经验特效节点
- "exp_effect:obj",
- -- 击中效果
- "hit_effect:obj",
- }
- self:GetChildren(nodes)
-
- --微调位置
- SetAnchoredPositionY(self.hit_effect, 40)
-
- self:AddEvents()
- self:InitNodeEffects()
- if self.need_refreshData then
- self:UpdateView()
- end
- end
-
- function ExpHangupMonModelItem:AddEvents( )
-
- end
-
- -- 预先加载特效资源,后面就不需要重复获取了
- function ExpHangupMonModelItem:InitNodeEffects( )
- -- 爆炸特效
- local function explode_load_callback()
- -- 加载完成后马上隐藏节点
- self.explode_effect_obj:SetActive(false)
- end
- self:AddUIEffect("guajibaozha", self.explode_effect, self.layer_name, Vector2(0,0), nil, false, -1, nil, nil, explode_load_callback)
- -- 经验飘字特效
- local function exp_load_callback()
- self.exp_effect_obj:SetActive(false)
- end
- self:AddUIEffect("guajiexp", self.exp_effect, self.layer_name, Vector2(0,0), nil, false, -1, nil, nil, exp_load_callback)
- -- 受击特效
- local function hit_load_callback()
- self:PlayOrStopHitEffect(false)
- end
- self:AddUIEffect("effect_fangzhi_shouji", self.hit_effect, self.layer_name, Vector2(0,10), nil, true, -1, nil, nil, hit_load_callback)
- end
-
- function ExpHangupMonModelItem:UpdateView( )
- if self.stage then
- if self.first_loaded then
- self:ChangeHpParentNode()
- if self.stage ~= 1 then
- self:UpdateMonModel()
- end
- end
- if self.stage == 1 then -- 玩家飞行阶段,这个时候怪物从远处飘过来集合(需要利用蒙版,所以要控制的是怪物模型里面的位置而不是本节点位置)
- self:UpdateStageOne()
- elseif self.stage == 2 then -- 战斗阶段,这个时候要接收怪物战斗表现和血条掉落表现
- if self.stage_data and self.stage_data.cur_hp then
- -- 初始化血量
- self.mon_hp = self.stage_data.cur_hp
- end
- self.mon_pos_origin = self.transform.anchoredPosition
- self:StartMonAutoMove()
- elseif self.stage == 3 then -- 将模型节点移出屏幕(如果怪物2阶段先被打倒也会处理这个阶段)
- self:StopMonAutoAmin()
- end
- -- 关闭首次加载
- self.first_loaded = false
- end
- end
-
- -- 设置怪物死亡后的奖励动画位置
- function ExpHangupMonModelItem:SetRewardAnimCallback(index, reward_anim_callback)
- self.index = index
- self.reward_anim_callback = reward_anim_callback
- self.transform.name = "ExpHangupMonModelItem_" .. self.index
- end
- -- 将血条的节点放在item外,避免出现模型盖住的问题
- function ExpHangupMonModelItem:SetHpParentNode(parent_node)
- self.hp_parent_node = parent_node or self.hp_parent_node
- self:ChangeHpParentNode()
- end
- function ExpHangupMonModelItem:ChangeHpParentNode()
- if not self.hp_node_changed and self.hp_parent_node then
- self.hp_bg:SetParent(self.hp_parent_node)
- self.hp_bg:SetAsLastSibling()
- self:BindHpPositionFunc()
- self.hp_node_changed = true
- end
- end
- function ExpHangupMonModelItem:BindHpPositionFunc( )
- if not self.hp_position_func_id then
- local function hp_func()
- self.hp_bg.anchoredPosition = Vector2(self.transform.anchoredPosition.x, self.transform.anchoredPosition.y + 100)
- end
- self.hp_position_func_id = GlobalTimerQuest:AddPeriodQuest(hp_func, 0.02, -1)
- end
- end
- function ExpHangupMonModelItem:UnBindHpPositionFunc( )
- if self.hp_position_func_id then
- GlobalTimerQuest:CancelQuest(self.hp_position_func_id)
- self.hp_position_func_id = nil
- end
- end
-
- -- 设置阶段参数,用来控制动画表现
- function ExpHangupMonModelItem:SetData( stage, mon_id, stage_data )
- self.stage = stage
- self.mon_id = self.mon_id or mon_id
- -- 父节点创建的节点数据
- -- stage_data:1阶段 pos 代表本节点的最终位置和 mod_pos 动画开始的模型本身起点位置
- self.stage_data = stage_data
- if self.is_loaded then
- self.need_refreshData = false
- self:UpdateView()
- else
- self.need_refreshData = true
- end
- end
-
- -- 加载怪物模型
- function ExpHangupMonModelItem:UpdateMonModel( )
- if not self.mon_con_obj.activeSelf then
- self.mon_con_obj:SetActive(true)
- end
-
- self.transform.anchoredPosition = self.pos_origin + self.stage_data.pos
- -- 获取目标宽度和高度,计算缩放比例,避免RT太大导致出现穿透出界面的情况
- local left_max = 615
- local size_x = (left_max - math.abs(self.transform.anchoredPosition.x)) * 2
- local ratio_x = size_x / 1200
- if not self.last_anim_mon_id or self.last_anim_mon_id ~= self.mon_id then -- 随机到不同的模型之后要重新加载模型
- local res_data = {
- father_node = self,
- transform = self.mon_con,
- fashion_type = FuncOpenModel.TypeId.Monster,
- figure_id = tonumber(self.mon_id),
- size = Vector2(600,360),
- -- raycast_size = Vector2(200, 200),
- action_name_list = action_list,
- scale = 42,
- can_rotate = false,
- rotate = Vector3(0, -90, 0),
- position = Vector3(0, 180, 0),
- show_shadow = false,
- ui_model_type = UIModelCommon.ModelType.RT,
- }
- FuncOpenModel:getInstance():SetModelRes(res_data)
- self.last_anim_mon_id = self.mon_id
- self.mon_rt_model = lua_resM:GetPartModel(self, self.mon_con)
- -- print("Saber:ExpHangupMonModelItem [89] self.mon_rt_model: ",self.mon_rt_model)
- end
- end
-
- ---------- stage 1
- function ExpHangupMonModelItem:UpdateStageOne( )
- -- 初始化血量
- self.mon_hp = 100
- -- self:UpdateGetHit(0) -- 刷新血条
- self.is_dead = false
- self:UpdateMonModel()
- -- 改变怪物模型坐标
- local function change_mon_position(x, y, z)
- self.mon_rt_model = self.mon_rt_model or lua_resM:GetPartModel(self, self.mon_con)
- if self.mon_rt_model then
- self.mon_rt_model:ChangeModelLocalPosition(x, y, z)
- end
- end
- -- 设置位移效果
- local mon_default_pos = Vector3(0, 180, 0)
- local mod_pos = self.stage_data.mod_pos
- change_mon_position(mod_pos.x, mod_pos.y)
- self:ClearMonModelMoveId()
- local cur_time = Status.NowTime
- local anim_time = ExpDunAnimConst.Stage1_Time
- local function mon_model_move()
- local pass_time = Status.NowTime - cur_time
- local progress = pass_time / anim_time
- if progress <= 1 then
- change_mon_position(mon_default_pos.x + mod_pos.x * (1-progress), mon_default_pos.y + mod_pos.y * (1-progress))
- else
- self:ClearMonModelMoveId()
- end
- end
- self.mon_model_move_id = GlobalTimerQuest:AddPeriodQuest(mon_model_move, 0.02, -1)
-
- end
- function ExpHangupMonModelItem:ClearMonModelMoveId( )
- if self.mon_model_move_id then
- GlobalTimerQuest:CancelQuest(self.mon_model_move_id)
- self.mon_model_move_id = nil
- end
- end
- ---------- stage 2
- -- 开启怪物自动漫游的逻辑
- function ExpHangupMonModelItem:StartMonAutoMove( )
- if not self.mon_ram_pos_index then
- self.mon_ram_pos_index = math.random(1, #self.mon_ran_pos)
- else
- local new_pos = self.mon_ram_pos_index
- -- 保证获取一个跟上个坐标不相等的位移点
- while(new_pos == self.mon_ram_pos_index) do
- new_pos = math.random(1, #self.mon_ran_pos)
- end
- self.mon_ram_pos_index = new_pos
- end
- local pos_cfg = self.mon_ran_pos[self.mon_ram_pos_index]
- local auto_pos = Vector3(self.mon_pos_origin.x + pos_cfg.pos.x, self.mon_pos_origin.y + pos_cfg.pos.y, 0)
- local amin_scale = Vector3(pos_cfg.scale, pos_cfg.scale, pos_cfg.scale)
- local call_back = function()
- self:StartMonAutoMove()
- end
- self:StopMonAutoAmin()
- self.role_model_move_anim_id = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.POS, auto_pos, pos_cfg.anim_time, call_back)
- self.role_model_scale_anim_id = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.SCALE, amin_scale, pos_cfg.anim_time)
- end
- function ExpHangupMonModelItem:StopMonAutoAmin( )
- if self.role_model_move_anim_id then
- TweenLite.Stop(self.role_model_move_anim_id)
- self.role_model_move_anim_id = nil
- end
- if self.role_model_scale_anim_id then
- TweenLite.Stop(self.role_model_scale_anim_id)
- self.role_model_scale_anim_id = nil
- end
- end
- -- 更新受击表现
- function ExpHangupMonModelItem:UpdateGetHit(damage)
- if not self.stage == 2 and self.mon_hp > 0 then return end
- if not self.hp_bg_obj.activeSelf then
- self.hp_bg_obj:SetActive(true)
- end
- self.mon_hp = self.mon_hp - damage
- self.mon_hp = self.mon_hp < 0 and 0 or self.mon_hp
- -- self.val_tmp.text = self.mon_hp .. "%"
- self.fill_img.fillAmount = self.mon_hp / 100
- if self.mon_hp > 0 then
- self:PlayShakeEffect()
- self:PlayOrStopHitEffect(true)
- else -- 播放销毁特效,并隐藏节点
- self:PlayOrStopHitEffect(false)
- self.mon_con_obj:SetActive(false)
- self.hp_bg_obj:SetActive(false)
- self:PlayExplodeEffectAnim()
- if self.reward_anim_callback and self.index then
- self.reward_anim_callback(self.index)
- end
- self.is_dead = true
- end
- end
- -- 播放受击抖动效果
- function ExpHangupMonModelItem:PlayShakeEffect( )
-
- end
- -- 播放爆炸效果特效
- function ExpHangupMonModelItem:PlayExplodeEffectAnim( )
- self:InitNodesPos()
- local function anim_end_fun()
- self.explode_effect_obj:SetActive(false)
- self.exp_effect_obj:SetActive(false)
- end
- self.explode_effect_obj:SetActive(true)
- self.exp_effect_obj:SetActive(true)
- local target_posx = self.explode_effect.anchoredPosition.x - 300
- self:ClearExplodeAnimId()
- self.explode_effect_anim_id = TweenLite.to(self, self.explode_effect,
- TweenLite.UiAnimationType.ANCHORED_POSX, target_posx, ExpDunAnimConst.ExplodeMoveTime,
- anim_end_fun, TweenFunc.EASE_IN)
- end
-
- function ExpHangupMonModelItem:ClearExplodeAnimId( )
- if self.explode_effect_anim_id then
- TweenLite.Stop(self.explode_effect_anim_id)
- self.explode_effect_anim_id = nil
- end
- end
-
- function ExpHangupMonModelItem:PlayOrStopHitEffect(play)
- -- self.particleSystems = self.particleSystems or self.hit_effect:GetComponentsInChildren(typeof(UnityEngine.ParticleSystem))
- -- if self.particleSystems then
- -- for i = 0, self.particleSystems.Length - 1 do
- -- if play then
- -- self.particleSystems[i]:Play()
- -- else
- -- self.particleSystems[i]:Stop()
- -- end
- -- end
- -- end
- if play then
- self.hit_effect_obj:SetActive(true)
- else
- self.hit_effect_obj:SetActive(false)
- end
- end
- ---------- stage 3
- -- 初始化各种坐标位置
- function ExpHangupMonModelItem:InitNodesPos( )
- self.explode_effect.anchoredPosition = Vector2(0, 0)
- end
- ---------- stage end
- -- 获取状态相关
- function ExpHangupMonModelItem:GetIsDead( )
- return self.is_dead
- end
- function ExpHangupMonModelItem:GetMonConScale( )
- return self.transform.localScale.x
- end
- function ExpHangupMonModelItem:__delete( )
- self:ClearMonModelMoveId()
- self:ClearExplodeAnimId()
- self:StopMonAutoAmin()
- self:UnBindHpPositionFunc()
- -- 清除模型引用
- lua_resM:clearRoleMode(self)
- self:ClearUIEffect(self.explode_effect)
- self:ClearUIEffect(self.exp_effect)
- self:ClearUIEffect(self.hit_effect)
- end
|