|
--ui挂接模型处理
|
|
UIModelCommon = UIModelCommon or BaseClass(UIPartical)
|
|
UIModelCommon.ModelType =
|
|
{
|
|
RT = 1,
|
|
BackModel = 2,
|
|
Model = 3,
|
|
}
|
|
|
|
local UIModelCommon = UIModelCommon
|
|
local ModelPartName = ModelPartName
|
|
|
|
function UIModelCommon:__init(go,parent,model_data)
|
|
self.particle_mgr = ParticleManager:getInstance()
|
|
self.model_type = UIModelCommon.ModelType.RT
|
|
self.gameObject = go
|
|
self.parent = parent
|
|
self.model_data = model_data
|
|
self.particle_list = {}
|
|
self.load_res_target = {}
|
|
self.show_shadow = model_data.show_shadow
|
|
self.raycastParent = model_data.raycastParent
|
|
self.layer_name = model_data.layer_name or "UI"
|
|
self.delay_play_action_timer_list = {}
|
|
self.pearl_list = {}
|
|
self.pearl_parent = {}
|
|
end
|
|
|
|
function UIModelCommon:__delete()
|
|
self.cache_bones = {}
|
|
self:ClearActionTimerList()
|
|
self:RemoveAllParticle()
|
|
if self.cache_effect_list then
|
|
for obj_type, list in pairs(self.cache_effect_list) do
|
|
for k,v in pairs(list) do
|
|
destroy(v.go)
|
|
end
|
|
end
|
|
end
|
|
|
|
if self.light_go then
|
|
destroy(self.light_go)
|
|
end
|
|
|
|
if self.clothe then
|
|
self.clothe:DeleteMe()
|
|
self.clothe = nil
|
|
end
|
|
|
|
if self.head_wear then
|
|
self.head_wear:DeleteMe()
|
|
self.head_wear = nil
|
|
end
|
|
if self.weapon_clothe_obj then
|
|
self.weapon_clothe_obj:DeleteMe()
|
|
self.weapon_clothe_obj = nil
|
|
self.weapon_clothe_id = nil
|
|
end
|
|
|
|
if self.role then
|
|
destroy(self.role)
|
|
self.role = nil
|
|
end
|
|
if self.horse_gameObject then
|
|
destroy(self.horse_gameObject)
|
|
self.horse_gameObject = nil
|
|
end
|
|
if self.gameObject then
|
|
destroy(self.gameObject)
|
|
end
|
|
if self.weapon_hand_list then
|
|
for k,v in pairs(self.weapon_hand_list) do
|
|
destroy(v)
|
|
self.weapon_hand_list[k] = nil
|
|
end
|
|
end
|
|
if self.head_wear_animator then
|
|
self.head_wear_animator = nil
|
|
end
|
|
if self.deay_show_warSoul then
|
|
GlobalTimerQuest:CancelQuest(self.deay_show_warSoul)
|
|
self.deay_show_warSoul = nil
|
|
end
|
|
|
|
if self.deay_show_light then
|
|
GlobalTimerQuest:CancelQuest(self.deay_show_light)
|
|
self.deay_show_light = nil
|
|
end
|
|
|
|
if self.weapon_event_id then
|
|
GlobalEventSystem:UnBind(self.weapon_event_id)
|
|
self.weapon_event_id = nil
|
|
end
|
|
if self.fahion_event_id then
|
|
GlobalEventSystem:UnBind(self.fahion_event_id)
|
|
self.fahion_event_id = nil
|
|
end
|
|
if self.cloth_event_id then
|
|
GlobalEventSystem:UnBind(self.cloth_event_id)
|
|
self.cloth_event_id = nil
|
|
end
|
|
|
|
if self.args_fun_event_id then
|
|
GlobalEventSystem:UnBind(self.args_fun_event_id)
|
|
self.args_fun_event_id = nil
|
|
end
|
|
|
|
if self.viseble_change_id then
|
|
GlobalEventSystem:UnBind(self.viseble_change_id)
|
|
self.viseble_change_id = nil
|
|
end
|
|
|
|
for k,v in pairs(self.pearl_list) do
|
|
v:DeleteMe()
|
|
end
|
|
self.pearl_list = {}
|
|
|
|
for k,v in pairs(self.pearl_parent) do
|
|
if self.pearl_parent[k] then
|
|
destroy(self.pearl_parent[k])
|
|
self.pearl_parent[k] = nil
|
|
end
|
|
end
|
|
self.pearl_parent = {}
|
|
|
|
if self.raycastGo then
|
|
destroy(self.raycastGo)
|
|
end
|
|
|
|
lua_resM:clearReference(self.load_res_target)
|
|
|
|
self:StopSkillPreViewTimer()
|
|
|
|
|
|
end
|
|
|
|
function UIModelCommon:AddEvents()
|
|
if self.can_rotate then
|
|
local function touch_begin(target,pos_x, pos_y)
|
|
self.pos_x = pos_x
|
|
end
|
|
local function draging(target,pos_x, pos_y)
|
|
self:OnDragging(pos_x, pos_y)
|
|
end
|
|
local function touch_end(target,pos_x, pos_y)
|
|
end
|
|
local rtGo = self.parent.gameObject
|
|
if self.model_data.raycast_size then
|
|
self.parent:GetComponent("RawImage").raycastTarget = false
|
|
self.raycastGo = GameObject.New("raycast_"..self.parent.gameObject.name)
|
|
self.raycastGo.transform:SetParent(self.parent.transform)
|
|
local eImage = self.raycastGo:AddComponent(typeof(LuaFramework.EmptyRaycast))
|
|
self.raycastGo.transform.localPosition = Vector3.zero
|
|
self.raycastGo.transform.sizeDelta = Vector2(self.model_data.raycast_size.x, self.model_data.raycast_size.y)
|
|
self.raycastGo.transform.localScale = Vector3.one
|
|
eImage.raycastTarget = true
|
|
-- if type(self.raycastParent) ~= "userdata" and self.raycastParent.use_background then
|
|
self.raycastGo.transform:SetSiblingIndex(1)
|
|
-- else
|
|
-- self.raycastGo.transform:SetSiblingIndex(0)
|
|
-- end
|
|
rtGo = self.raycastGo
|
|
else
|
|
self.parent:GetComponent("RawImage").raycastTarget = true
|
|
end
|
|
AddDragBeginEvent(rtGo, touch_begin)
|
|
AddDragEvent(rtGo, draging)
|
|
AddDragEndEvent(rtGo, touch_end)
|
|
-- AddUpEvent(self.parent.gameObject, touch_end)
|
|
elseif self.skill_preview and self.skill_id then
|
|
local function on_click()
|
|
self:PlaySkillEffect(self.role, self.skill_id)
|
|
end
|
|
local rtGo = self.parent.gameObject
|
|
if self.model_data.raycast_size then
|
|
self.parent:GetComponent("RawImage").raycastTarget = false
|
|
self.raycastGo = GameObject.New("raycast_"..self.parent.gameObject.name)
|
|
self.raycastGo.transform:SetParent(self.parent.transform)
|
|
local eImage = self.raycastGo:AddComponent(typeof(LuaFramework.EmptyRaycast))
|
|
self.raycastGo.transform.localPosition = Vector3.zero
|
|
self.raycastGo.transform.sizeDelta = Vector2(self.model_data.raycast_size.x, self.model_data.raycast_size.y)
|
|
self.raycastGo.transform.localScale = Vector3.one
|
|
eImage.raycastTarget = true
|
|
self.raycastGo.transform:SetSiblingIndex(1)
|
|
rtGo = self.raycastGo
|
|
else
|
|
self.parent:GetComponent("RawImage").raycastTarget = true
|
|
end
|
|
AddClickEvent(rtGo,on_click)
|
|
|
|
else
|
|
self.parent:GetComponent("RawImage").raycastTarget = false
|
|
end
|
|
|
|
if self.type and self.type == SceneBaseType.MainRole then
|
|
--武器变化
|
|
local weapon_fun = function (_type, weapon_id, career, weapon_clothe)
|
|
if self.do_not_main_role_cloth_res_change then return end
|
|
if not IsNull(self.role) then
|
|
self:CreateWeapon(_type, weapon_id, career, weapon_clothe)
|
|
end
|
|
end
|
|
self.weapon_event_id = GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_WEAPON_RES_CHANGE, weapon_fun)
|
|
|
|
--时装变化(暂不包括武器时装)
|
|
local fashion_fun = function (_type, fashion_model_id, texture_id)
|
|
if self.do_not_main_role_cloth_res_change then return end
|
|
if not IsNull(self.role) then
|
|
if self.clothe_res_id then
|
|
if self.clothe_res_id == fashion_model_id then
|
|
self:CreateClothTexture(fashion_model_id, texture_id)
|
|
else
|
|
self:SetData(self.parent, self.model_data)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
self.fahion_event_id = GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_FASHION_RES_CHANGE, fashion_fun)
|
|
|
|
--衣服改变
|
|
local cloth_fun = function (_type, clothe_res_id)
|
|
if self.do_not_main_role_cloth_res_change then return end
|
|
if not IsNull(self.role) then
|
|
self:SetData(self.parent, self.model_data)
|
|
end
|
|
end
|
|
self.cloth_event_id = GlobalEventSystem:Bind(SceneEventType.MAIN_ROLE_CLOTH_RES_CHANGE, cloth_fun)
|
|
|
|
--默认摄像机参数改变
|
|
local on_args_fun = function ()
|
|
self:SetCameraArgs(true)
|
|
end
|
|
self.args_fun_event_id = GlobalEventSystem:Bind(EventName.UPDATE_UIMODEL_CAMERA_DEFAULT_ARGS, on_args_fun)
|
|
end
|
|
|
|
--visible改变时重新播动作
|
|
local action_fun = function()
|
|
if not IsNull(self.role) and self.replay_action_name then
|
|
local is_show = self.role and self.role.activeInHierarchy
|
|
if not is_show then
|
|
self._has_set_hide = true
|
|
end
|
|
|
|
--从隐藏到显示
|
|
if is_show == true and self._has_set_hide then
|
|
self._has_set_hide = false
|
|
local last_action = self.replay_action_name or "show"
|
|
local action_list = {last_action}
|
|
self:DelayPlayNextAction(nil, action_list, 0)
|
|
end
|
|
end
|
|
end
|
|
self.viseble_change_id = GlobalEventSystem:Bind(BaseView.ChangeVisible, action_fun)
|
|
end
|
|
|
|
function UIModelCommon:OnDragging(pos_x, pos_y)
|
|
if pos_x and self.pos_x then
|
|
local delta_x = pos_x - self.pos_x
|
|
local speed = 6
|
|
if self.role then
|
|
if delta_x > 0 then
|
|
self.rotate = self.rotate - speed
|
|
-- self.role.transform:Rotate(Vector3(0, -speed, 0))
|
|
if self.horse_transform and (self.type == SceneBaseType.Include_Horse
|
|
or self.type == SceneBaseType.Baby_Include_Horse) then
|
|
--如果人物身上有马,要旋转马,因为self.role被丢进马里去当子物体了
|
|
self.horse_transform:Rotate(Vector3.up, -speed, UnityEngine.Space.World)
|
|
else
|
|
self.role.transform:Rotate(Vector3.up, -speed, UnityEngine.Space.World)
|
|
end
|
|
else
|
|
self.rotate = self.rotate + speed
|
|
-- self.role.transform:Rotate(Vector3(0, speed, 0))
|
|
if self.horse_transform and (self.type == SceneBaseType.Include_Horse
|
|
or self.type == SceneBaseType.Baby_Include_Horse) then
|
|
--如果人物身上有马,要旋转马,因为self.role被丢进马里去当子物体了
|
|
self.horse_transform:Rotate(Vector3.up, speed, UnityEngine.Space.World)
|
|
else
|
|
self.role.transform:Rotate(Vector3.up, speed, UnityEngine.Space.World)
|
|
end
|
|
end
|
|
self.pos_x = pos_x
|
|
end
|
|
else
|
|
print("---UIModelClassByRT--OnDragging-pos_x-:", pos_x)
|
|
print("---UIModelClassByRT--OnDragging-pos_y-:", pos_y)
|
|
end
|
|
end
|
|
|
|
|
|
function UIModelCommon:ClearActionTimerList()
|
|
if self.delay_play_action_timer_list then
|
|
for i, id in ipairs(self.delay_play_action_timer_list) do
|
|
GlobalTimerQuest:CancelQuest(id)
|
|
end
|
|
self.delay_play_action_timer_list = {}
|
|
end
|
|
end
|
|
|
|
function UIModelCommon:PlayActions(action_name_list,action_delta,animator)
|
|
if IsNull(self.role) then return end
|
|
animator = animator or self.role:GetComponent("Animator")
|
|
if not IsTableEmpty(action_name_list) then
|
|
local action_name = action_delta and action_name_list[1] or table.remove(action_name_list, 1)
|
|
if action_name then
|
|
local animator = self.role:GetComponent("Animator")
|
|
animator:CrossFade( action_name,0, 0.0 )
|
|
if not IsTableEmpty(action_name_list) then
|
|
self.delay_play_action_timer_list = self.delay_play_action_timer_list or {}
|
|
if action_delta then
|
|
self:DelayPlayNextActionLoop(animator, action_name_list, action_delta)
|
|
else
|
|
self:DelayPlayNextAction(animator, action_name_list)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--随机循环动作列表 暂时不添加音效
|
|
--action_name_list.idle_name 默认待机动作
|
|
function UIModelCommon:DelayPlayNextActionLoop(animator, action_name_list, action_delta)
|
|
if animator == nil then return end
|
|
if IsTableEmpty(action_name_list) then return end
|
|
animator:Update(0)
|
|
local cur_state = animator:GetCurrentAnimatorStateInfo(0)
|
|
local action_time = 0
|
|
if not cur_state then return end
|
|
action_time = cur_state.length
|
|
local idle_action = action_name_list.idle_name or "idle"
|
|
local delay_play = function ()
|
|
local action_name = action_name_list[ math.random(1,#action_name_list)]
|
|
animator:CrossFade(action_name, 0.0, 0.0)
|
|
self:DelayPlayNextActionLoop(animator, action_name_list, action_delta)
|
|
end
|
|
local play_idle = function ()
|
|
animator:CrossFade(idle_action, 0.3, 0.0 )
|
|
end
|
|
--清理计时器列表
|
|
if #self.delay_play_action_timer_list >= 20 then
|
|
self:ClearActionTimerList()
|
|
end
|
|
action_delta = action_delta < action_time and action_time + 1 or action_delta
|
|
table.insert(self.delay_play_action_timer_list, GlobalTimerQuest:AddDelayQuest(play_idle,action_time))
|
|
table.insert(self.delay_play_action_timer_list, GlobalTimerQuest:AddDelayQuest(delay_play,action_delta))
|
|
end
|
|
|
|
--延迟播放下一个动作
|
|
function UIModelCommon:DelayPlayNextAction(animator, action_name_list, force_delay_action_time)
|
|
|
|
if not IsTableEmpty(action_name_list) then
|
|
animator = animator or self.role:GetComponent("Animator")
|
|
local cur_state = 0
|
|
local action_time = 0
|
|
if force_delay_action_time and force_delay_action_time > 0 then
|
|
action_time = force_delay_action_time
|
|
else
|
|
animator:Update(0)
|
|
cur_state = animator:GetCurrentAnimatorStateInfo(0)
|
|
action_time = cur_state.length
|
|
end
|
|
if animator and action_time and action_time > 0 then
|
|
local delay_play = function ()
|
|
if IsNull(animator) or self._use_delete_method then
|
|
return
|
|
end
|
|
local action_name = table.remove(action_name_list, 1)
|
|
if animator and action_name then
|
|
animator:CrossFade(action_name, 0.1, 0.0 )
|
|
if not IsNull(self.head_wear_animator) then
|
|
self.head_wear_animator:CrossFade(action_name, 0.2, 0.0 )
|
|
end
|
|
self:CreateEffect(self.type, self.clothe_res_id, self.role, action_name)
|
|
if not IsTableEmpty(action_name_list) then
|
|
self:DelayPlayNextAction(animator, action_name_list)
|
|
else
|
|
--播完动作再重置一下相机灯光参数
|
|
if self.use_light_data then
|
|
self:ApplyCameraLightData()
|
|
end
|
|
end
|
|
else
|
|
return
|
|
end
|
|
end
|
|
table.insert(self.delay_play_action_timer_list, GlobalTimerQuest:AddDelayQuest(delay_play,action_time))
|
|
else
|
|
return
|
|
end
|
|
end
|
|
return
|
|
end
|
|
|
|
--创建武器
|
|
function UIModelCommon:CreateWeapon(_type, weapon_res_id, career, weapon_clothe)
|
|
if _type and _type == SceneBaseType.Monster then
|
|
return
|
|
end
|
|
self.weapon_res_id = weapon_res_id
|
|
if _type and weapon_res_id then
|
|
local abName,weapon_attach_list,weapon_res_list = GameResPath.GetWeaponRes(_type,weapon_res_id,career)
|
|
local function localWeaponCallback(objs, is_gameObject)
|
|
if not self._use_delete_method then
|
|
if weapon_attach_list and objs then
|
|
if self.weapon_container then
|
|
for k,v in pairs(self.weapon_container) do
|
|
destroy(v.go)
|
|
end
|
|
end
|
|
|
|
if self.weapon_clothe_obj then
|
|
self.weapon_clothe_obj:DeleteMe()
|
|
self.weapon_clothe_obj = nil
|
|
end
|
|
|
|
local bone_go = nil
|
|
self.weapon_container = {}
|
|
for k,boneName in ipairs(weapon_attach_list) do
|
|
bone_go = FindBone(self.role.transform,boneName)
|
|
if bone_go then
|
|
local go = is_gameObject and objs[k] or newObject(objs[k-1])
|
|
if go then
|
|
go.transform.parent = bone_go.transform
|
|
go.transform.localPosition = Vector3.zero
|
|
go.transform.localRotation = Quaternion.Euler(Vector3.zero)
|
|
go.transform.localScale = Vector3.one
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(self.parent.transform)
|
|
end
|
|
self:CheckShadow(go, weapon_attach_list[i])
|
|
self.weapon_container[boneName] = {go = go, abName = abName, resName = weapon_res_list[k], index = k}
|
|
go:SetActive(true)
|
|
-- if weapon_clothe and weapon_clothe ~= "" and tonumber(weapon_clothe) ~= 0 then
|
|
-- local mesh = go:GetComponentInChildren(typeof(UnityEngine.MeshRenderer))
|
|
-- if mesh and mesh.material then
|
|
-- local res = weapon_res_id .. "_" .. weapon_clothe
|
|
-- self.weapon_clothe_obj = Weapon.New( mesh.material, res)
|
|
-- end
|
|
-- end
|
|
end
|
|
end
|
|
end
|
|
--部件特效,参数为部件类型与id
|
|
self:CreateEffect(SceneBaseType.FWeapon, self.weapon_res_id)
|
|
end
|
|
end
|
|
end
|
|
if self.role and self.role.transform and abName and weapon_res_list then
|
|
LuaResManager:getInstance():loadPrefabs(self,abName,weapon_res_list, localWeaponCallback)
|
|
end
|
|
end
|
|
end
|
|
|
|
--时装衣服贴图
|
|
function UIModelCommon:CreateClothTexture(fashion_model_id, texture_id)
|
|
self.fashion_model_id = fashion_model_id
|
|
self.texture_id = texture_id
|
|
-- if fashion_model_id and texture_id and tonumber(texture_id) ~= 0 and self.gameObject then --使用贴图
|
|
-- if self.clothe then
|
|
-- self.clothe:DeleteMe()
|
|
-- self.clothe = nil
|
|
-- end
|
|
-- local texture_res = fashion_model_id .. "_" .. texture_id
|
|
-- self.skin_mesh_renderer = self.gameObject:GetComponentInChildren(typeof(UnityEngine.SkinnedMeshRenderer))
|
|
-- if self.skin_mesh_renderer and self.skin_mesh_renderer.material and texture_res then
|
|
-- self.clothe = Clothe.New(self.skin_mesh_renderer.material,texture_res)
|
|
-- end
|
|
-- end
|
|
end
|
|
|
|
--创建翅膀
|
|
function UIModelCommon:CreateWing(_type, wing_id)
|
|
if _type and wing_id then
|
|
if self.role_type == SceneBaseType.Pet then--巫女+翅膀
|
|
_type = SceneBaseType.FCloud
|
|
end
|
|
local abName, resName = GameResPath.GetModelClotheRes(_type, wing_id)
|
|
local function localWingCallback(objs, is_gameObject)
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if not objs or not objs[0] then
|
|
logWarn("cannot find wing res = "..self.wing_id)
|
|
return
|
|
end
|
|
local go = is_gameObject and objs[0] or newObject(objs[0])
|
|
go:SetActive(true)
|
|
local bone = FindBone(self.role.transform, AttachNode.Wing)
|
|
if bone == nil then
|
|
return
|
|
end
|
|
go.transform:SetParent(bone)
|
|
go.transform.localPosition = Vector3.zero
|
|
go.transform.localRotation = Quaternion.identity
|
|
go.transform.localScale = Vector3.one
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
-- 修改翅膀节点下的面片渲染的sortingOrder与带Canvas组件的父节点同级,保证不会被UI背景盖住
|
|
local shinned_meshRender_com_list = go:GetComponentsInChildren(typeof(UnityEngine.SkinnedMeshRenderer),true)
|
|
if shinned_meshRender_com_list.Length > 0 then
|
|
for i=1,shinned_meshRender_com_list.Length do
|
|
shinned_meshRender_com_list[i-1].sortingOrder = self:GetCurrLayerDepth(self.layer_name)
|
|
end
|
|
end
|
|
-- 修改翅膀节点下的渲染队列
|
|
self:SetUILayer(self.parent.transform)
|
|
end
|
|
local animator = go:GetComponent("Animator")
|
|
if not IsNull(animator) then
|
|
animator.cullingMode = UnityEngine.AnimatorCullingMode.AlwaysAnimate
|
|
animator:CrossFade( "idle",0, 0.0 )
|
|
end
|
|
|
|
--部件特效,参数为部件类型与id
|
|
self:CreateEffect(SceneBaseType.FWing, self.wing_id, go)
|
|
end
|
|
if self.role.transform and abName and resName then
|
|
LuaResManager:getInstance():loadPrefab(self,abName,resName, localWingCallback)
|
|
end
|
|
end
|
|
end
|
|
|
|
--创建活跃度形象
|
|
function UIModelCommon:CreateLivenessImage(_type, image_id)
|
|
if _type and image_id and image_id ~= 0 then
|
|
local prefixStr = image_id < 10 and "00" or "0"
|
|
local effect_name = "effect_huoyuedu_" .. prefixStr .. image_id
|
|
self.particle_mgr:AddUIModelEffect(effect_name,self,true,nil,7,nil,nil,nil,nil,nil,false)
|
|
end
|
|
end
|
|
|
|
--创建头发
|
|
function UIModelCommon:CreateHeadWear(_type, head_wear_id, head_clothe_id)
|
|
--self.head_wear_id = head_wear_id
|
|
--self.head_clothe_id = head_clothe_id
|
|
if _type and head_wear_id then
|
|
local abName, resName = GameResPath.GetHeadRes(_type, head_wear_id)
|
|
local function localHeadWearCallback(objs, is_gameObject)
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if not objs or not objs[0] then
|
|
logWarn("cannot find headwear res = "..head_wear_id)
|
|
return
|
|
end
|
|
if self.default_headWear_go and self.default_headWear_abName then
|
|
lua_resM:AddObjToPool(self, self.default_headWear_abName, self.default_headWear_abName, self.default_headWear_go)
|
|
self.default_headWear_go = nil
|
|
self.default_headWear_abName = nil
|
|
end
|
|
local go = is_gameObject and objs[0] or newObject(objs[0])
|
|
go:SetActive(true)
|
|
local bone = FindBone(self.role.transform, AttachNode.Head)
|
|
if bone == nil then
|
|
return
|
|
end
|
|
go.transform:SetParent(bone)
|
|
go.transform.localPosition = Vector3.zero
|
|
go.transform.localRotation = Quaternion.identity
|
|
go.transform.localScale = Vector3.one
|
|
--头发动作
|
|
local animator = go:GetComponent("Animator")
|
|
if IsNull(animator) then
|
|
return
|
|
end
|
|
-- if self.curr_body_action_name then
|
|
-- animator:CrossFade(self.curr_body_action_name, 0, 0.0)
|
|
-- end
|
|
self.head_wear_animator = animator
|
|
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(self.parent.transform)
|
|
end
|
|
self:CheckShadow(go, resName)
|
|
-- local mesh = go:GetComponentInChildren(typeof(UnityEngine.MeshRenderer))
|
|
-- if mesh and mesh.material then
|
|
-- if head_clothe_id and tonumber(head_clothe_id) ~= 0 then
|
|
-- if self.head_clothe then
|
|
-- self.head_clothe:DeleteMe()
|
|
-- self.head_clothe = nil
|
|
-- end
|
|
-- local texture_res = head_wear_id .. "_" .. head_clothe_id
|
|
-- self.head_clothe = Clothe.New(mesh.material, texture_res)
|
|
-- end
|
|
-- end
|
|
end
|
|
if self.role.transform and abName and resName then
|
|
if not resMgr:GetAssetBundle(abName) and self.career then--没有当前头发 需要异步加载 就先创建默认头饰
|
|
if self.default_headWear_go and self.default_headWear_abName then
|
|
--self:SetUILayer(self.default_headWear_go.transform, UIPartical.RenderingOther_List.DEFAULT)
|
|
lua_resM:AddObjToPool(self, self.default_headWear_abName, self.default_headWear_abName, self.default_headWear_go)
|
|
self.default_headWear_go = nil
|
|
self.default_headWear_abName = nil
|
|
end
|
|
local local_default_headWear_abName = ModelPartName[6] .. string.format("10%d000", self.career)
|
|
local local_default_headWear_go = lua_resM:GetObjFormPool(self, local_default_headWear_abName, local_default_headWear_abName)
|
|
if local_default_headWear_go then
|
|
local bone = FindBone(self.role.transform, AttachNode.Head)
|
|
if bone == nil then
|
|
return
|
|
end
|
|
|
|
local_default_headWear_go.transform:SetParent(bone)
|
|
local_default_headWear_go.transform.localPosition = Vector3.zero
|
|
local_default_headWear_go.transform.localRotation = Quaternion.identity
|
|
local_default_headWear_go.transform.localScale = Vector3.one
|
|
self.default_headWear_go = local_default_headWear_go
|
|
self.default_headWear_abName = local_default_headWear_abName
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(self.parent.transform)
|
|
end
|
|
end
|
|
|
|
self:CheckShadow(self.default_headWear_go, resName)
|
|
end
|
|
LuaResManager:getInstance():loadPrefab(self,abName,resName, localHeadWearCallback)
|
|
end
|
|
end
|
|
end
|
|
|
|
--创建真·头饰,上面的那个应该叫头发
|
|
function UIModelCommon:CreateHatWear(hat_wear_id)
|
|
if hat_wear_id then
|
|
local abName, resName = GameResPath.GetHatRes(hat_wear_id)
|
|
local function localHeadWearCallback(objs, is_gameObject)
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if not objs or not objs[0] then
|
|
logWarn("cannot find headwear res = "..hat_wear_id)
|
|
return
|
|
end
|
|
if self.default_hat_go and self.default_hat_abName then
|
|
lua_resM:AddObjToPool(self, self.default_hat_abName, self.default_hat_abName, self.default_hat_go)
|
|
self.default_hat_go = nil
|
|
self.default_hat_abName = nil
|
|
end
|
|
local go = is_gameObject and objs[0] or newObject(objs[0])
|
|
go:SetActive(true)
|
|
local bone = FindBone(self.role.transform, AttachNode.Head)
|
|
if bone == nil then
|
|
return
|
|
end
|
|
go.transform:SetParent(bone)
|
|
go.transform.localPosition = Vector3.zero
|
|
go.transform.localRotation = Quaternion.identity
|
|
go.transform.localScale = Vector3.one
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(self.parent.transform)
|
|
end
|
|
self:CheckShadow(go, resName)
|
|
-- local mesh = go:GetComponentInChildren(typeof(UnityEngine.MeshRenderer))
|
|
-- if mesh and mesh.material then
|
|
-- if head_clothe_id and tonumber(head_clothe_id) ~= 0 then
|
|
-- if self.head_clothe then
|
|
-- self.head_clothe:DeleteMe()
|
|
-- self.head_clothe = nil
|
|
-- end
|
|
-- local texture_res = hat_wear_id .. "_" .. head_clothe_id
|
|
-- self.head_clothe = Clothe.New(mesh.material, texture_res)
|
|
-- end
|
|
-- end
|
|
end
|
|
if self.role.transform and abName and resName then
|
|
if not resMgr:GetAssetBundle(abName) and self.career then--没有当前头发 需要异步加载 就先创建默认头饰
|
|
if self.default_hat_go and self.default_hat_abName then
|
|
--self:SetUILayer(self.default_hat_go.transform, UIPartical.RenderingOther_List.DEFAULT)
|
|
lua_resM:AddObjToPool(self, self.default_hat_abName, self.default_hat_abName, self.default_hat_go)
|
|
self.default_hat_go = nil
|
|
self.default_hat_abName = nil
|
|
end
|
|
local local_default_hat_abName = ModelPartName[6] .. string.format("10%d000", self.career)
|
|
local local_default_hat_go = lua_resM:GetObjFormPool(self, local_default_hat_abName, local_default_hat_abName)
|
|
if local_default_hat_go then
|
|
local bone = FindBone(self.role.transform, AttachNode.Head)
|
|
if bone == nil then
|
|
return
|
|
end
|
|
|
|
local_default_hat_go.transform:SetParent(bone)
|
|
local_default_hat_go.transform.localPosition = Vector3.zero
|
|
local_default_hat_go.transform.localRotation = Quaternion.identity
|
|
local_default_hat_go.transform.localScale = Vector3.one
|
|
self.default_hat_go = local_default_hat_go
|
|
self.default_hat_abName = local_default_hat_abName
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(self.parent.transform)
|
|
end
|
|
end
|
|
|
|
self:CheckShadow(self.default_hat_go, resName)
|
|
end
|
|
LuaResManager:getInstance():loadPrefab(self,abName,resName, localHeadWearCallback)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function UIModelCommon:CreateLightEffect( light_id, parent_go )
|
|
-- if self.deay_show_light then
|
|
-- GlobalTimerQuest:CancelQuest(self.deay_show_light)
|
|
-- self.deay_show_light = nil
|
|
-- end
|
|
-- local function delay( )
|
|
-- local show_type = (self.model_type == UIModelCommon.ModelType.BackModel) and "UIBackRole" or "UI"
|
|
-- self.light_effect_id = self.particle_mgr:AddTargetEffect(LightModel:GetInstance():GetLightResById(light_id), self.role, true, nil, nil, 7,nil,nil,nil,nil,show_type)
|
|
-- if self.light_effect_id then
|
|
-- self.particle_list[self.light_effect_id] = self.light_effect_id
|
|
-- end
|
|
-- end
|
|
-- self.deay_show_light = setTimeout(delay,0)
|
|
local effect_obj_type = nil
|
|
local effect_vo = {name = LightModel:GetInstance():GetLightResById(light_id)}
|
|
local bone = FindBone(parent_go and parent_go.transform or self.transform, "root")
|
|
if bone then
|
|
local function load_finish_func(objs, is_gameObject)
|
|
if not objs or not objs[0] then
|
|
return
|
|
end
|
|
if IsNull(bone) then
|
|
if is_gameObject then destroy(objs[0]) end
|
|
return
|
|
end
|
|
local go = is_gameObject and objs[0] or newObject(objs[0])
|
|
if not self.light_go then--没有就直接赋值
|
|
self.light_go = go
|
|
else--有就直接销毁原来的继续赋值新的
|
|
if self.light_go then
|
|
destroy(self.light_go)
|
|
end
|
|
self.light_go = go
|
|
end
|
|
go:SetActive(true)
|
|
if effect_vo.is_world_particle then
|
|
AttachGameRoot(go.transform)
|
|
else
|
|
go.transform:SetParent(bone)
|
|
end
|
|
SetLocalPosition(go.transform)
|
|
SetLocalRotation(go.transform)
|
|
SetLocalScale(go.transform, 1)
|
|
if effect_obj_type or (self.model_data and self.model_data.attach_game_root) then
|
|
self:SetUILayer(go.transform, UIPartical.RenderingOther_List.DEFAULT)
|
|
elseif ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(go.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(go.transform)
|
|
end
|
|
|
|
if not effect_obj_type then
|
|
local effect_sortingOrder = self:GetCurrLayerDepth(self.layer_name)
|
|
UIDepth.SetUIDepth(go,false,effect_sortingOrder)
|
|
end
|
|
end
|
|
lua_resM:loadPrefab(self, effect_vo.name, effect_vo.name, load_finish_func, false)
|
|
end
|
|
end
|
|
|
|
function UIModelCommon:CreateWarSoulEffect( warSoul_effect_res,warSoul_effect_pos,warSoul_effect_scale )
|
|
if self.deay_show_warSoul then
|
|
GlobalTimerQuest:CancelQuest(self.deay_show_warSoul)
|
|
self.deay_show_warSoul = nil
|
|
end
|
|
local function delay( )
|
|
local function load_callback( ... )
|
|
if warSoul_effect_scale then
|
|
self.particle_mgr:SetEffectScale(self.warSoul_effect_id, warSoul_effect_scale)
|
|
end
|
|
if warSoul_effect_pos then
|
|
self.particle_mgr:SetEffectLocalPos(self.warSoul_effect_id, warSoul_effect_pos.x,warSoul_effect_pos.y,warSoul_effect_pos.z)
|
|
end
|
|
local effect = self.particle_mgr:GetEffect(self.warSoul_effect_id)
|
|
local root_dummy_node = FindBone(self.role.transform, "Dummy001")
|
|
-- self.transform.localRotation = Quaternion.Euler(0, 0, 0)
|
|
if root_dummy_node and effect then
|
|
effect.transform:SetParent(root_dummy_node)
|
|
-- effect.localPosition = warSoul_effect_pos or Vector3.zero
|
|
effect.transform.localRotation = Quaternion.Euler(0, 180, 0)
|
|
-- effect.localScale = Vector3.one
|
|
end
|
|
end
|
|
self.warSoul_effect_id = self.particle_mgr:AddTargetEffect(warSoul_effect_res, self.role, true, nil, nil, 7, nil,nil,nil,nil,"UI" or self.layer_name,load_callback,nil,nil,nil,nil,warSoul_effect_pos)
|
|
if self.particle_list and self.warSoul_effect_id then
|
|
self.particle_list[self.warSoul_effect_id] = self.warSoul_effect_id
|
|
end
|
|
end
|
|
self.deay_show_warSoul = setTimeout(delay,0.01)
|
|
end
|
|
|
|
|
|
--创建足迹
|
|
function UIModelCommon:CreateFootmark(footmark_id)
|
|
|
|
end
|
|
|
|
function UIModelCommon:PlaySkillEffect(attacker, skill_id, next_anim, custom_end_callback)
|
|
if attacker and skill_id and SkillManager and SkillManager.Instance then
|
|
|
|
--正在播放技能中
|
|
if self.duration_timer then return end
|
|
|
|
local movie_cfg = SkillManager.Instance:GetFightSkillMovie(skill_id)
|
|
if movie_cfg then
|
|
if movie_cfg.anim then
|
|
if self.skill_preview_callback then
|
|
self.skill_preview_callback(1)
|
|
end
|
|
local action_name = {[1] = movie_cfg.anim,}
|
|
self:PlayActions(action_name)
|
|
|
|
local duration_time = movie_cfg.back_swing and movie_cfg.back_swing or 2
|
|
|
|
self:StopSkillPreViewTimer()
|
|
|
|
local function PlaySkillEffectEnd()
|
|
if self.skill_preview_callback then
|
|
self:PlayActions({[1] = "idle",})
|
|
self.skill_preview_callback(2)
|
|
elseif next_anim then
|
|
self:PlayActions({[1] = next_anim,})
|
|
end
|
|
if custom_end_callback then
|
|
custom_end_callback()
|
|
end
|
|
self:StopSkillPreViewTimer()
|
|
end
|
|
self.duration_timer = GlobalTimerQuest:AddDelayQuest(PlaySkillEffectEnd,duration_time)
|
|
end
|
|
|
|
if movie_cfg.particles then
|
|
for i = 1, #movie_cfg.particles do
|
|
local cfg = movie_cfg.particles[i]
|
|
local res = cfg.res
|
|
local x, y = attacker.transform.position.x, attacker.transform.position.y
|
|
local dir = GameMath.AngleToDirection(270 - self.rotate)
|
|
local scale = cfg.scale
|
|
|
|
local attach_type = cfg.attach_type
|
|
local play_time = cfg.play_time
|
|
if cfg.custom_angle then
|
|
dir = GameMath.AngleToDirection(cfg.custom_angle)
|
|
end
|
|
local pos_type = cfg.pos_type
|
|
--所有特效都是特定播放轨迹,所以这里简单的都从人物跟节点发出
|
|
pos_type = 0
|
|
self.particle_mgr:AddUIModelEffect( res, self, false, play_time, attach_type,dir, nil,nil,nil,nil,nil,false)
|
|
|
|
|
|
-- --播放特效方法1
|
|
-- self.particle_mgr:AddUIModelEffect(res,self,true,nil,attach_type,nil,nil,nil,nil,nil,false)
|
|
|
|
--播放后特效方法2
|
|
-- local particle_id = nil
|
|
-- if pos_type == 2 or pos_type == 6 then --在攻击者坐标上
|
|
-- if cfg.offset_dist and cfg.offset_dist ~= 0 and dir then
|
|
-- co.NormaliseXYTable(dir)
|
|
-- local dist = GameMath.ChangeEllipseValue(dir, cfg.offset_dist)
|
|
-- x = x + dir.x * dist
|
|
-- y = y + dir.y * dist
|
|
-- end
|
|
-- particle_id = self.particle_mgr:AddPosEffect( res, co.TableXY(x, y), (play_time ~= 0), play_time, dir ,nil, nil, nil, nil, nil, max_depth)
|
|
-- elseif pos_type == 7 then --特效沿攻击方向移动
|
|
-- local move_speed = cfg.move_speed or 100
|
|
-- local move_dist = cfg.move_dist or 300
|
|
-- particle_id = self.particle_mgr:AddPosEffect( res, co.TableXY(x, y), true, 0 , dir, nil, nil, move_speed, move_dist, nil, max_depth)
|
|
-- else
|
|
-- particle_id = self.particle_mgr:AddTargetEffect(res, attacker, (play_time ~= 0), play_time, dir, attach_type, nil, nil, nil, max_depth)
|
|
-- end
|
|
-- if particle_id then
|
|
-- if cfg.scale then
|
|
-- self.particle_mgr:SetEffectScale(particle_id, cfg.scale)
|
|
-- end
|
|
-- self.particle_list[particle_id] = true
|
|
-- end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function UIModelCommon:CreateEffect(obj_type, id, parent_go, action_name, effect_obj_type)
|
|
if effect_obj_type then
|
|
obj_type = effect_obj_type
|
|
end
|
|
if obj_type == SceneBaseType.Role or obj_type == SceneBaseType.MapModel then
|
|
return
|
|
end
|
|
-- RT加载怪物模型时不加载一切特效
|
|
if obj_type == SceneBaseType.Monster and self.model_type == UIModelCommon.ModelType.RT then
|
|
return
|
|
end
|
|
|
|
self.cache_effect_list = self.cache_effect_list or {}
|
|
local cache_effect_type = action_name and obj_type .. "_action" or obj_type
|
|
if self.cache_effect_list[cache_effect_type] then
|
|
for k,v in pairs(self.cache_effect_list[cache_effect_type]) do
|
|
destroy(v.go)
|
|
end
|
|
end
|
|
self.cache_effect_list[cache_effect_type] = {}
|
|
|
|
local parent_go = parent_go or self.transform
|
|
--武器要区分职业
|
|
-- if obj_type and obj_type == SceneBaseType.FWeapon then
|
|
-- print('=======Msh:UIModelCommon.lua[851] =======', id, action_name)
|
|
-- PrintCallStack()
|
|
-- end
|
|
if obj_type and obj_type == SceneBaseType.FWeapon and id and tonumber(id) < 1000 then
|
|
local career = self.career
|
|
if not career and RoleManager.Instance and RoleManager.Instance.mainRoleInfo then
|
|
career = RoleManager.Instance.mainRoleInfo.career
|
|
end
|
|
career = career or 1
|
|
id = tonumber(id) + career*1000
|
|
end
|
|
|
|
local temp_cfg = Config.SceneObjectParticle[obj_type] and Config.SceneObjectParticle[obj_type][id]
|
|
if action_name and action_name ~= "" then
|
|
--动作特效
|
|
temp_cfg = temp_cfg and temp_cfg.action_effect_list
|
|
temp_cfg = temp_cfg and temp_cfg[action_name]
|
|
-- self.last_action_effect_list = self.last_action_effect_list or {}
|
|
else
|
|
--模型特效
|
|
temp_cfg = temp_cfg and temp_cfg.body_effect_list
|
|
local temp_id = obj_type.."_"..id
|
|
if self.last_effect_id and self.last_effect_id == temp_id then
|
|
return
|
|
end
|
|
self.last_effect_id = temp_id
|
|
end
|
|
|
|
if not temp_cfg then
|
|
return
|
|
end
|
|
|
|
|
|
local function on_load_res( bone_name, effect_vo )
|
|
if not parent_go then
|
|
return
|
|
end
|
|
local bone = FindBone(parent_go and parent_go.transform or self.transform, bone_name)
|
|
if bone or effect_vo.is_world_particle then
|
|
local function load_finish_func(objs, is_gameObject)
|
|
if not objs or not objs[0] then
|
|
return
|
|
end
|
|
if IsNull(bone) then
|
|
if is_gameObject then destroy(objs[0]) end
|
|
return
|
|
end
|
|
local go = is_gameObject and objs[0] or newObject(objs[0])
|
|
table.insert(self.cache_effect_list[cache_effect_type], {go = go})
|
|
if effect_vo.is_world_particle then
|
|
AttachGameRoot(go.transform)
|
|
else
|
|
go.transform:SetParent(bone)
|
|
end
|
|
SetLocalPosition(go.transform)
|
|
SetLocalRotation(go.transform)
|
|
SetLocalScale(go.transform, 1)
|
|
if effect_obj_type or (self.model_data and self.model_data.attach_game_root) then
|
|
self:SetUILayer(go.transform, UIPartical.RenderingOther_List.DEFAULT)
|
|
elseif ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(go.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(go.transform)
|
|
end
|
|
|
|
if not effect_obj_type then
|
|
local effect_sortingOrder = self:GetCurrLayerDepth(self.layer_name)
|
|
UIDepth.SetUIDepth(go,false,effect_sortingOrder)
|
|
end
|
|
end
|
|
lua_resM:loadPrefab(self, effect_vo.name, effect_vo.name, load_finish_func, false)
|
|
end
|
|
end
|
|
|
|
for key, effect_vo in pairs(temp_cfg) do
|
|
local bone_name = effect_vo.bone
|
|
if obj_type and obj_type == SceneBaseType.FWeapon then
|
|
for k,v in pairs(self.weapon_container) do
|
|
parent_go = v.go
|
|
on_load_res(bone_name, effect_vo)
|
|
end
|
|
else
|
|
on_load_res(bone_name, effect_vo)
|
|
end
|
|
end
|
|
end
|
|
|
|
--主动添加挂在自己身上的例子特效
|
|
function UIModelCommon:AddParticle(id,particle_tranform,attach_type,is_weapon,effect_pos)
|
|
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
|
|
if is_weapon then
|
|
if self.weapon then
|
|
local effect_root = self.weapon.transform:Find("Bone_wq")
|
|
if effect_root then
|
|
particle_tranform.parent = effect_root
|
|
particle_tranform.localPosition = effect_pos or Vector3.zero
|
|
particle_tranform.localRotation = Quaternion.Euler(0, 0, 0)
|
|
particle_tranform.localScale = Vector3.one
|
|
self.particle_list[id] = particle_tranform
|
|
local effect = self.particle_mgr:GetEffect(id)
|
|
if effect then
|
|
effect:SetSpeed(self.particle_speed)
|
|
end
|
|
end
|
|
end
|
|
else
|
|
local bone_name = ParticleAttachNode[attach_type]
|
|
local transform = self.role
|
|
|
|
if bone_name and transform then
|
|
local bone = nil
|
|
if bone_name == AttachNode.SceneObj then
|
|
bone = transform
|
|
else
|
|
bone = FindBone(self.role.transform,bone_name)
|
|
end
|
|
|
|
if bone == nil then
|
|
logWarn("AddParticle ".. transform.name .." cannot find bone " .. bone_name)
|
|
return
|
|
end
|
|
particle_tranform.parent = bone.transform
|
|
particle_tranform.localPosition = effect_pos or Vector3.zero
|
|
if bone_name == AttachNode.SceneObj then
|
|
particle_tranform.localRotation = Quaternion.Euler(self.rotateX, 0, 0)
|
|
else
|
|
particle_tranform.localRotation = Quaternion.Euler(0, 0, 0)
|
|
end
|
|
particle_tranform.localScale = Vector3.one
|
|
self.particle_list[id] = particle_tranform
|
|
local effect = self.particle_mgr:GetEffect(id)
|
|
if effect then
|
|
effect:SetSpeed(self.particle_speed)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--删除挂在伙伴身上的特效
|
|
--is_acive = false 被动删除挂在自己身上的粒子特效 由特效播放完来调用
|
|
--is_acive = true 主动删除挂在自己身上的特效 会通知particlemanager去删除 默认false
|
|
function UIModelCommon:RemoveParticle(id,is_acive)
|
|
self.particle_list[id] = nil
|
|
if is_acive then
|
|
self.particle_mgr:DelEffect(id)
|
|
end
|
|
end
|
|
|
|
function UIModelCommon:CheckShadow(go, name)
|
|
--先不处理
|
|
if true then
|
|
return
|
|
end
|
|
if not go or not self.show_shadow then
|
|
return
|
|
end
|
|
local scene_info =
|
|
{
|
|
shadow_angle = 60,
|
|
shadow_alpha = 0.7,
|
|
shadow_len = 7,
|
|
}
|
|
local scale = scene_info.shadow_len / 7
|
|
local light_x = math.cos(scene_info.shadow_angle * math.pi / 180) * scale
|
|
local light_z = (math.sin(scene_info.shadow_angle * math.pi / 180)) * scale
|
|
local shadow2_mat_light_vector4 = self.model_data.shadow2_light_pos or Vector4(light_x, -1, light_z, 0)
|
|
--local shadow2_mat_plane_vector4 = Vector4(0, 1, 0, 0.5)
|
|
local shadow2_mat_plane_vector4 = self.model_data.shadow2_plane_pos or Vector4(0, 1, 0, 0.5)
|
|
local render = go:GetComponentInChildren(typeof(UnityEngine.SkinnedMeshRenderer)) or go:GetComponentInChildren(typeof(UnityEngine.MeshRenderer))
|
|
if render then
|
|
local mats = render.sharedMaterials
|
|
local lua_mats = {}
|
|
local shadow_index = nil
|
|
local mats_len = mats.Length
|
|
local need_create_shadow = true
|
|
local change = false
|
|
|
|
for i = 0, mats_len - 1 do
|
|
lua_mats[i + 1] = mats[i]
|
|
if IsNull(mats[i]) then
|
|
shadow_index = i + 1
|
|
elseif string.find(mats[i].name, "shadow2", 1, true) then
|
|
mats[i]:SetVector("_LightDir", shadow2_mat_light_vector4)
|
|
mats[i]:SetFloat("_ShadowAlpha", scene_info.shadow_alpha)
|
|
mats[i]:SetVector("_Plane", shadow2_mat_plane_vector4)
|
|
-- self.shadow_timer_list[name] = {shadow2_mat_plane_vector4 = shadow2_mat_plane_vector4,material = mats[i]}
|
|
need_create_shadow = false
|
|
elseif mats[i].shader.name == "Unlit/Texture" or string.find(mats[i].shader.name, "XRay", 1, true) then
|
|
mats[i].shader = ShaderTools.GetShader("Unlit-Texture-NoFog")
|
|
change = true
|
|
end
|
|
end
|
|
|
|
if not shadow_index then
|
|
shadow_index = mats_len + 1
|
|
end
|
|
if not lua_mats[shadow_index] and need_create_shadow then
|
|
local shadow2_mat = Material.New(ShaderTools.shadow2)
|
|
shadow2_mat:SetVector("_LightDir", shadow2_mat_light_vector4)
|
|
shadow2_mat:SetFloat("_ShadowAlpha", scene_info.shadow_alpha)
|
|
shadow2_mat:SetVector("_Plane", shadow2_mat_plane_vector4)
|
|
-- self.shadow_timer_list[name] = {shadow2_mat_plane_vector4 = shadow2_mat_plane_vector4,material = shadow2_mat}
|
|
lua_mats[shadow_index] = shadow2_mat
|
|
change = true
|
|
end
|
|
|
|
if change then
|
|
render.materials = lua_mats
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
--主动删除挂在伙伴身上的特效
|
|
function UIModelCommon:RemoveAllParticle()
|
|
for id,_ in pairs(self.particle_list) do
|
|
self.particle_mgr:DelEffect(id)
|
|
end
|
|
self.particle_list = {}
|
|
end
|
|
|
|
function UIModelCommon:GetCacheBones(transform, bone_name)
|
|
self.cache_bones = self.cache_bones or {}
|
|
local temp_bone = self.cache_bones[bone_name]
|
|
if temp_bone and not IsNull(temp_bone) then
|
|
return temp_bone
|
|
end
|
|
|
|
local transform = transform or self.transform
|
|
temp_bone = FindBone(transform, bone_name)
|
|
self.cache_bones[bone_name] = temp_bone
|
|
return temp_bone
|
|
end
|
|
|
|
function UIModelCommon:StopSkillPreViewTimer()
|
|
if self.duration_timer then
|
|
GlobalTimerQuest:CancelQuest(self.duration_timer)
|
|
self.duration_timer = nil
|
|
end
|
|
end
|
|
|
|
function UIModelCommon:GetRolePositionOffset()
|
|
local pos = Vector3(0, 0, 0)
|
|
if self.role_position_offset and (self.type == SceneBaseType.Role or self.type == SceneBaseType.MainRole) and self.clothe_res_id then
|
|
local career = 0
|
|
career = math.floor(self.clothe_res_id / 1000 )
|
|
if career and UIModelClassByRT.Role_Position_Offset[career] then
|
|
pos = UIModelClassByRT.Role_Position_Offset[career]
|
|
end
|
|
end
|
|
return pos
|
|
end
|
|
|
|
function UIModelCommon:ChangeModelLocalPosition(x, y, z)
|
|
if not self.role then return end
|
|
local offset = self:GetRolePositionOffset()
|
|
x = x or (self.role.transform.localPosition.x - offset.x)
|
|
y = y or (self.role.transform.localPosition.y - offset.y)
|
|
z = z or (self.role.transform.localPosition.z - offset.z)
|
|
self.role.transform.localPosition = Vector3(x, y, z) + offset
|
|
end
|
|
|
|
function UIModelCommon:GetModelDefaultLocalPosition( )
|
|
return self.default_position
|
|
end
|
|
|
|
|
|
function UIModelCommon:SetData(parent,model_data)
|
|
|
|
end
|
|
|
|
function UIModelCommon:LoadRole(model_data, role_con)
|
|
self.role_con = role_con
|
|
self.model_data = model_data
|
|
self.career = model_data.career
|
|
self.clothe_res_id = model_data.clothe_res_id
|
|
self.weapon_res_id = model_data.weapon_res_id
|
|
self.weapon_clothe_id = model_data.weapon_clothe_id
|
|
self.type = model_data.role_type or model_data.type or nil
|
|
self.size = model_data.size or Vector2(600,360)
|
|
model_data.action_name_list = model_data.action_name_list or {"show"}
|
|
self.action_name_list = model_data.action_name_list
|
|
self.replay_action_name = self.action_name_list[#self.action_name_list] or "show"
|
|
self.can_rotate = model_data.can_rotate == nil or model_data.can_rotate == true
|
|
self.scale = model_data.scale
|
|
self.position = model_data.position
|
|
self.fashion_model_id = model_data.fashion_model_id
|
|
self.texture_id = model_data.texture_id
|
|
self.action_delta = model_data.action_delta
|
|
self.renderSize = model_data.renderSize
|
|
self.partner_id = model_data.partner_id
|
|
self.skill_id = model_data.skill_id
|
|
self.lCallBack = model_data.lCallBack
|
|
self.wing_id = model_data.wing_id
|
|
self.image_id = model_data.image_id
|
|
self.head_wear_id = model_data.head_wear_id
|
|
self.head_clothe_id = model_data.head_clothe_id
|
|
self.footmark_id = model_data.footmark_id
|
|
self.light_id = model_data.light_id
|
|
self.warSoul_effect_res = model_data.warSoul_effect_res
|
|
self.warSoul_effect_pos = model_data.warSoul_effect_pos
|
|
self.warSoul_effect_scale = model_data.warSoul_effect_scale
|
|
|
|
self.use_bloom = model_data.use_bloom
|
|
self.free_param = model_data.free_param
|
|
self.pearl_vo = model_data.pearl_vo
|
|
self.pearl_pos = model_data.pearl_pos
|
|
self.rotate = model_data.rotate or 0
|
|
if self.type == SceneBaseType.Include_Horse then--self.free_param为契兽id
|
|
self.weapon_res_id = nil--坐骑上不要武器
|
|
end
|
|
if model_data.load_dance_pose then -- 如果是加载跳舞的模型,需要屏蔽武器
|
|
self.weapon_res_id = nil
|
|
end
|
|
-- self.bloom_camera = self.gameObject.transform:Find("Camera/BloomClipCamera"):GetComponent("Camera")
|
|
self.skill_preview = model_data.skill_preview
|
|
self.skill_preview_callback = model_data.skill_preview_callback
|
|
self.camera_args = model_data.camera_args
|
|
self.using_material = model_data.using_material --or "render_texture"
|
|
self.using_sprite_bg = model_data.using_sprite_bg
|
|
self.role_position_offset = model_data.role_position_offset
|
|
self.layer_name = model_data.layer_name or "UI"
|
|
|
|
self.talisman_id = model_data.talisman_id
|
|
self.show_reflection = model_data.show_reflection
|
|
self.reflect_pos = model_data.reflect_pos
|
|
self.show_root = model_data.show_root == nil and true or model_data.show_root
|
|
self.hat_wear_id = model_data.hat_wear_id
|
|
self.dynamic_bone = model_data.dynamic_bone
|
|
self.use_light_data = model_data.use_light_data
|
|
self.psionic_effect = model_data.psionic_effect -- 圣物光环特效
|
|
self.pokemon_diamond_effect = model_data.pokemon_diamond_effect --宠物宝石光环特效
|
|
self.show_baby_attack_effect = model_data.show_baby_attack_effect -- 宝宝攻击特效
|
|
self.show_jarvis_all_figure_data = model_data.show_jarvis_all_figure_data -- ai娘模型展示包括翅膀磁炮幻甲全套装备,如有需要使用请参考排行榜传参
|
|
self.effect_obj_type = model_data.effect_obj_type --特效主体类型
|
|
self.role_action_sound = model_data.role_action_sound
|
|
self.need_play_skill_effect = 101091 or model_data.need_play_skill_effect
|
|
self.do_not_main_role_cloth_res_change = model_data.do_not_main_role_cloth_res_change--时装更改广播之后,不要刷新uimodelcommon的改变
|
|
|
|
local anName,resName = GameResPath.GetModelClotheRes(self.type, self.clothe_res_id, self.dynamic_bone)
|
|
if self.fashion_model_id then --时装
|
|
anName,resName = GameResPath.GetModelClotheRes(self.type, self.fashion_model_id, self.dynamic_bone)
|
|
elseif self.type == SceneBaseType.Baby_Include_Horse then -- 宝宝骑载具
|
|
anName,resName = GameResPath.GetModelClotheRes(SceneBaseType.Baby, self.clothe_res_id, self.dynamic_bone)
|
|
end
|
|
local function loadRoleCallback(objs, is_gameObject)
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if not objs or not objs[0] then
|
|
return
|
|
end
|
|
|
|
self:RemoveAllParticle()
|
|
|
|
if self.role then
|
|
destroy(self.role)
|
|
end
|
|
self.role = is_gameObject and objs[0] or newObject(objs[0])
|
|
|
|
local animator = self.role:GetComponent("Animator")
|
|
if not IsNull(animator) then
|
|
local custom_speed = Config.ConfigModelSpeed.ModelActionSpeed[tonumber(self.clothe_res_id)]
|
|
if custom_speed then
|
|
if animator then
|
|
animator.speed = custom_speed
|
|
end
|
|
end
|
|
if self.type == SceneBaseType.Role or self.type == SceneBaseType.MainRole then
|
|
if animator then
|
|
self.custom_speed = Config.ConfigModelSpeed.MainRoleActionSpeed.Idle
|
|
animator.speed = self.custom_speed
|
|
end
|
|
end
|
|
animator.cullingMode = UnityEngine.AnimatorCullingMode.AlwaysAnimate
|
|
end
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.Model or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self.role.transform:SetParent(self.parent.transform)
|
|
else
|
|
self.role.transform:SetParent(role_con)
|
|
end
|
|
self.role.transform.localRotation = self.model_data.model_rotation and Quaternion.Euler(self.model_data.model_rotation) or Quaternion.identity
|
|
self.transform = self.role.transform
|
|
self.role.gameObject:SetActive(self.show_root)
|
|
if self.type == SceneBaseType.Include_Horse or --self.free_param为契兽id
|
|
self.type == SceneBaseType.Baby_Include_Horse then -- 普通载具或宝宝载具
|
|
local horse_abName,horse_resName
|
|
if self.type == SceneBaseType.Baby_Include_Horse then -- 宝宝载具
|
|
horse_abName,horse_resName = GameResPath.GetModelClotheRes(SceneBaseType.Baby_Horse, self.free_param)
|
|
elseif self.type == SceneBaseType.Include_Horse then -- 普通载具
|
|
horse_abName,horse_resName = GameResPath.GetModelClotheRes(SceneBaseType.Horse, self.free_param)
|
|
end
|
|
local function loadHorseCallback(objs, is_gameObject)
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if not objs or not objs[0] then
|
|
return
|
|
end
|
|
if self.horse_gameObject then
|
|
destroy(self.horse_gameObject)
|
|
end
|
|
self.horse_gameObject = is_gameObject and objs[0] or newObject(objs[0])
|
|
self.horse_transform = self.horse_gameObject.transform
|
|
self.horse_gameObject:GetComponent("Animator").cullingMode = UnityEngine.AnimatorCullingMode.AlwaysAnimate
|
|
self.horse_transform.localScale = Vector3.one
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.Model or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self.horse_transform:SetParent(self.parent.transform)
|
|
else
|
|
self.horse_transform:SetParent(role_con)
|
|
end
|
|
self.horse_transform.localPosition = Vector3.zero
|
|
if self.position then
|
|
self.horse_transform.localPosition = Vector3(self.position.x, self.position.y,self.position.z)
|
|
else
|
|
self.horse_transform.localPosition = Vector3.zero
|
|
end
|
|
|
|
if self.scale then
|
|
self.horse_transform.localScale = Vector3(self.scale*50,self.scale*50,self.scale*50)
|
|
else
|
|
self.horse_transform.localScale = Vector3.one
|
|
end
|
|
|
|
if self.transform then
|
|
local bone = FindBone(self.horse_transform, AttachNode.Ride)
|
|
if bone == nil then
|
|
return
|
|
end
|
|
self.transform:SetParent(bone)
|
|
self.transform.localPosition = Vector3.zero
|
|
self.transform.localScale = Vector3.one
|
|
self.transform.localRotation = Quaternion.Euler(Vector3.zero)
|
|
end
|
|
|
|
local rotate_type = type(self.rotate)
|
|
if rotate_type == "number" then
|
|
self.horse_transform:Rotate(Vector3(0, 270 + (self.rotate), 0))
|
|
elseif rotate_type == "table" then
|
|
self.horse_transform:Rotate(self.rotate)
|
|
else
|
|
self.horse_transform:Rotate(Vector3(0, self.rotate, 0))
|
|
end
|
|
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(self.parent.transform)
|
|
end
|
|
--部件特效,参数为部件类型与id
|
|
if self.type ~= SceneBaseType.Baby_Include_Horse then
|
|
self:CreateEffect(SceneBaseType.Horse, self.free_param, self.horse_gameObject)
|
|
self:SetParticleDepth(self.horse_gameObject)
|
|
end
|
|
|
|
local horse_animator = self.horse_gameObject:GetComponent("Animator")
|
|
self.horse_animator = horse_animator
|
|
if self.horse_action_name then
|
|
self.horse_animator:CrossFade(self.horse_action_name, 0, 0, 0)
|
|
end
|
|
|
|
--有坐骑的,加载完坐骑,才执行回调
|
|
if self.lCallBack then self.lCallBack(self) end
|
|
end
|
|
LuaResManager:getInstance():loadPrefab(self,horse_abName,horse_resName, loadHorseCallback)
|
|
end
|
|
|
|
if self.model_data.attach_game_root then
|
|
AttachGameRoot(self.role.transform)
|
|
end
|
|
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
if self.type == SceneBaseType.Include_Horse or
|
|
self.type == SceneBaseType.Baby_Include_Horse then
|
|
self.role.transform.localPosition = Vector3.zero
|
|
else
|
|
self.role.transform.localPosition = self.position or Vector3(0,75,-300)
|
|
end
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
if self.type == SceneBaseType.Include_Horse or
|
|
self.type == SceneBaseType.Baby_Include_Horse then
|
|
self.role.transform.localPosition = Vector3.zero
|
|
else
|
|
if self.position then
|
|
self.role.transform.localPosition = self.position
|
|
else
|
|
self.role.transform.localPosition = Vector3.zero
|
|
end
|
|
end
|
|
else
|
|
if self.type == SceneBaseType.Include_Horse or
|
|
self.type == SceneBaseType.Baby_Include_Horse then
|
|
self.role.transform.localPosition = Vector3.zero
|
|
else
|
|
if self.position and not self.show_shadow then
|
|
self.role.transform.localPosition = self.position + self:GetRolePositionOffset()
|
|
else
|
|
if self.show_shadow then
|
|
self.role.transform.localPosition = Vector3(0, 119, 0) + self:GetRolePositionOffset()
|
|
else
|
|
self.role.transform.localPosition = Vector3.zero + self:GetRolePositionOffset()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(self.parent.transform)
|
|
-- if self.type == SceneBaseType.Equip or self.type == SceneBaseType.FWing or self.type == SceneBaseType.MainRole then
|
|
local shinned_meshRender_com_list = self.role:GetComponentsInChildren(typeof(UnityEngine.SkinnedMeshRenderer),true)
|
|
if shinned_meshRender_com_list.Length > 0 then
|
|
for i=1,shinned_meshRender_com_list.Length do
|
|
shinned_meshRender_com_list[i-1].sortingOrder = self:GetCurrLayerDepth(self.layer_name)
|
|
-- shinned_meshRender_com_list[i-1].sortingOrder = self:GetCurrLayerDepth(self.layer_name)+1
|
|
end
|
|
end
|
|
-- end
|
|
end
|
|
|
|
-- 保存一次默认坐标
|
|
self.default_position = self.default_position or self.role.transform.localPosition
|
|
if self.scale then
|
|
if self.type == SceneBaseType.Include_Horse or
|
|
self.type == SceneBaseType.Baby_Include_Horse then
|
|
--如果是坐骑模式,这里不要重新设置角色的scale,否则会导致大人开小车或小人开大车的情况
|
|
else
|
|
self.role.transform.localScale = Vector3(self.scale,self.scale,self.scale)
|
|
end
|
|
else
|
|
self.role.transform.localScale = Vector3(100,100,100)
|
|
end
|
|
if self.type == SceneBaseType.Include_Horse or
|
|
self.type == SceneBaseType.Baby_Include_Horse then
|
|
--如果是坐骑模式,也没必要再设置rotate了
|
|
else
|
|
local rotate_type = type(self.rotate)
|
|
if rotate_type == "number" then
|
|
local rotate_x = 0
|
|
if self.model_type == UIModelCommon.ModelType.Model and self.rotate == 0 then
|
|
rotate_x = 10
|
|
end
|
|
self.role.transform:Rotate(Vector3(rotate_x, 180 + (self.rotate), 0))
|
|
self.rotate = self.rotate or self.rotate
|
|
elseif rotate_type == "table" then
|
|
self.role.transform:Rotate(self.rotate)
|
|
self.rotate = self.rotate.y or self.rotate.y
|
|
else
|
|
self.role.transform:Rotate(Vector3(0, 180, 0))
|
|
self.rotate = self.rotate or 0
|
|
end
|
|
end
|
|
|
|
--主体模型特效,参数为主体的类型与id
|
|
self:CreateEffect(self.type, self.clothe_res_id, nil, nil, self.effect_obj_type)
|
|
|
|
local real_model = self.role.gameObject.transform:Find(resName)
|
|
if real_model then
|
|
self:CheckShadow(real_model, resName)
|
|
end
|
|
|
|
local action_delta = model_data.action_delta
|
|
local action_name_list = model_data.action_name_list
|
|
if not IsTableEmpty(action_name_list) then
|
|
local action_name = action_delta and action_name_list[1] or table.remove(action_name_list, 1)
|
|
if action_name then
|
|
local animator = self.role:GetComponent("Animator")
|
|
if IsNull(animator) then
|
|
return
|
|
end
|
|
--用来判断是否是骑着马的
|
|
if self.type == SceneBaseType.Include_Horse then
|
|
local ride_action_cfg = Config.otherFightInfo.on_horse_action[self.free_param] or Config.otherFightInfo.on_horse_action[0]
|
|
self.horse_action_name = action_name
|
|
if self.horse_animator then
|
|
self.horse_animator:CrossFade(action_name, 0, 0, 0)
|
|
end
|
|
if action_name == "idle" or action_name == "casual" or action_name == "hited" or action_name == "show" then
|
|
if ride_action_cfg then
|
|
self.curr_body_action_name = ride_action_cfg.idle_action
|
|
else
|
|
self.curr_body_action_name = "ride"
|
|
end
|
|
elseif action_name == "run" or action_name == "fly" then
|
|
if ride_action_cfg then
|
|
self.curr_body_action_name = ride_action_cfg.run_action
|
|
else
|
|
self.curr_body_action_name = "riderun"
|
|
end
|
|
end
|
|
elseif self.type == SceneBaseType.Baby_Include_Horse then -- 宝宝坐骑
|
|
local ride_action_cfg = Config.otherFightInfo.on_baby_horse_action[self.free_param] or Config.otherFightInfo.on_baby_horse_action[0]
|
|
self.horse_action_name = action_name
|
|
if self.horse_animator then
|
|
self.horse_animator:CrossFade(action_name, 0, 0, 0)
|
|
end
|
|
if action_name == "idle" or action_name == "casual" or action_name == "hited" or action_name == "show" then
|
|
if ride_action_cfg then
|
|
self.curr_body_action_name = ride_action_cfg.idle_action
|
|
else
|
|
self.curr_body_action_name = "ride"
|
|
end
|
|
elseif action_name == "run" or action_name == "fly" then
|
|
if ride_action_cfg then
|
|
self.curr_body_action_name = ride_action_cfg.run_action
|
|
else
|
|
self.curr_body_action_name = "ride"
|
|
end
|
|
end
|
|
else
|
|
self.curr_body_action_name = action_name
|
|
end
|
|
--动作音效
|
|
if self.role_action_sound then
|
|
lua_soundM:PlayEffect(self, self.role_action_sound, false, LuaSoundManager.SOUND_TYPE.ROLE, 1)
|
|
end
|
|
--动作
|
|
animator:CrossFade(self.curr_body_action_name,0, 0.0 )
|
|
--动作特效
|
|
self:CreateEffect(self.type, self.clothe_res_id, self.role, self.curr_body_action_name)
|
|
if not IsTableEmpty(action_name_list) then
|
|
self.delay_play_action_timer_list = self.delay_play_action_timer_list or {}
|
|
if action_delta then
|
|
self:DelayPlayNextActionLoop(animator, action_name_list, action_delta)
|
|
else
|
|
self:DelayPlayNextAction(animator, action_name_list, model_data.delay_action_delta)
|
|
end
|
|
end
|
|
end
|
|
else
|
|
end
|
|
if self.weapon_res_id and self.weapon_res_id ~= 0 then
|
|
self:CreateWeapon(self.type, self.weapon_res_id, self.career, self.weapon_clothe_id)
|
|
self:CreateClothTexture(self.fashion_model_id, self.texture_id)
|
|
end
|
|
|
|
if self.pearl_vo then
|
|
self:CreatePearls(self.pearl_vo)
|
|
end
|
|
|
|
if self.wing_id then
|
|
self:CreateWing(SceneBaseType.FWing, self.wing_id)
|
|
end
|
|
if self.image_id then
|
|
self:CreateLivenessImage(self.type,self.image_id)
|
|
end
|
|
|
|
if self.head_wear_id then
|
|
self:CreateHeadWear(self.type, self.head_wear_id, self.head_clothe_id)
|
|
end
|
|
|
|
if self.hat_wear_id then
|
|
self:CreateHatWear(self.hat_wear_id)
|
|
end
|
|
|
|
if self.footmark_id then
|
|
self:CreateFootmark(self.footmark_id)
|
|
end
|
|
--针对怪物跟伙伴的贴图设置材质图片
|
|
if self.texture_id and (self.type == SceneBaseType.Partner or self.type == SceneBaseType.Monster or self.type == SceneBaseType.Npc or SceneBaseType.Horse) then
|
|
self:CreateClothTexture(self.clothe_res_id, self.texture_id)
|
|
end
|
|
|
|
if self.light_id and self.light_id > 0 then
|
|
--挂人物身上的幻光在这里加
|
|
self:CreateLightEffect(self.light_id)
|
|
end
|
|
|
|
if self.warSoul_effect_res and self.warSoul_effect_res ~= nil then
|
|
self:CreateWarSoulEffect(self.warSoul_effect_res,self.warSoul_effect_pos,self.warSoul_effect_scale)
|
|
end
|
|
|
|
--宝具
|
|
if self.talisman_id and self.talisman_id ~= 0 then
|
|
self:CreateTalisman(self.talisman_id)
|
|
end
|
|
|
|
self:SetCameraArgs()
|
|
|
|
-- if self.use_bloom then
|
|
-- self:CreateRoleBloomEffect(self.camera, self.bloom_camera)
|
|
-- end
|
|
|
|
--如果不是坐骑模式,才加载完人物模型返回加载回调
|
|
if self.type ~= SceneBaseType.Include_Horse or
|
|
self.type == SceneBaseType.Baby_Include_Horse then
|
|
if self.lCallBack then self.lCallBack(self) end
|
|
end
|
|
|
|
-- 发行需求 设置绿幕模式
|
|
self:UpdateModelGreenScreen()
|
|
|
|
--灯光参数
|
|
if self.use_light_data then
|
|
self:ApplyLightData()
|
|
end
|
|
-- 圣物光环特效
|
|
if self.psionic_effect then
|
|
local show_type = (self.model_type == UIModelCommon.ModelType.BackModel) and "UIBackRole" or "UI"
|
|
local function load_callback( ... )
|
|
if self.psionic_effect_id then
|
|
self.particle_mgr:SetEffectScale(self.psionic_effect_id, PsionicConst.EffectSize[self.psionic_effect])
|
|
self.particle_mgr:SetEffectOrder(self.psionic_effect_id, self:GetCurrLayerDepth(self.layer_name))
|
|
end
|
|
end
|
|
self.psionic_effect_id = self.particle_mgr:AddTargetEffect(self.psionic_effect, self.role, true, nil, nil, 7,nil,nil,1,nil,show_type,load_callback)
|
|
self.particle_list[self.psionic_effect_id] = self.psionic_effect_id
|
|
end
|
|
|
|
--宠物宝石光环特效
|
|
if self.type == SceneBaseType.Pokemon and self.pokemon_diamond_effect then
|
|
local show_type = (self.model_type == UIModelCommon.ModelType.BackModel) and "UIBackRole" or "UI"
|
|
self.pokemon_diamond_effect_id = self.particle_mgr:AddTargetEffect(self.pokemon_diamond_effect, self.role, true, nil, nil, 7,nil,nil,1,nil,show_type)
|
|
self.particle_list[self.pokemon_diamond_effect_id] = self.pokemon_diamond_effect_id
|
|
end
|
|
|
|
if self.show_baby_attack_effect then
|
|
local play_effect_func = function ( )
|
|
local show_type = (self.model_type == UIModelCommon.ModelType.BackModel) and "UIBackRole" or "UI"
|
|
local temp_cfg = ChildConst.SKILL_EFFECT_SHOW_CFG[self.show_baby_attack_effect] or {}
|
|
-- local scale = temp_cfg.scale or 0.5
|
|
self.show_baby_attack_effect_id = self.particle_mgr:AddTargetEffect(self.show_baby_attack_effect, self.role, false, nil, dir, 7,nil,nil,1,nil, show_type)
|
|
if temp_cfg.scale then
|
|
-- print('Msh:UIModelCommon.lua[1543] temp_cfg.scale', temp_cfg.scale)
|
|
self.particle_mgr:SetEffectScale(self.show_baby_attack_effect_id, temp_cfg.scale)
|
|
end
|
|
self.particle_list[self.show_baby_attack_effect_id] = self.show_baby_attack_effect_id
|
|
end
|
|
setTimeout(play_effect_func, 0.4)
|
|
end
|
|
|
|
--ai娘全套装备模型展示
|
|
if self.type == SceneBaseType.Pet and self.show_jarvis_all_figure_data then
|
|
self:CreateJarvisAll()
|
|
end
|
|
|
|
--技能特效
|
|
if self.need_play_skill_effect then
|
|
self:PlaySkillEffect(self.role, self.skill_id)
|
|
end
|
|
end
|
|
|
|
if self.type == SceneBaseType.FWeapon then
|
|
--创建左右手武器,单独显示用,不走上面的逻辑
|
|
local career = self.career or RoleManager.Instance.mainRoleInfo.career
|
|
local weapon_res_id = GameResPath:GetFWeaponResName( career,self.fashion_model_id or self.clothe_res_id )
|
|
local abName,weapon_attach_list,weapon_res_list = GameResPath.GetWeaponRes(SceneBaseType.FWeapon,weapon_res_id,career)
|
|
local function localWeaponCallback( objs, is_gameObject )
|
|
if self.weapon_container then
|
|
for k,v in pairs(self.weapon_container) do
|
|
destroy(v.go)
|
|
end
|
|
end
|
|
self:CreateWeaponOnly(objs, is_gameObject, weapon_attach_list)
|
|
-- 发行需求 设置绿幕模式
|
|
self:UpdateModelGreenScreen()
|
|
end
|
|
LuaResManager:getInstance():loadPrefabs(self,abName,weapon_res_list, localWeaponCallback)
|
|
else
|
|
LuaResManager:getInstance():loadPrefab(self,anName,resName, loadRoleCallback)
|
|
end
|
|
end
|
|
|
|
function UIModelCommon:SetCameraArgs(use_default)
|
|
|
|
end
|
|
|
|
---------排行榜ai娘总榜把ai娘的磁炮星翼幻甲等全套装备一起展示出来-------------------------->>>>>>>
|
|
function UIModelCommon:CreateJarvisAll( )
|
|
self:CreateJarvisGun()--磁炮
|
|
self:CreateJarvisCloud()--星翼
|
|
self:CreateJarvisArmour()--幻甲
|
|
end
|
|
function UIModelCommon:CreateJarvisGun( )
|
|
if not self.show_jarvis_all_figure_data.f_gun_figure_id then return end
|
|
local abName, resName = GameResPath.GetModelClotheRes(SceneBaseType.FGun, self.show_jarvis_all_figure_data.f_gun_figure_id)
|
|
local function localGunCallback(objs, is_gameObject)
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if not objs or not objs[0] then
|
|
logWarn("cannot find wing res = "..self.show_jarvis_all_figure_data.f_gun_figure_id)
|
|
return
|
|
end
|
|
local go = is_gameObject and objs[0] or newObject(objs[0])
|
|
go:SetActive(true)
|
|
local bone = FindBone(self.role.transform, AttachNode.Root)
|
|
if bone == nil then
|
|
return
|
|
end
|
|
go.transform:SetParent(bone)
|
|
go.transform.localPosition = Vector3.zero
|
|
go.transform.localRotation = Quaternion.identity
|
|
go.transform.localScale = Vector3.one
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(self.parent.transform)
|
|
end
|
|
local animator = go:GetComponent("Animator")
|
|
if not IsNull(animator) then
|
|
animator.cullingMode = UnityEngine.AnimatorCullingMode.AlwaysAnimate
|
|
animator:CrossFade( "idle",0, 0.0 )
|
|
end
|
|
|
|
--部件特效,参数为部件类型与id
|
|
self:CreateEffect(SceneBaseType.FGun, self.show_jarvis_all_figure_data.f_gun_figure_id, go)
|
|
end
|
|
if self.role.transform and abName and resName then
|
|
LuaResManager:getInstance():loadPrefab(self,abName,resName, localGunCallback)
|
|
end
|
|
end
|
|
function UIModelCommon:CreateJarvisCloud( )
|
|
if not self.show_jarvis_all_figure_data.f_cloud_figure_id then return end
|
|
local abName, resName = GameResPath.GetModelClotheRes(SceneBaseType.FCloud, self.show_jarvis_all_figure_data.f_cloud_figure_id)
|
|
local function localWingCallback(objs, is_gameObject)
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if not objs or not objs[0] then
|
|
logWarn("cannot find wing res = "..self.show_jarvis_all_figure_data.f_cloud_figure_id)
|
|
return
|
|
end
|
|
local go = is_gameObject and objs[0] or newObject(objs[0])
|
|
go:SetActive(true)
|
|
local bone = FindBone(self.role.transform, AttachNode.Wing)
|
|
if bone == nil then
|
|
return
|
|
end
|
|
go.transform:SetParent(bone)
|
|
go.transform.localPosition = Vector3.zero
|
|
go.transform.localRotation = Quaternion.identity
|
|
go.transform.localScale = Vector3.one
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(self.parent.transform)
|
|
end
|
|
local animator = go:GetComponent("Animator")
|
|
if not IsNull(animator) then
|
|
animator.cullingMode = UnityEngine.AnimatorCullingMode.AlwaysAnimate
|
|
animator:CrossFade( "idle",0, 0.0 )
|
|
end
|
|
|
|
--部件特效,参数为部件类型与id
|
|
self:CreateEffect(SceneBaseType.FCloud, self.show_jarvis_all_figure_data.f_cloud_figure_id, go)
|
|
end
|
|
if self.role.transform and abName and resName then
|
|
LuaResManager:getInstance():loadPrefab(self,abName,resName, localWingCallback)
|
|
end
|
|
end
|
|
function UIModelCommon:CreateJarvisArmour( )
|
|
if not self.show_jarvis_all_figure_data.f_armour_figure_id then return end
|
|
local abName, resName = GameResPath.GetModelClotheRes(SceneBaseType.FArmour, self.show_jarvis_all_figure_data.f_armour_figure_id)
|
|
local function localWingCallback(objs, is_gameObject)
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if not objs or not objs[0] then
|
|
logWarn("cannot find wing res = "..self.show_jarvis_all_figure_data.f_armour_figure_id)
|
|
return
|
|
end
|
|
local go = is_gameObject and objs[0] or newObject(objs[0])
|
|
go:SetActive(true)
|
|
local bone = FindBone(self.role.transform, AttachNode.Root)
|
|
if bone == nil then
|
|
return
|
|
end
|
|
go.transform:SetParent(bone)
|
|
go.transform.localPosition = Vector3.zero
|
|
go.transform.localRotation = Quaternion.identity
|
|
go.transform.localScale = Vector3.one
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(self.parent.transform)
|
|
end
|
|
local animator = go:GetComponent("Animator")
|
|
if not IsNull(animator) then
|
|
animator.cullingMode = UnityEngine.AnimatorCullingMode.AlwaysAnimate
|
|
animator:CrossFade( "idle",0, 0.0 )
|
|
end
|
|
|
|
--部件特效,参数为部件类型与id
|
|
self:CreateEffect(SceneBaseType.FArmour, self.show_jarvis_all_figure_data.f_armour_figure_id, go)
|
|
end
|
|
if self.role.transform and abName and resName then
|
|
LuaResManager:getInstance():loadPrefab(self,abName,resName, localWingCallback)
|
|
end
|
|
end
|
|
---------排行榜ai娘总榜把ai娘的磁炮星翼幻甲等全套装备一起展示出来--------------------------<<<<<<<<<<<<
|
|
|
|
|
|
|
|
|
|
function UIModelCommon:CreatePearls( vo )
|
|
if IsTableEmpty(vo) then
|
|
return
|
|
end
|
|
if self.transform and self.role.transform then
|
|
local info = vo
|
|
self.pearl_list = self.pearl_list or {}
|
|
self.pearl_parent = self.pearl_parent or {}
|
|
local ellipse_config = Config.otherFightInfo.PearlEllipse
|
|
local around_ellipse_config = Config.otherFightInfo.PearlUIEllipse
|
|
for i=1, #info do
|
|
if info[i] and info[i].type_id ~= 0 or info[i].skin_model_id then
|
|
local temp_pearl = self.pearl_list[i]
|
|
if not temp_pearl then
|
|
temp_pearl = GalaxyPearl.New(self.role.transform,ellipse_config,around_ellipse_config)
|
|
temp_pearl:SetStartPostion(1/#info * i)
|
|
self.pearl_list[i] = temp_pearl
|
|
end
|
|
temp_pearl:LoadPearlVo(self, false, info[i], false, info[i].skin_model_id, true)
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
--在人物旁边展示宝具
|
|
function UIModelCommon:CreateTalisman(talisman_id)
|
|
_type = SceneBaseType.FPearl
|
|
local abName, resName = GameResPath.GetModelClotheRes(_type, talisman_id)
|
|
local function localTalismanCallback(objs, is_gameObject)
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if not objs or not objs[0] then
|
|
logWarn("cannot find talisman res = "..self.talisman_id)
|
|
return
|
|
end
|
|
local go = is_gameObject and objs[0] or newObject(objs[0])
|
|
go:SetActive(true)
|
|
-- local bone = FindBone(self.role.transform, AttachNode.Wing)
|
|
-- if bone == nil then
|
|
-- return
|
|
-- end
|
|
go.transform:SetParent(self.role.transform)
|
|
go.transform.localPosition = Vector3(-0.8,0.6,-0.8)
|
|
go.transform.localRotation = Quaternion.identity
|
|
go.transform.localScale = Vector3.one
|
|
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(self.parent.transform)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(self.parent.transform)
|
|
end
|
|
local animator = go:GetComponent("Animator")
|
|
if not IsNull(animator) then
|
|
animator.cullingMode = UnityEngine.AnimatorCullingMode.AlwaysAnimate
|
|
animator:CrossFade( "idle",0, 0.0 )
|
|
end
|
|
|
|
--部件特效,参数为部件类型与id
|
|
self:CreateEffect(SceneBaseType.FPearl, self.talisman_id, go)
|
|
end
|
|
if self.role.transform and abName and resName then
|
|
LuaResManager:getInstance():loadPrefab(self,abName,resName, localTalismanCallback)
|
|
end
|
|
end
|
|
|
|
--创建左右手武器,单独显示用
|
|
function UIModelCommon:CreateWeaponOnly(objs,is_gameObject,weapon_attach_list)
|
|
if self._use_delete_method then return end
|
|
self.weapon_hand_list = self.weapon_hand_list or {}
|
|
self.weapon_container = {}
|
|
-------------------------
|
|
self:RemoveAllParticle()
|
|
if self.role then
|
|
destroy(self.role)
|
|
end
|
|
-------------------------
|
|
for i,v in ipairs(weapon_attach_list) do
|
|
if self.weapon_hand_list[i] then
|
|
destroy(self.weapon_hand_list[i])
|
|
end
|
|
if objs and objs[i - 1] then
|
|
self.weapon_hand_list[i] = is_gameObject and objs[i] or newObject(objs[i - 1])
|
|
self.weapon_container[i] = {go = self.weapon_hand_list[i]}
|
|
local animator = self.weapon_hand_list[i]:GetComponent("Animator")
|
|
if not IsNull(animator) then
|
|
local custom_speed = Config.ConfigModelSpeed.ModelActionSpeed[tonumber(self.clothe_res_id)]
|
|
if custom_speed then
|
|
if animator then
|
|
animator.speed = custom_speed
|
|
end
|
|
end
|
|
animator.cullingMode = UnityEngine.AnimatorCullingMode.AlwaysAnimate
|
|
end
|
|
local paredt_node = false
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.Model or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
paredt_node = self.parent.transform
|
|
else
|
|
paredt_node = self.role_con
|
|
end
|
|
self.weapon_hand_list[i].transform:SetParent(paredt_node)
|
|
-------------------------
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self:SetUIbackRoleLayer(paredt_node)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
self:SetUILayer(paredt_node)
|
|
end
|
|
--角度,要反向
|
|
self.weapon_hand_list[i].transform.localRotation = Quaternion.Euler(Vector3(0,180,0))
|
|
--缩放
|
|
if self.scale then
|
|
self.weapon_hand_list[i].transform.localScale = Vector3(self.scale,self.scale,self.scale)
|
|
else
|
|
self.weapon_hand_list[i].transform.localScale = Vector3(100,100,100)
|
|
end
|
|
--坐标
|
|
if ClientConfig.is_use_model_render or self.model_type == UIModelCommon.ModelType.BackModel then
|
|
self.weapon_hand_list[i].transform.localPosition = self.position or Vector3(0,75,-300)
|
|
elseif self.model_type == UIModelCommon.ModelType.Model then
|
|
if self.position then
|
|
self.weapon_hand_list[i].transform.localPosition = self.position
|
|
else
|
|
self.weapon_hand_list[i].transform.localPosition = Vector3.zero
|
|
end
|
|
else
|
|
if self.position and not self.show_shadow then
|
|
self.weapon_hand_list[i].transform.localPosition = self.position + self:GetRolePositionOffset()
|
|
else
|
|
if self.show_shadow then
|
|
self.weapon_hand_list[i].transform.localPosition = Vector3(0, 119, 0) + self:GetRolePositionOffset()
|
|
else
|
|
self.weapon_hand_list[i].transform.localPosition = Vector3.zero + self:GetRolePositionOffset()
|
|
end
|
|
end
|
|
end
|
|
|
|
local action_delta = self.action_delta
|
|
local action_name_list = self.action_name_list
|
|
local animator = self.weapon_hand_list[i]:GetComponent("Animator")
|
|
if IsNull(animator) then
|
|
return
|
|
end
|
|
animator:CrossFade("show3",0, 0.0 )
|
|
--动作特效
|
|
if not IsTableEmpty(action_name_list) then
|
|
if action_delta then
|
|
self:DelayPlayNextActionLoop(animator, action_name_list, action_delta)
|
|
else
|
|
self:DelayPlayNextAction(animator, action_name_list)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
self:CreateEffect(self.type, self.clothe_res_id, self.role)
|
|
end
|
|
|
|
-- 发行需求:切换绿幕
|
|
function UIModelCommon:UpdateModelGreenScreen( )
|
|
-- 获取模型节点根节点
|
|
if self.model_data and self.model_data.use_green_screen then
|
|
-- camera_type:1 主摄像机 2 UI摄像机 3 UIModel摄像机
|
|
CheatModel:getInstance():SetupGreenScreenEffect(true, self, self.model_data.green_screen_camera_type)
|
|
end
|
|
end
|
|
|
|
--灯光参数
|
|
function UIModelCommon:ApplyLightData( )
|
|
self:ApplyCameraLightData()
|
|
|
|
local cfg = Config.lightsData
|
|
local temp_vet4 = Vector4(0,0,0,0)
|
|
for k,v in pairs(cfg) do
|
|
temp_vet4.x = v[1]
|
|
temp_vet4.y = v[2]
|
|
temp_vet4.z = v[3]
|
|
temp_vet4.w = v[4]
|
|
Shader.SetGlobalVector(k, temp_vet4)
|
|
end
|
|
end
|
|
|
|
function UIModelCommon:ApplyCameraLightData( )
|
|
local light_camera = MainCamera.Instance.camera_gameObject
|
|
if not IsNull(light_camera) then
|
|
local dir = -light_camera.transform.forward;
|
|
dir:Normalize()
|
|
Shader.SetGlobalVector("_GlobalLightDir", Vector4(dir.x, dir.y, dir.z, 1))
|
|
end
|
|
end
|
|
|
|
function UIModelCommon:SetAnimatorSpeed(speed)
|
|
if self.role then
|
|
local animator = self.role:GetComponent("Animator")
|
|
if animator then
|
|
animator.speed = speed
|
|
end
|
|
end
|
|
end
|