212 lines
6.5 KiB
C#
212 lines
6.5 KiB
C#
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;
|
||
}
|
||
} |