315 lines
11 KiB
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
|
|
|
|
|
|
|
|
|
|
|