|
|
--ui挂接模型处理, 单一模型展示,比如只显示武器,不显示人物模型 新新新新新新新新新新新新
|
|
NewUIPartModelClass = NewUIPartModelClass or BaseClass(UIPartical)
|
|
--当前正在使用的rendertexture列表
|
|
function NewUIPartModelClass:__init(parent, res_id, texture_id, modelPartPos,type,raycastParent,texture_size,scale, layer_name,position, action_name_list, action_delta,can_rotate,rotate)
|
|
self.parent = parent
|
|
self.particle_list = {}
|
|
self.pos_x = 0
|
|
self.custom_speed = 1
|
|
self:SetData(parent, res_id, texture_id, modelPartPos, type,texture_size,scale, layer_name,position,action_name_list, action_delta,can_rotate,rotate)
|
|
self:AddEvents()
|
|
end
|
|
|
|
function NewUIPartModelClass:__delete()
|
|
self:ClearActionTimerList()
|
|
self:ResetUIDepth()
|
|
if self.clothe then
|
|
self.clothe:DeleteMe()
|
|
self.clothe = nil
|
|
end
|
|
if self.gameObject then
|
|
destroy(self.gameObject)
|
|
self.gameObject = nil
|
|
end
|
|
end
|
|
|
|
--UIPartModelConfig 模型位置,大小等的配置,由策划自己去调整
|
|
function NewUIPartModelClass:SetData(parent, res_id, texture_id, modelPartPos, role_type, texture_size,scale, layer_name,position, action_name_list, action_delta,can_rotate,rotate)
|
|
-- local cfg = Config.UIPartModelConfig[res_id]
|
|
-- local size = nil
|
|
-- local rotate = nil
|
|
-- local can_rotate = nil
|
|
-- if cfg then
|
|
-- size = cfg.size
|
|
-- rotate = cfg.rotate
|
|
-- can_rotate = cfg.can_rotate
|
|
-- position = cfg.position or position
|
|
-- scale = cfg.scale or scale
|
|
-- end
|
|
self.layer_name = layer_name or "UI"
|
|
self.res_id = res_id
|
|
self.texture_id = texture_id
|
|
self.type = role_type or nil
|
|
self.size = texture_size or size or {x = 600,y = 360}
|
|
self.rotate = rotate or 0
|
|
self.can_rotate = can_rotate == nil or can_rotate == true
|
|
self.position = position
|
|
-- action_name_list = {"show"}
|
|
-- action_delta = 0
|
|
self.action_name_list = action_name_list or {"show"}
|
|
self.action_delta = action_delta or 0
|
|
print("=====action_delta",action_delta)
|
|
local role_con = parent
|
|
local anName = ModelPartName[role_type] .. res_id
|
|
local resName = ModelPartName[role_type] .. res_id
|
|
if modelPartPos == FashionPartPos.Weapon then
|
|
anName = "model_weapon_" .. res_id
|
|
resName = ModelPartName[role_type] .. res_id
|
|
|
|
else
|
|
|
|
end
|
|
local function loadRoleCallback(objs)
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if not objs or not objs[0] then
|
|
return
|
|
end
|
|
if self.gameObject then
|
|
destroy(self.gameObject)
|
|
end
|
|
self.gameObject = newObject(objs[0])
|
|
self.transform = self.gameObject.transform
|
|
|
|
local custom_speed = Config.ConfigModelSpeed.ModelActionSpeed[tonumber(res_id)]
|
|
if custom_speed then
|
|
local animator = self.gameObject:GetComponent("Animator")
|
|
if animator then
|
|
animator.speed = custom_speed
|
|
self.custom_speed = custom_speed
|
|
end
|
|
end
|
|
|
|
self:CheckMat(self.gameObject)
|
|
|
|
self.gameObject:GetComponent("Animator").cullingMode = UnityEngine.AnimatorCullingMode.AlwaysAnimate
|
|
self.transform:SetParent(role_con)
|
|
self.transform.localRotation = Quaternion.identity
|
|
self:SetUILayer(self.transform)
|
|
self:SetParticleDepth(self.gameObject)
|
|
if modelPartPos == FashionPartPos.Weapon then
|
|
--加载武器配置特效
|
|
local weapon_pvo = {} --Config.SceneObjectParticle.Weapon[res_id]
|
|
if weapon_pvo and weapon_pvo.always then
|
|
for bone_name, particle_vo in pairs(weapon_pvo.always) do
|
|
local bone = FindBone(self.transform, bone_name)
|
|
if bone then
|
|
local function load_finish_func(go)
|
|
if go then
|
|
self:SetUILayer(go.transform)
|
|
go.transform.localScale = Vector3.one
|
|
go.transform.localRotation = Vector3.zero
|
|
|
|
self:CheckMat(go)
|
|
end
|
|
end
|
|
self:AddUIEffect(particle_vo.name, bone, self.layer_name, nil, -1, false, -1, nil, nil,load_finish_func, nil, nil, true)
|
|
end
|
|
end
|
|
end
|
|
else
|
|
local body_pvo = {} --Config.SceneObjectParticle.Body[res_id]
|
|
if body_pvo and body_pvo.always then
|
|
for bone_name, particle_vo in pairs(body_pvo.always) do
|
|
local bone = FindBone(self.transform, bone_name)
|
|
if bone then
|
|
local function load_finish_func(go)
|
|
if go then
|
|
self:SetUILayer(go.transform)
|
|
go.transform.localScale = Vector3.one
|
|
go.transform.localRotation = Quaternion.Euler(Vector3.zero)
|
|
self:CheckMat(go)
|
|
end
|
|
end
|
|
self:AddUIEffect(particle_vo.name, bone, self.layer_name, nil, -1, false, -1, nil, nil,load_finish_func, nil, nil, true)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local z = 0
|
|
if self.layer_name and self.layer_name == "Main" then
|
|
z = UIZDepth.STEP_VALUE
|
|
end
|
|
if position then
|
|
SetLocalPosition(self.transform, position.x, position.y,UIZDepth.MODEL_Z_VALUE + z)
|
|
-- self.transform.localPosition = Vector3(position.x, position.y,-UIZDepth.STEP_VALUE + 300 + z)
|
|
else
|
|
SetLocalPosition(self.transform, 0, 0,UIZDepth.MODEL_Z_VALUE + z)
|
|
-- self.transform.localPosition = Vector3(0,0,-UIZDepth.STEP_VALUE + 300 + z)
|
|
end
|
|
|
|
if scale then
|
|
self.transform.localScale = Vector3(scale,scale,scale)
|
|
else
|
|
self.transform.localScale = Vector3(200,200,200)
|
|
end
|
|
|
|
local rotate_type = type(rotate)
|
|
if rotate_type == "number" then
|
|
self.transform:Rotate(Vector3(0, 180 + (rotate), 0))
|
|
self.rotate = rotate
|
|
elseif rotate_type == "table" then
|
|
--self.transform:Rotate(Vector3(rotate.x, rotate.y, rotate.z))
|
|
self.transform.localRotation = Quaternion.Euler(rotate.x, rotate.y, rotate.z)
|
|
self.rotate = rotate.y
|
|
else
|
|
self.transform:Rotate(Vector3(0, 180, 0))
|
|
self.rotate = 0
|
|
end
|
|
-- self.transform:Rotate(Vector3(0, 180 + (self.rotate), 0))
|
|
-- local animator = self.gameObject:GetComponent("Animator")
|
|
-- if animator then
|
|
-- animator:CrossFade( "idle",0, 0.0 )
|
|
-- animator:CrossFade( "show",0, 0.0 )
|
|
-- print("============NewUIPartModelClass CrossFade show ")
|
|
-- end
|
|
if texture_id then
|
|
self:CreateClothTexture(res_id, texture_id)
|
|
end
|
|
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.gameObject:GetComponent("Animator")
|
|
if string.find(action_name, "casual") then
|
|
animator.speed = 1
|
|
else
|
|
animator.speed = self.custom_speed
|
|
end
|
|
|
|
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
|
|
else
|
|
local animator = self.gameObject:GetComponent("Animator")
|
|
if animator then
|
|
animator:CrossFade( "show",0, 0.0 )
|
|
end
|
|
end
|
|
end
|
|
parent.sizeDelta = Vector2(self.size.x, self.size.y)
|
|
LuaResManager:getInstance():loadPrefab(self,anName,resName, loadRoleCallback, true)
|
|
end
|
|
|
|
function NewUIPartModelClass:ClearActionTimerList()
|
|
if self.delay_play_action_timer_list then
|
|
for i, id in ipairs(self.delay_play_action_timer_list) do
|
|
TimerQuest.CancelQuest(GlobalTimerQuest, id)
|
|
end
|
|
self.delay_play_action_timer_list = {}
|
|
end
|
|
end
|
|
|
|
--action_name_list.idle_name 默认待机动作
|
|
function NewUIPartModelClass:DelayPlayNextActionLoop(animator, action_name_list, action_delta)
|
|
if IsTableEmpty(action_name_list) or animator == nil or not self.gameObject.activeInHierarchy 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 "idle2"
|
|
local delay_play = function ()
|
|
if animator then
|
|
local action_name = action_name_list[ math.random(1,#action_name_list)]
|
|
if string.find(action_name, "casual") then
|
|
animator.speed = 1
|
|
else
|
|
animator.speed = self.custom_speed
|
|
end
|
|
|
|
animator:CrossFade(action_name, 0.2, 0.0)
|
|
self:DelayPlayNextActionLoop(animator, action_name_list, action_delta)
|
|
end
|
|
end
|
|
local play_idle = function ()
|
|
if not IsNull(animator) then
|
|
if string.find(idle_action, "casual") then
|
|
animator.speed = 1
|
|
else
|
|
animator.speed = self.custom_speed
|
|
end
|
|
|
|
animator:CrossFade(idle_action, 0.3, 0.0 )
|
|
end
|
|
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, TimerQuest.AddDelayQuest(GlobalTimerQuest, play_idle,action_time))
|
|
table.insert(self.delay_play_action_timer_list, TimerQuest.AddDelayQuest(GlobalTimerQuest, delay_play,action_delta))
|
|
end
|
|
|
|
--延迟播放下一个动作
|
|
function NewUIPartModelClass:DelayPlayNextAction(animator, action_name_list)
|
|
if not IsTableEmpty(action_name_list) then
|
|
animator:Update(0)
|
|
local cur_state = animator:GetCurrentAnimatorStateInfo(0)
|
|
local action_time = 0
|
|
|
|
if cur_state then
|
|
action_time = cur_state.length
|
|
local delay_play = function ()
|
|
local action_name = table.remove(action_name_list, 1)
|
|
if action_name then
|
|
if string.find(action_name, "casual") then
|
|
animator.speed = 1
|
|
else
|
|
animator.speed = self.custom_speed
|
|
end
|
|
|
|
animator:CrossFade(action_name,0, 0.0 )
|
|
if not IsTableEmpty(action_name_list) then
|
|
self:DelayPlayNextAction(animator, action_name_list)
|
|
end
|
|
else
|
|
return
|
|
end
|
|
end
|
|
table.insert(self.delay_play_action_timer_list, TimerQuest.AddDelayQuest(GlobalTimerQuest, delay_play,action_time))
|
|
else
|
|
return
|
|
end
|
|
end
|
|
return
|
|
end
|
|
|
|
--贴图
|
|
function NewUIPartModelClass: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 NewUIPartModelClass:AddEvents()
|
|
SetAlpha(self.parent:GetComponent("RawImage"),0)
|
|
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
|
|
-- AddDownEvent(self.parent.gameObject, touch_begin)
|
|
self.parent:GetComponent("RawImage").raycastTarget = true
|
|
AddDragBeginEvent(rtGo, touch_begin)
|
|
AddDragEvent(rtGo, draging)
|
|
AddDragEndEvent(rtGo, touch_end)
|
|
-- AddUpEvent(self.parent.gameObject, touch_end)
|
|
else
|
|
self.parent:GetComponent("RawImage").raycastTarget = false
|
|
end
|
|
end
|
|
|
|
|
|
function NewUIPartModelClass:OnDragging(pos_x, pos_y)
|
|
if pos_x and self.pos_x then
|
|
local delta_x = pos_x - self.pos_x
|
|
if self.gameObject then
|
|
if delta_x > 0 then
|
|
self.rotate = self.rotate - 10
|
|
-- self.transform:Rotate(Vector3(0, -10, 0))
|
|
self.transform:Rotate(Vector3.up, -10, UnityEngine.Space.World)
|
|
else
|
|
self.rotate = self.rotate + 10
|
|
-- self.transform:Rotate(Vector3(0, 10, 0))
|
|
self.transform:Rotate(Vector3.up, 10, UnityEngine.Space.World)
|
|
end
|
|
self.pos_x = pos_x
|
|
end
|
|
else
|
|
print("---NewUIPartModelClass--OnDragging-pos_x-:", pos_x)
|
|
print("---NewUIPartModelClass--OnDragging-pos_y-:", pos_y)
|
|
end
|
|
end
|
|
|
|
function NewUIPartModelClass:PlayIdelAnim()
|
|
if self.gameObject then
|
|
local animator = self.gameObject:GetComponent("Animator")
|
|
if animator then
|
|
animator.speed = self.custom_speed
|
|
animator:CrossFade( "idle2",0, 0.0 )
|
|
end
|
|
end
|
|
end
|
|
|
|
function NewUIPartModelClass:PlayShowAnim()
|
|
if self.gameObject then
|
|
local animator = self.gameObject:GetComponent("Animator")
|
|
if animator then
|
|
animator:CrossFade( "show",0, 0.0 )
|
|
end
|
|
end
|
|
end
|
|
|
|
function NewUIPartModelClass:CheckMat(gameObject)
|
|
local check_func = function(renders)
|
|
if renders then
|
|
for j = 0, renders.Length - 1 do
|
|
local mesh = renders[j]
|
|
local materials = mesh.materials
|
|
if materials.Length > 0 then
|
|
for j = 0, materials.Length - 1 do
|
|
local material = materials[j]
|
|
if material.shader.name == "Custom/mb_flowalphablendmask_xray" then
|
|
material.shader = ShaderTools.GetShader( "mb_flowalphablendmaskui" )
|
|
elseif material.shader.name == "ApcShader/XRayEffect" then
|
|
material.shader = SceneManager.Instance:GetTextureShader()
|
|
elseif material.shader.name == "Mobile/Particles/Additive" then
|
|
material.shader = ShaderTools.GetShader( "MobileParticleAddNoFog" )
|
|
elseif material.shader.name == "Mobile/Particles/Alpha Blended" then
|
|
material.shader = ShaderTools.GetShader( "MobileParticleAlphaNoFog" )
|
|
elseif material.shader.name == "Particles/Alpha Blended" then
|
|
material.shader = ShaderTools.GetShader( "ParticleAlphaBlendNoFog" )
|
|
elseif material.shader.name == "Particles/Additive" then
|
|
material.shader = ShaderTools.GetShader( "Particle Add_NoFog" )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local renders = gameObject:GetComponentsInChildren(typeof(UnityEngine.SkinnedMeshRenderer))
|
|
check_func(renders)
|
|
|
|
renders = gameObject:GetComponentsInChildren(typeof(UnityEngine.MeshRenderer))
|
|
check_func(renders)
|
|
|
|
renders = gameObject:GetComponentsInChildren(typeof(UnityEngine.ParticleSystemRenderer))
|
|
check_func(renders)
|
|
end
|