mirror of
http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite.git
synced 2025-11-20 06:47:14 +08:00
Co-authored-by: m0_75251201 <m0_75251201@noreply.gitcode.com> Reviewed-on: http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite/pulls/60
116 lines
5.3 KiB
C#
116 lines
5.3 KiB
C#
using System;
|
||
using Data;
|
||
using Managers;
|
||
using Newtonsoft.Json;
|
||
using UnityEngine;
|
||
|
||
// Unity 环境使用 UnityEngine.Color 和 Debug.Log
|
||
|
||
namespace EventWorkClass
|
||
{
|
||
/// <summary>
|
||
/// 表示消息事件的配置数据结构,从 JSON 反序列化而来。
|
||
/// </summary>
|
||
public class MessageData
|
||
{
|
||
/// <summary>
|
||
/// 要显示的消息内容。这是必填字段。
|
||
/// </summary>
|
||
[JsonProperty("message", Required = Required.Always)]
|
||
public string Message { get; set; }
|
||
|
||
/// <summary>
|
||
/// 消息的显示类别,决定了消息在UI中的呈现方式。这是必填字段。
|
||
/// </summary>
|
||
[JsonProperty("type", Required = Required.Always)]
|
||
public PromptDisplayCategory Type { get; set; }
|
||
|
||
/// <summary>
|
||
/// 消息的颜色,可以是一个HTML颜色字符串(例如"#RRGGBB"或"#RRGGBBAA")。可选。
|
||
/// </summary>
|
||
[JsonProperty("color")]
|
||
public string ColorHex { get; set; }
|
||
|
||
/// <summary>
|
||
/// 消息的显示时长(秒)。可选,如果未指定,将使用 DisplayMessage API 的默认值。
|
||
/// </summary>
|
||
[JsonProperty("showTime")]
|
||
public float? ShowTime { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 一个继承自 EventWorkClassBase 的类,用于处理在游戏中显示消息的事件。
|
||
/// 通过 JSON 配置来指定消息内容、显示方式、颜色和时长。
|
||
/// </summary>
|
||
public class Event_MessageWorkClass : EventWorkClassBase
|
||
{
|
||
private MessageData _messageData;
|
||
private Color? _parsedColor; // 存储解析后的 UnityEngine.Color
|
||
|
||
/// <summary>
|
||
/// 初始化消息工作类。通过解析 JSON 字符串来配置消息显示参数。
|
||
/// JSON 必须包含 "message" 和 "type" 字段,可以可选地包含 "color" 和 "showTime"。
|
||
/// </summary>
|
||
/// <param name="value">包含消息显示配置的 JSON 字符串。</param>
|
||
/// <exception cref="ArgumentNullException">当 JSON 字符串为空或null时抛出。</exception>
|
||
/// <exception cref="JsonSerializationException">当 JSON 字符串格式不正确时抛出。</exception>
|
||
/// <exception cref="InvalidOperationException">当 JSON 中缺少必要的字段或颜色解析失败时抛出。</exception>
|
||
public override void Init(string value)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(value))
|
||
throw new ArgumentNullException(nameof(value), "Event_MessageWorkClass 初始化 JSON 不能为空。");
|
||
|
||
try
|
||
{
|
||
_messageData = JsonConvert.DeserializeObject<MessageData>(value);
|
||
}
|
||
catch (JsonException ex)
|
||
{
|
||
throw new JsonSerializationException(
|
||
"Event_MessageWorkClass 配置 JSON 反序列化失败。请检查 JSON 格式,尤其是枚举值。", ex
|
||
);
|
||
}
|
||
|
||
// 反序列化后进行业务逻辑验证
|
||
if (_messageData == null) throw new InvalidOperationException("消息数据无法反序列化。结果对象为空。");
|
||
|
||
if (string.IsNullOrWhiteSpace(_messageData.Message))
|
||
throw new InvalidOperationException("消息配置缺少必需字段 'message'。");
|
||
|
||
// 解析颜色字符串(如果存在)
|
||
if (!string.IsNullOrWhiteSpace(_messageData.ColorHex))
|
||
{
|
||
if (ColorUtility.TryParseHtmlString(_messageData.ColorHex, out var parsedColor))
|
||
{
|
||
_parsedColor = parsedColor;
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError(
|
||
$"[Event_MessageWorkClass] 无法解析消息颜色十六进制字符串 '{_messageData.ColorHex}'。请使用有效的 HTML 颜色格式(例如 '#RRGGBB' 或 '#RRGGBBAA')。");
|
||
throw new InvalidOperationException(
|
||
$"无法解析消息颜色十六进制字符串 '{_messageData.ColorHex}'。请使用有效的 HTML 颜色格式(例如 '#RRGGBB' 或 '#RRGGBBAA')。");
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 执行消息显示操作。
|
||
/// </summary>
|
||
/// <param name="dimensionID">当前维度ID,此事件通常不直接使用,但作为 EventWorkClassBase 的Run方法签名。</param>
|
||
/// <param name="initiator">触发此事件的实体,此事件通常不直接使用,但作为 EventWorkClassBase 的Run方法签名。</param>
|
||
/// <exception cref="InvalidOperationException">当类未初始化时抛出。</exception>
|
||
public override void Run(string dimensionID, Entity.Entity initiator = null)
|
||
{
|
||
// 确保 Init 方法已经成功调用
|
||
if (_messageData == null) throw new InvalidOperationException("Event_MessageWorkClass 尚未初始化。请先调用 Init()。");
|
||
|
||
MessageManager.Instance.DisplayMessage(
|
||
_messageData.Message,
|
||
_messageData.Type,
|
||
_parsedColor, // 直接传递解析后的Color?
|
||
_messageData.ShowTime.GetValueOrDefault(3f) // 如果 ShowTime 为 null,则使用 3f
|
||
);
|
||
}
|
||
}
|
||
} |