miduo_client/Assets/ManagedResources/~Lua/Modules/Story/StoryManager.lua

315 lines
11 KiB
Lua

-- 剧情管理类, 包含副本以及关卡剧情
StoryManager = {};
local this = StoryManager
local chapterDataConfig = ConfigManager.GetConfig(ConfigName.ChapterEventPointConfig)
local chapterOptionData = ConfigManager.GetConfig(ConfigName.ChapterOptionConfig)
local chapterTitleData = ConfigManager.GetConfig(ConfigName.LevelSetting)
local dialogueSetData = ConfigManager.GetConfig(ConfigName.DialogueViewConfig)
-- 当前对话的大关卡ID
this.curAreaID = 0
local lastResName
local lastLive2d
--- 男主立绘
this.boyRes = "live2d_npc_boy"
--- 女主立绘
this.bitchRes = "live2d_npc_girl"
function this.Initialize()
end
-- 根据剧情传入的事件ID打开对应的对话面板
function this.EventTrigger(eventId, callBack)
MyPCall(function()
if not eventId then
Log("传入的ID不存在")
return
end
local showType = chapterDataConfig[eventId].ShowType
local showValues = GetLanguageStrById(chapterDataConfig[eventId].ShowValues)
local options = chapterDataConfig[eventId].Option
if showType and showValues and options then
-- 如果是第一次打开,则打开开幕界面
if showType == 11 then -- 对话界面
if callBack then
UIManager.OpenPanel(UIName.StoryDialoguePanel, eventId, false, callBack)
else
UIManager.OpenPanel(UIName.StoryDialoguePanel, eventId, false)
end
elseif showType == 12 then -- 选择界面
UIManager.OpenPanel(UIName.StoryDialoguePanel, eventId, false)
--UIManager.OpenPanel(UIName.StoryOptionPopup, eventId)
elseif showType == 10 then -- 起名字界面
UIManager.OpenPanel(UIName.CreateNamePopup, showType, eventId, showValues, options)
end
else
Log("表数据不存在!!请检查表格!")
end
end)
end
--- 对话剧情触发
function this.DialogueTrigger(eventId, callback)
MyPCall(function()
if not eventId then
Log("传入的ID不存在")
return
end
local showType = chapterDataConfig[eventId].ShowType
--- 对话弹窗
if showType == 13 then
if callback then
UIManager.OpenPanel(UIName.DialoguePopup, eventId, callback)
else
UIManager.OpenPanel(UIName.DialoguePopup, eventId)
end
end
end)
end
-- 剧情跳转
function this.StoryJumpType(optionId, panel)
Log("OptionId " .. optionId)
local jumpType = chapterOptionData[optionId].JumpType
if jumpType then
if jumpType == 4 then -- 关闭所有界面,结束对话
panel:ClosePanel()
if UIManager.IsOpen(UIName.StoryDialoguePanel) then
UIManager.ClosePanel(UIName.StoryDialoguePanel)
end
elseif jumpType == 1 then -- 继续对话,往下跳转
local nextEventId = chapterOptionData[optionId].JumpTypeValues
local nextEventShowType = chapterDataConfig[nextEventId].ShowType
if nextEventShowType ~= 13 then
this.EventTrigger(nextEventId, false)
else
this.DialogueTrigger(nextEventId)
end
end
end
end
-- 返回当前关卡的标题
function this.GetTitle()
local str = ""
str = chapterTitleData[this.curAreaID].Title
return str
end
-- ============================= 人物对话控制 =================================== --
-- 加载人物立绘并设置初始状态, 是否需要加载一次立绘
function this.InitLive2dState(setId, resPath, live2dRoot, effectRoot, isNeedLoad, dialoguePanel)
-- 没有配置数据,直接返回
local setData = dialogueSetData[setId]
if not setData then return end
this.SetLive2dState(setData, isNeedLoad, resPath, live2dRoot, effectRoot, dialoguePanel)
end
-- 设置立绘的大小位置,入场动画以及是否抖动
function this.SetLive2dState(setData, isNeedLoad, resPath, live2dRoot, effectRoot, dialoguePanel)
-- 加载立绘之前清空
ClearChild(live2dRoot)
-- 立绘的位置大小
local scale = 0
local position = Vector3.New(0,0,0)
scale = setData.Scale
position = Vector3(setData.Position[1], setData.Position[2], 0)
if resPath == this.bitchRes then
position = Vector3.New(0, -250, 0)
scale = 0.5
end
-- 设置立绘最终大小位置
local go
if not resPath or resPath == "" then Log(Language[11921]) return end
go = poolManager:LoadLive(resPath, live2dRoot.transform, Vector3.one * scale, position)
if not go then Log(Language[11922]) return end
lastLive2d = go
-- 是否播放入场动画
local isPlay = true
if isNeedLoad then
isPlay = setData.isSkipShow == 1
local shakeTime = setData.ShakeTime
local shakeDis = setData.ShakeScale
local isNeedShake = setData.IsShake == 1
local ainIndex = setData.Animation
this.InitAnim(go)
if isPlay and isNeedShake then -- 震动,入场动画
PlayUIAnim(live2dRoot, function ()
this.SetShake(go, shakeTime, shakeDis[1], shakeDis[2], function ()
this.SetLive2dAnim(go, ainIndex, 0, setData, effectRoot, dialoguePanel)
Log("振动入场动画")
end)
end)
elseif isPlay and not isNeedShake then -- 入场动画无震动
PlayUIAnim(live2dRoot, function ()
this.SetLive2dAnim(go, ainIndex, 0, setData, effectRoot, dialoguePanel)
Log("入场动画")
end)
elseif not isPlay and isNeedShake then -- 震动无入场动画
this.SetShake(go, shakeTime, shakeDis[1], shakeDis[2], function ()
this.SetLive2dAnim(go, ainIndex, 0, setData, effectRoot, dialoguePanel)
Log("振动")
end)
elseif not isPlay and not isNeedShake then -- 都没有
this.SetLive2dAnim(go, ainIndex, 0, setData, effectRoot, dialoguePanel)
Log("啥都没有!")
end
end
end
-- 设置图片以及表现
function this.InitImgState(setId, imgRoot, effectRoot)
-- 没有配置数据,直接返回
local setData = dialogueSetData[setId]
if not setData then return end
-- 设置需要显示的图片
local imgShowData = string.split(setData.isShowImage, "#")
local imgResId = tonumber(imgShowData[1])
local imgName = imgShowData[2]
Log(string.format("是否显示图片%s", imgResId))
local showImg = imgResId == 1
if not showImg then return end
local img = imgRoot:GetComponent("Image")
img.sprite = Util.LoadSprite(imgName)
img:SetNativeSize()
-- 设置图片大小位置
local scale = setData.imgSizeAndPos[1]
local position = Vector2.New(setData.imgSizeAndPos[2], setData.imgSizeAndPos[3])
imgRoot:GetComponent("RectTransform").anchoredPosition = position
imgRoot.transform.localScale = Vector3.one * scale
end
-- 清除特效
function this.InitEffect(effectRoot)
if lastResName then
if effectRoot then
ClearChild(effectRoot)
end
lastResName = nil
end
end
--============================= 封装表现方法 =========================
-- 播放特效方法
local preLayer = 10
function this.PlayEffect(setData, effectRoot, dialoguePanel)
local effectData = string.split(setData.isPlayEffect, "#")
local isPlay = tonumber(effectData[1])
if isPlay == 1 then
local resName = effectData[2]
lastResName = resName
local effect = this.LoadEffect(effectRoot, resName)
--设置特效的位置方向
local pos = Vector2.New(setData.effectPos[2], setData.effectPos[3])
-- 黑人问号特殊处理
local dir = setData.effectPos[1] == 1 and 180 or 0
if resName == "UI_effect_emoji_3" then
effect.transform.localRotation = Vector4.New(0, 0, 0, 1)
local img = Util.GetGameObject(effect, "kuang")
img.transform.localRotation = Vector4.New(0, dir, 0, 1)
else
effect.transform.localRotation = Vector4.New(0, dir, 0, 1)
end
effect:GetComponent("RectTransform").anchoredPosition = pos
-- 设置特效层级
Util.AddParticleSortLayer(effectRoot, dialoguePanel.sortingOrder + preLayer)
preLayer = dialoguePanel.sortingOrder
end
end
-- 参数:object 抖动物体 timeScale 震动时长 dx, dy震动偏移量
function this.SetShake(object, timeScale, dx, dy, callBack)
if not timeScale or timeScale == 0 then
timeScale = 0.2
end
if not dx or not dy or dy == 0 and dx == 0 then
dx = 10
dy = 10
end
object:GetComponent("RectTransform"):DOShakeAnchorPos(timeScale, Vector2.New(dx, dy),
500, 90, true, true):OnComplete(function ()
if callBack then callBack() end
end)
end
-- 设置立绘动作
function this.SetLive2dAnim(object, ainIndex, delayTime, setData, effectRoot, dialoguePanel)
-- 木有立绘资源
if not object or not object.gameObject then return end
local skeletonAnim = object.gameObject:GetComponent("SkeletonGraphic")
if not skeletonAnim then return end
local animName = {
[1] = "idle",
[2] = "hit",
[3] = "attack",
[4] = "touch",
}
if not delayTime then delayTime = 0 end
if not skeletonAnim then Log(Language[11923]) return end
if animName[ainIndex] and ainIndex > 1 then -- idel状态不做处理
skeletonAnim.AnimationState:SetAnimation(delayTime, animName[ainIndex], false)
end
Log("播放立绘有的动作!")
-- 播放特效
this.PlayEffect(setData, effectRoot, dialoguePanel)
end
-- 设置立绘初始化动作
function this.InitAnim(go)
if not go then return end
local skeletonAnim = go:GetComponent("SkeletonGraphic")
local InitAnim = function() skeletonAnim.AnimationState:SetAnimation(0, "idle", true) end
skeletonAnim.AnimationState.Complete = skeletonAnim.AnimationState.Complete + InitAnim
end
-- 加载特效
function this.LoadEffect(effectParent, resName)
local go = poolManager:LoadAsset(resName, PoolManager.AssetType.GameObject)
go.transform:SetParent(effectParent.transform)
go.transform.localScale = Vector3.one
go.transform.position = effectParent.transform.position
go:SetActive(true)
return go
end
-- 卸载特效
function this.UnLoadEffect(resName, res)
poolManager:UnLoadAsset(resName, res, PoolManager.AssetType.GameObject)
end
return this