Files
StellaSora_DataLua/lua/game/ui/avgbubble/avgbubblectrl.lua
T
SL1900 1714dcc21d Hotfix - 1.4.0.74
EN: 1.4.0.74
CN: 1.4.0.75
JP: 1.4.0.78
KR: 1.4.0.81
2025-12-26 17:30:00 +09:00

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