源战役客户端
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 

404 rindas
14 KiB

--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