using System; using Data; using Managers; using Newtonsoft.Json; using UnityEngine; // Unity 环境使用 UnityEngine.Color 和 Debug.Log namespace EventWorkClass { /// /// 表示消息事件的配置数据结构,从 JSON 反序列化而来。 /// public class MessageData { /// /// 要显示的消息内容。这是必填字段。 /// [JsonProperty("message", Required = Required.Always)] public string Message { get; set; } /// /// 消息的显示类别,决定了消息在UI中的呈现方式。这是必填字段。 /// [JsonProperty("type", Required = Required.Always)] public PromptDisplayCategory Type { get; set; } /// /// 消息的颜色,可以是一个HTML颜色字符串(例如"#RRGGBB"或"#RRGGBBAA")。可选。 /// [JsonProperty("color")] public string ColorHex { get; set; } /// /// 消息的显示时长(秒)。可选,如果未指定,将使用 DisplayMessage API 的默认值。 /// [JsonProperty("showTime")] public float? ShowTime { get; set; } } /// /// 一个继承自 EventWorkClassBase 的类,用于处理在游戏中显示消息的事件。 /// 通过 JSON 配置来指定消息内容、显示方式、颜色和时长。 /// public class Event_MessageWorkClass : EventWorkClassBase { private MessageData _messageData; private Color? _parsedColor; // 存储解析后的 UnityEngine.Color /// /// 初始化消息工作类。通过解析 JSON 字符串来配置消息显示参数。 /// JSON 必须包含 "message" 和 "type" 字段,可以可选地包含 "color" 和 "showTime"。 /// /// 包含消息显示配置的 JSON 字符串。 /// 当 JSON 字符串为空或null时抛出。 /// 当 JSON 字符串格式不正确时抛出。 /// 当 JSON 中缺少必要的字段或颜色解析失败时抛出。 public override void Init(string value) { if (string.IsNullOrWhiteSpace(value)) throw new ArgumentNullException(nameof(value), "Event_MessageWorkClass 初始化 JSON 不能为空。"); try { _messageData = JsonConvert.DeserializeObject(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')。"); } } } /// /// 执行消息显示操作。 /// /// 当前维度ID,此事件通常不直接使用,但作为 EventWorkClassBase 的Run方法签名。 /// 触发此事件的实体,此事件通常不直接使用,但作为 EventWorkClassBase 的Run方法签名。 /// 当类未初始化时抛出。 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 ); } } }