1714dcc21d
EN: 1.4.0.74 CN: 1.4.0.75 JP: 1.4.0.78 KR: 1.4.0.81
347 lines
12 KiB
Lua
347 lines
12 KiB
Lua
local LayoutRebuilder = CS.UnityEngine.UI.LayoutRebuilder
|
|
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
|
|
local BubbleVoiceManager = require("Game.Actor2D.BubbleVoiceManager")
|
|
local AvgBubbleCtrl = class("AvgBubbleCtrl", BaseCtrl)
|
|
AvgBubbleCtrl._mapNodeConfig = {
|
|
cg1 = {
|
|
sNodeName = "--Style_1--",
|
|
sComponentName = "CanvasGroup"
|
|
},
|
|
TMP = {
|
|
sComponentName = "RubyTextMeshProUGUI"
|
|
},
|
|
rtTMP = {
|
|
sNodeName = "TMP",
|
|
sComponentName = "RectTransform"
|
|
},
|
|
LSV = {
|
|
sComponentName = "LoopScrollView"
|
|
},
|
|
cg2 = {
|
|
sNodeName = "--Style_2--",
|
|
sComponentName = "CanvasGroup"
|
|
},
|
|
txtName = {
|
|
sComponentName = "RubyTextMeshProUGUI"
|
|
},
|
|
tmp_Content = {
|
|
sComponentName = "RubyTextMeshProUGUI"
|
|
},
|
|
cgContent = {
|
|
sNodeName = "tmp_Content",
|
|
sComponentName = "CanvasGroup"
|
|
},
|
|
cg3 = {
|
|
sNodeName = "--Style_3--",
|
|
sComponentName = "CanvasGroup"
|
|
},
|
|
img_head = {sComponentName = "Image"},
|
|
tmp_SpeakerName = {
|
|
sComponentName = "RubyTextMeshProUGUI"
|
|
},
|
|
tmp_Content3 = {
|
|
sComponentName = "RubyTextMeshProUGUI"
|
|
},
|
|
cgContent3 = {
|
|
sNodeName = "tmp_Content3",
|
|
sComponentName = "CanvasGroup"
|
|
},
|
|
trRoot = {
|
|
sNodeName = "----SafeAreaRoot----",
|
|
sComponentName = "Transform"
|
|
},
|
|
trStyleRoot_1 = {
|
|
sNodeName = "--Style_1--",
|
|
sComponentName = "Transform"
|
|
},
|
|
trStyleRoot_2 = {
|
|
sNodeName = "--Style_2--",
|
|
sComponentName = "Transform"
|
|
},
|
|
trStyleRoot_3 = {
|
|
sNodeName = "--Style_3--",
|
|
sComponentName = "Transform"
|
|
}
|
|
}
|
|
AvgBubbleCtrl._mapEventConfig = {
|
|
[EventId.AvgBubbleShutDown] = "CloseBubble",
|
|
[EventId.PasueAvgBubble] = "OnEvent_Pause"
|
|
}
|
|
function AvgBubbleCtrl:OnEnable()
|
|
self.tbRawIndex = {}
|
|
self.tbEachGridHeight = {}
|
|
self.tbEachGridBgWidth = {}
|
|
self.nCurRawDataIndex = 0
|
|
self.nAllCount = #self._panel.tbAvgBBCmdCfg
|
|
self.nTIME = 0
|
|
self.timer = nil
|
|
self.v3Scale = Vector3(0.8, 0.8, 0.8)
|
|
self.sAvgId = self._panel.sAvgId
|
|
self.sGroupId = self._panel.sGroupId
|
|
self.bRun = true
|
|
self.bPause = false
|
|
if self._panel.nBubbleType == 1 then
|
|
EventManager.Hit(EventId.MoveAvgBubbleRoot, self._mapNode.trStyleRoot_1)
|
|
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cg1, 1)
|
|
self:PopupBubble()
|
|
elseif self._panel.nBubbleType == 2 then
|
|
EventManager.Hit(EventId.MoveAvgBubbleRoot, self._mapNode.trStyleRoot_2)
|
|
self._mapNode.cg2:DOFade(1, 0.2):SetUpdate(true)
|
|
self:ShowAvgBubbleInPrologue()
|
|
elseif self._panel.nBubbleType == 3 then
|
|
EventManager.Hit(EventId.MoveAvgBubbleRoot, self._mapNode.trStyleRoot_3)
|
|
self:PopupBubble3()
|
|
end
|
|
end
|
|
function AvgBubbleCtrl:OnDisable()
|
|
if self.bRun == true then
|
|
self:CloseBubble(true)
|
|
end
|
|
end
|
|
function AvgBubbleCtrl:_GetAvgCharName(sAvgCharId)
|
|
if self.tbAvgCharacter == nil then
|
|
self.sAvgCharacterPath = GetAvgLuaRequireRoot(self._panel.nCurLanguageIdx) .. "Preset/AvgCharacter"
|
|
local tbAvgChar = require(self.sAvgCharacterPath)
|
|
self.tbAvgCharacter = {}
|
|
for i, v in ipairs(tbAvgChar) do
|
|
self.tbAvgCharacter[v.id] = v.name
|
|
end
|
|
end
|
|
local sName = self.tbAvgCharacter[sAvgCharId]
|
|
if type(sName) == "string" then
|
|
return sName
|
|
else
|
|
return sAvgCharId
|
|
end
|
|
end
|
|
function AvgBubbleCtrl:_ClearAvgCharName()
|
|
if self.tbAvgCharacter ~= nil and self.sAvgCharacterPath ~= nil then
|
|
self.tbAvgCharacter = nil
|
|
package.loaded[self.sAvgCharacterPath] = nil
|
|
self.sAvgCharacterPath = nil
|
|
end
|
|
end
|
|
function AvgBubbleCtrl:CloseBubble(bCovered)
|
|
self.bRun = false
|
|
if self.timer ~= nil then
|
|
self.timer:Cancel()
|
|
self.timer = nil
|
|
end
|
|
if self.sequence ~= nil then
|
|
self.sequence:Kill()
|
|
self.sequence = nil
|
|
end
|
|
WwiseAudioMgr:WwiseVoice_StopInAVG()
|
|
if bCovered == true then
|
|
self:EndAvgBubble(true)
|
|
else
|
|
self._mapNode.cg1:DOFade(0, 0.2):SetUpdate(true)
|
|
self._mapNode.cg2:DOFade(0, 0.2):SetUpdate(true)
|
|
self._mapNode.cg3:DOFade(0, 0.2):SetUpdate(true)
|
|
self:AddTimer(1, 0.2, "EndAvgBubble", true, true, true)
|
|
end
|
|
self:_ClearAvgCharName()
|
|
end
|
|
function AvgBubbleCtrl:EndAvgBubble(bCovered)
|
|
if self._panel.nBubbleType == 1 then
|
|
if self._mapNode.trStyleRoot_1 ~= nil and self._mapNode.trStyleRoot_1:IsNull() == false then
|
|
self._mapNode.trStyleRoot_1:SetParent(self._mapNode.trRoot)
|
|
end
|
|
elseif self._panel.nBubbleType == 2 then
|
|
if self._mapNode.trStyleRoot_2 ~= nil and self._mapNode.trStyleRoot_2:IsNull() == false then
|
|
self._mapNode.trStyleRoot_2:SetParent(self._mapNode.trRoot)
|
|
end
|
|
elseif self._panel.nBubbleType == 3 and self._mapNode.trStyleRoot_3 ~= nil and self._mapNode.trStyleRoot_3:IsNull() == false then
|
|
self._mapNode.trStyleRoot_3:SetParent(self._mapNode.trRoot)
|
|
end
|
|
if bCovered ~= true then
|
|
EventManager.Hit(EventId.AvgBubbleExit)
|
|
end
|
|
NovaAPI.DispatchEventWithData("AVG_BB_END", nil, string.format("%s|%s", self.sAvgId, tostring(self.sGroupId)))
|
|
end
|
|
function AvgBubbleCtrl:OnEvent_Pause(bPause)
|
|
self.bPause = bPause
|
|
if self.bPause == true then
|
|
elseif self.timer == nil then
|
|
local tb = {
|
|
"PopupBubble",
|
|
"ShowAvgBubbleInPrologue",
|
|
"PopupBubble3"
|
|
}
|
|
local sFuncName = tb[self._panel.nBubbleType]
|
|
local func = self[sFuncName]
|
|
if type(func) == "function" then
|
|
func(self)
|
|
end
|
|
end
|
|
end
|
|
function AvgBubbleCtrl:PopupBubble()
|
|
self.nCurRawDataIndex = self.nCurRawDataIndex + 1
|
|
if self.nCurRawDataIndex > self.nAllCount then
|
|
self:CloseBubble()
|
|
return
|
|
end
|
|
local data = self._panel.tbAvgBBCmdCfg[self.nCurRawDataIndex]
|
|
local sContent = ProcAvgTextContentFallback(self._panel.sTxtLan, self._panel.sVoLan, self._panel.bIsPlayerMale, data.param[3], data.param[6], data.param[9], data.param[10])
|
|
sContent = ProcAvgTextContent(sContent, self._panel.nCurLanguageIdx)
|
|
local sVoiceName = data.param[5]
|
|
local nW, nH = self:_CalcWidthAndHeight(sContent)
|
|
table.insert(self.tbEachGridBgWidth, 1, nW)
|
|
table.insert(self.tbEachGridHeight, 1, nH)
|
|
table.insert(self.tbRawIndex, 1, self.nCurRawDataIndex)
|
|
self._mapNode.LSV:InitAvgBubble(self.tbEachGridHeight, self, self.RefreshBubbleGrid)
|
|
if type(sVoiceName) == "string" and sVoiceName ~= "" then
|
|
WwiseAudioMgr:WwiseVoice_PlayInAVG(sVoiceName)
|
|
else
|
|
self.nTIME = CalcTextAnimDuration(sContent, self._panel.nCurLanguageIdx, true)
|
|
if self.timer ~= nil then
|
|
self.timer:Cancel()
|
|
self.timer = nil
|
|
end
|
|
self.timer = self:AddTimer(1, self.nTIME, "PopupBubble", true, false, true)
|
|
end
|
|
end
|
|
function AvgBubbleCtrl:RefreshBubbleGrid(goGrid, gridIndex)
|
|
local nLayoutIndex = gridIndex
|
|
if nLayoutIndex == nil then
|
|
return
|
|
end
|
|
nLayoutIndex = nLayoutIndex + 1
|
|
local nRawDataIndex = self.tbRawIndex[nLayoutIndex]
|
|
local paramData = self._panel.tbAvgBBCmdCfg[nRawDataIndex].param
|
|
local trScale = goGrid.transform:GetChild(0)
|
|
if 2 < nLayoutIndex then
|
|
trScale.localScale = self.v3Scale
|
|
elseif nLayoutIndex < 2 then
|
|
trScale.localScale = Vector3.one
|
|
else
|
|
trScale.localScale = Vector3.one
|
|
trScale:DOScale(self.v3Scale, 0.2):SetUpdate(true)
|
|
end
|
|
local cgScale = trScale:GetComponent("CanvasGroup")
|
|
if 3 < nLayoutIndex then
|
|
NovaAPI.SetCanvasGroupAlpha(cgScale, 0)
|
|
elseif nLayoutIndex < 3 then
|
|
NovaAPI.SetCanvasGroupAlpha(cgScale, 1)
|
|
else
|
|
NovaAPI.SetCanvasGroupAlpha(cgScale, 1)
|
|
cgScale:DOFade(0, 0.2):SetUpdate(true)
|
|
end
|
|
self:SetAvgCharHeadIcon(trScale:Find("imgSpeaker"):GetComponent("Image"), AdjustMainRoleAvgCharId(paramData[1]), paramData[2])
|
|
local trTMP = trScale:Find("rubyTmp")
|
|
local sContent = ProcAvgTextContentFallback(self._panel.sTxtLan, self._panel.sVoLan, self._panel.bIsPlayerMale, paramData[3], paramData[6], paramData[9], paramData[10])
|
|
sContent = ProcAvgTextContent(sContent, self._panel.nCurLanguageIdx)
|
|
NovaAPI.SetText_RubyTMP(trTMP:GetComponent("RubyTextMeshProUGUI"), ProcAvgTextContent(sContent, self._panel.nCurLanguageIdx))
|
|
local rtTMP = trTMP:GetComponent("RectTransform")
|
|
LayoutRebuilder.ForceRebuildLayoutImmediate(rtTMP)
|
|
local nH = self.tbEachGridHeight[nLayoutIndex]
|
|
trScale:Find("imgBg"):GetComponent("RectTransform").sizeDelta = Vector2(self.tbEachGridBgWidth[nLayoutIndex], nH - 4)
|
|
goGrid:GetComponent("RectTransform").sizeDelta = Vector2(800, nH)
|
|
end
|
|
function AvgBubbleCtrl:_CalcWidthAndHeight(sContent)
|
|
local nBgWidth = 0
|
|
local nGridHeight = 0
|
|
NovaAPI.SetText_RubyTMP(self._mapNode.TMP, sContent)
|
|
LayoutRebuilder.ForceRebuildLayoutImmediate(self._mapNode.rtTMP)
|
|
nBgWidth = self._mapNode.rtTMP.rect.width + 88
|
|
if self._mapNode.rtTMP.rect.height > 100 then
|
|
nGridHeight = self._mapNode.rtTMP.rect.height + 40
|
|
end
|
|
if nBgWidth < 120 then
|
|
nBgWidth = 120
|
|
end
|
|
if nGridHeight < 110 then
|
|
nGridHeight = 110
|
|
end
|
|
return nBgWidth, nGridHeight
|
|
end
|
|
function AvgBubbleCtrl:ShowAvgBubbleInPrologue()
|
|
self.nCurRawDataIndex = self.nCurRawDataIndex + 1
|
|
if self.nCurRawDataIndex > self.nAllCount then
|
|
self:CloseBubble()
|
|
return
|
|
end
|
|
local paramData = self._panel.tbAvgBBCmdCfg[self.nCurRawDataIndex].param
|
|
NovaAPI.SetText_RubyTMP(self._mapNode.txtName, self:_GetAvgCharName(paramData[1]))
|
|
local sContent = ProcAvgTextContentFallback(self._panel.sTxtLan, self._panel.sVoLan, self._panel.bIsPlayerMale, paramData[3], paramData[6], paramData[9], paramData[10])
|
|
sContent = ProcAvgTextContent(sContent, self._panel.nCurLanguageIdx)
|
|
local sVoiceName = paramData[5]
|
|
NovaAPI.SetText_RubyTMP(self._mapNode.tmp_Content, sContent)
|
|
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgContent, 0)
|
|
self._mapNode.cgContent:DOFade(1, 0.3):SetUpdate(true)
|
|
if type(sVoiceName) == "string" and sVoiceName ~= "" then
|
|
WwiseAudioMgr:WwiseVoice_PlayInAVG(sVoiceName)
|
|
else
|
|
self.nTIME = CalcTextAnimDuration(sContent, self._panel.nCurLanguageIdx, true)
|
|
if self.timer ~= nil then
|
|
self.timer:Cancel()
|
|
self.timer = nil
|
|
end
|
|
self.timer = self:AddTimer(1, self.nTIME, "ShowAvgBubbleInPrologue", true, false, true)
|
|
end
|
|
end
|
|
function AvgBubbleCtrl:PopupBubble3()
|
|
if self.timer ~= nil then
|
|
self.timer:Cancel()
|
|
self.timer = nil
|
|
end
|
|
if self.bPause == true then
|
|
return
|
|
end
|
|
self.nCurRawDataIndex = self.nCurRawDataIndex + 1
|
|
if self.nCurRawDataIndex > self.nAllCount then
|
|
self:CloseBubble()
|
|
return
|
|
end
|
|
local param = self._panel.tbAvgBBCmdCfg[self.nCurRawDataIndex].param
|
|
local sAvgCharId = param[1]
|
|
sAvgCharId = AdjustMainRoleAvgCharId(sAvgCharId)
|
|
local sContent = ProcAvgTextContentFallback(self._panel.sTxtLan, self._panel.sVoLan, self._panel.bIsPlayerMale, param[3], param[6], param[9], param[10])
|
|
sContent = ProcAvgTextContent(sContent, self._panel.nCurLanguageIdx)
|
|
local sVoiceName = param[5]
|
|
local sSpName = param[7]
|
|
local sName
|
|
if type(sSpName) == "string" and sSpName ~= "" then
|
|
sName = sSpName
|
|
elseif sAvgCharId == "avg3_100" or sAvgCharId == "avg3_101" then
|
|
sName = PlayerData.Base:GetPlayerNickName()
|
|
else
|
|
sName = self:_GetAvgCharName(sAvgCharId)
|
|
end
|
|
local bShadowMask = param[8] == 1
|
|
local func_ReSetBubble = function()
|
|
self:SetAvgCharHeadIconByPrefab(self._mapNode.img_head, string.format("Icon/AvgHead/%s/%s_GD.prefab", sAvgCharId, sAvgCharId))
|
|
NovaAPI.SetEnable_Gradient2(self._mapNode.img_head.gameObject, bShadowMask)
|
|
NovaAPI.SetText_RubyTMP(self._mapNode.tmp_SpeakerName, sName)
|
|
NovaAPI.SetText_RubyTMP(self._mapNode.tmp_Content3, sContent)
|
|
end
|
|
self.sequence = DOTween.Sequence()
|
|
local bSameSpeaker = self.sPreSpeakerAvgCharId == sAvgCharId
|
|
if bSameSpeaker == true then
|
|
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cg3, 1)
|
|
self.sequence:Append(self._mapNode.cgContent3:DOFade(0, 0.2):SetUpdate(true))
|
|
self.sequence:AppendCallback(dotween_callback_handler(self, func_ReSetBubble))
|
|
self.sequence:Append(self._mapNode.cgContent3:DOFade(1, 0.2):SetUpdate(true))
|
|
else
|
|
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgContent3, 1)
|
|
self.sequence:Append(self._mapNode.cg3:DOFade(0, 0.2):SetUpdate(true))
|
|
self.sequence:AppendCallback(dotween_callback_handler(self, func_ReSetBubble))
|
|
self.sequence:Append(self._mapNode.cg3:DOFade(1, 0.2):SetUpdate(true))
|
|
end
|
|
local cb = function()
|
|
self.sequence = nil
|
|
end
|
|
self.sequence.onComplete = dotween_callback_handler(self, cb)
|
|
self.sequence:SetUpdate(true)
|
|
self.sPreSpeakerAvgCharId = sAvgCharId
|
|
if type(sVoiceName) == "string" and sVoiceName ~= "" then
|
|
WwiseAudioMgr:WwiseVoice_PlayInAVG(sVoiceName)
|
|
self.nTIME = BubbleVoiceManager.GetVoResLen(sVoiceName) + 0.5
|
|
self.timer = self:AddTimer(1, self.nTIME, "PopupBubble3", true, false, true)
|
|
else
|
|
self.nTIME = CalcTextAnimDuration(sContent, self._panel.nCurLanguageIdx, true)
|
|
self.timer = self:AddTimer(1, self.nTIME, "PopupBubble3", true, false, true)
|
|
end
|
|
end
|
|
return AvgBubbleCtrl
|