NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Dialogue/DialogueManager.cs

212 lines
6.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using cfg.DialogueCfg;
using Cysharp.Threading.Tasks;
using Framework;
using Gameplay;
using PhxhSDK;
using System;
using System.Collections.Generic;
using Random = UnityEngine.Random;
/// <summary>
/// 台词管理器
/// </summary>
public class DialogueManager : Singlenton<DialogueManager>, IInitable
{
/// <summary>
/// 台词配置数据key角色id, value台词配置数据
/// </summary>
private Dictionary<int, List<DataDialogueCfg>> dicDialogueData;
/// <summary>
/// 是否初始化
/// </summary>
private bool isInit;
#region 临时数据
/// <summary>
/// 符合条件的台词数据
/// </summary>
private readonly List<DataDialogueCfg> listDicDialogueData = new();
#endregion
public void Init()
{
isInit = false;
dicDialogueData = new();
EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, InitData);
}
public void Release()
{
EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, InitData);
isInit = false;
dicDialogueData.Clear();
dicDialogueData = null;
}
/// <summary>
/// 播放台词
/// </summary>
/// <param name="roleId"></param>
/// <param name="dialogueType"></param>
public async UniTask<Audio> PlayDiaogue(int roleId, E_DialogueType dialogueType)
{
if (!isInit)
{
DebugUtil.LogError("数据未初始化");
return null;
}
#region 获取需要播放的台词
if (!dicDialogueData.TryGetValue(roleId, out List<DataDialogueCfg> listCfg))
{
DebugUtil.LogError("没有该角色的台词数据");
return null;
}
listDicDialogueData.Clear();
int minPriority = int.MaxValue; // 值越小优先级越高
foreach (DataDialogueCfg cfg in listCfg)
{
if (cfg.Priority > minPriority) // 优先级不足,排除
continue;
if (!cfg.DialogueType.Contains(dialogueType)) // 不是所需类型,排除
continue;
if (!IsCheckValid(roleId, cfg)) // 条件不满足,排除
continue;
if (cfg.Priority < minPriority)
{
minPriority = cfg.Priority;
listDicDialogueData.Clear();
}
listDicDialogueData.Add(cfg);
}
#endregion
if (listDicDialogueData.Count <= 0)
{
DebugUtil.LogError("没有满足条件要播放的台词");
return null;
}
DataDialogueCfg playCfg = listDicDialogueData[Random.Range(0, listDicDialogueData.Count)];
DebugUtil.Log($"播放台词{playCfg.DialogueId}, 优先级{playCfg.Priority}");
int audioId = await AudioManager.Instance.PlayAudio(playCfg.Voice);
return AudioManager.Instance.GetAudioByID(AudioType.SOUND, audioId);
}
/// <summary>
/// 根据类型获取可以播放的台词数据
/// </summary>
/// <param name="dialogueType"></param>
/// <returns></returns>
public List<DataDialogueCfg> GetDialogueDataByType(E_DialogueType dialogueType)
{
return null;
}
/// <summary>
/// 检查台词是否有效
/// </summary>
/// <returns></returns>
private bool IsCheckValid(int roleId, DataDialogueCfg dataDialogueCfg)
{
foreach (E_DialogueType dialogueType in dataDialogueCfg.DialogueType)
{
if (!IsCheckValidByOne(roleId, dialogueType))
return false;
}
return true;
}
/// <summary>
/// 检查个单个条件是否有效
/// </summary>
/// <param name="roleId"></param>
/// <param name="dataDialogueCfg"></param>
/// <returns></returns>
private bool IsCheckValidByOne(int roleId, E_DialogueType dialogueType)
{
switch (dialogueType)
{
case E_DialogueType.Morning: // 上午
{
DateTime dateTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server);
return dateTime.Hour >= 6 && dateTime.Hour < 16;
}
case E_DialogueType.Afternoon:
{
DateTime dateTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server);
return dateTime.Hour >= 16 && dateTime.Hour < 21;
}
case E_DialogueType.Evening:
{
DateTime dateTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server);
return dateTime.Hour >= 21 && dateTime.Hour < 23;
}
case E_DialogueType.Midnight:
{
DateTime dateTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server);
return dateTime.Hour < 6 || dateTime.Hour >= 23;
}
case E_DialogueType.PlayerBirthday:
{
DebugUtil.LogWarning("记录一下,等待处理");
return false; // Todo
}
case E_DialogueType.KanbanbanBirthday:
{
DebugUtil.LogWarning("记录一下,等待处理");
return false; // Todo
}
case E_DialogueType.Fetters:
{
DebugUtil.LogWarning("记录一下,等待处理");
return false; // Todo
}
case E_DialogueType.Awaken:
{
CharacterDataInfo characterDataInfo = CharacterDataInfoManager.Instance.GetCharacterInfo((uint)roleId);
if (characterDataInfo == null)
{
DebugUtil.LogError("未获取到角色");
return false;
}
return characterDataInfo.IsMaxAwake(); // 是否满觉醒
}
default: // 其余条件默认满足
return true;
}
}
/// <summary>
/// 初始化数据
/// </summary>
private void InitData()
{
if (isInit)
return;
foreach (DataDialogueCfg data in TableManager.Instance.Tables.DialogueConfig.DataList)
{
if (!dicDialogueData.TryGetValue(data.Id, out List<DataDialogueCfg> list))
{
list = new List<DataDialogueCfg>();
dicDialogueData[data.Id] = list;
}
list.Add(data);
}
isInit = true;
}
}