163 lines
4.7 KiB
Lua
163 lines
4.7 KiB
Lua
|
---@class XUiModelCerberusGame3D
|
||
|
local XUiModelCerberusGame3D = XClass(nil, "XUiModelCerberusGame3D")
|
||
|
|
||
|
local ModelDic =
|
||
|
{
|
||
|
[1] = "R3TwentyoneMd010031",
|
||
|
[2] = "R2NuoketiMd010031",
|
||
|
[3] = "R3WeilaMd010031",
|
||
|
}
|
||
|
|
||
|
local CameraPos =
|
||
|
{
|
||
|
[1] = 6,
|
||
|
[2] = 22.6,
|
||
|
[3] = 40.8,
|
||
|
}
|
||
|
|
||
|
function XUiModelCerberusGame3D:Ctor(ui, rootui)
|
||
|
self.RootUi2D = rootui
|
||
|
self.GameObject = ui.gameObject
|
||
|
self.Transform = ui.transform
|
||
|
self.CurSelectIndex = nil
|
||
|
XTool.InitUiObject(self)
|
||
|
|
||
|
self:InitInfo()
|
||
|
end
|
||
|
|
||
|
function XUiModelCerberusGame3D:InitInfo()
|
||
|
-- 阴影要放在武器模型加载完之后
|
||
|
for k, key in pairs(ModelDic) do
|
||
|
CS.XShadowHelper.AddShadow(self[key].gameObject, true)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiModelCerberusGame3D:SetChangeByRoleBtn(index, doModelSeleCb)
|
||
|
if self.CurSelectIndex == index then
|
||
|
return
|
||
|
end
|
||
|
self:SetAllModelCamFalse()
|
||
|
-- 轨道转完才能转角色
|
||
|
self:SetTrackSelect(index, function ()
|
||
|
if doModelSeleCb then
|
||
|
self:SetModelSelect(index)
|
||
|
end
|
||
|
end)
|
||
|
self.CurSelectIndex = index
|
||
|
end
|
||
|
|
||
|
function XUiModelCerberusGame3D:SetModelSelect(index)
|
||
|
if self.ChangeTimer then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
for modelIndex, modelKey in pairs(ModelDic) do
|
||
|
self["UiCamFar0"..modelIndex].gameObject:SetActiveEx(modelIndex == index)
|
||
|
self["UiCamNear0"..modelIndex].gameObject:SetActiveEx(modelIndex == index)
|
||
|
if modelIndex ~= index then
|
||
|
self:SetTargetModelUnSelect(modelIndex)
|
||
|
end
|
||
|
end
|
||
|
-- 播放目标角色的Select状态
|
||
|
self:SetTargerModelSelect(index)
|
||
|
end
|
||
|
|
||
|
function XUiModelCerberusGame3D:SetTrackSelect(index, cb)
|
||
|
self:SetTrackPathPosition(CameraPos[index], cb)
|
||
|
end
|
||
|
|
||
|
function XUiModelCerberusGame3D:CheckLeftOrRight(currentValue, targetValue)
|
||
|
local inc = (targetValue - currentValue + 53) % 53 -- 虚拟相机一圈的值是53
|
||
|
local dec = (currentValue - targetValue + 53) % 53
|
||
|
if inc <= dec then
|
||
|
return true
|
||
|
else
|
||
|
return false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiModelCerberusGame3D:SetTrackPathPosition(value, cb)
|
||
|
if self.ChangeTimer then
|
||
|
self:StopTimer()
|
||
|
end
|
||
|
|
||
|
local trackDollyNear = self.CamNearMain:GetCinemachineComponent(CS.Cinemachine.CinemachineCore.Stage.Body, typeof(CS.Cinemachine.CinemachineTrackedDolly))
|
||
|
local trackDollyFar = self.CamFarMain:GetCinemachineComponent(CS.Cinemachine.CinemachineCore.Stage.Body, typeof(CS.Cinemachine.CinemachineTrackedDolly))
|
||
|
|
||
|
local duration = 3
|
||
|
local moveSpeed = 0.6
|
||
|
local targetValue = tonumber(string.format("%.f", value))
|
||
|
local orgPath = tonumber(string.format("%.f", trackDollyNear.m_PathPosition))
|
||
|
|
||
|
self.ChangeTimer = XUiHelper.Tween(duration, function ()
|
||
|
local currPath = tonumber(string.format("%.f", trackDollyNear.m_PathPosition))
|
||
|
if currPath == targetValue then
|
||
|
self:StopTimer()
|
||
|
if cb then
|
||
|
cb()
|
||
|
end
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local addNum = 0
|
||
|
if self:CheckLeftOrRight(orgPath, targetValue) then
|
||
|
addNum = moveSpeed
|
||
|
else
|
||
|
addNum = -1 * moveSpeed
|
||
|
end
|
||
|
-- 由于虚拟相机绕一圈值会叠加,所以需要减一圈的值
|
||
|
local res = (trackDollyNear.m_PathPosition + addNum)%53
|
||
|
|
||
|
trackDollyNear.m_PathPosition = res
|
||
|
trackDollyFar.m_PathPosition = res
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function XUiModelCerberusGame3D:StopTimer()
|
||
|
if self.ChangeTimer then
|
||
|
XScheduleManager.UnSchedule(self.ChangeTimer)
|
||
|
self.ChangeTimer = nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiModelCerberusGame3D:SetTargetModelUnSelect(index)
|
||
|
local modelKey = ModelDic[index]
|
||
|
local animator = self[modelKey]
|
||
|
if not animator then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local stateInfo = animator:GetCurrentAnimatorStateInfo(0)
|
||
|
if stateInfo:IsName("Attack85") or stateInfo:IsName("Attack84") then
|
||
|
animator:SetTrigger("DoPlayBack")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiModelCerberusGame3D:SetTargerModelSelect(index)
|
||
|
local modelKey = ModelDic[index]
|
||
|
local animator = self[modelKey]
|
||
|
if not animator then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local stateInfo = animator:GetCurrentAnimatorStateInfo(0)
|
||
|
if stateInfo:IsName("Attack85") or stateInfo:IsName("Attack84") then
|
||
|
return
|
||
|
end
|
||
|
animator:SetTrigger("DoPlaySelect")
|
||
|
end
|
||
|
|
||
|
function XUiModelCerberusGame3D:SetAllModelUnSelect()
|
||
|
for modelIndex, modelKey in pairs(ModelDic) do
|
||
|
self:SetTargetModelUnSelect(modelIndex)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XUiModelCerberusGame3D:SetAllModelCamFalse()
|
||
|
for modelIndex, modelKey in pairs(ModelDic) do
|
||
|
self["UiCamFar0"..modelIndex].gameObject:SetActiveEx(false)
|
||
|
self["UiCamNear0"..modelIndex].gameObject:SetActiveEx(false)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return XUiModelCerberusGame3D
|