Files
Gen_Hack-and-Slash-Roguelite/Client/Assets/Scripts/EventWorkClass/Event_ItemGenerater.cs

109 lines
4.9 KiB
C#
Raw Normal View History

using System;
using Data;
using Managers;
using Newtonsoft.Json;
using UnityEngine;
namespace EventWorkClass
{
/// <summary>
/// 表示物品生成事件的配置数据结构,从 JSON 反序列化而来。
/// </summary>
public class ItemSpawnData
{
/// <summary>
/// 要生成的物品的定义名称 (例如:"IRON_SWORD")。这是必填字段。
/// </summary>
[JsonProperty("itemDefName", Required = Required.Always)]
public string ItemDefName { get; set; }
[JsonProperty("itemCount")] public int ItemCount { get; set; } = 1;
/// <summary>
/// 物品生成的绝对坐标。如果提供了此字段,将优先使用。
/// </summary>
[JsonProperty("position")]
public Vector3? Position { get; set; }
/// <summary>
/// 物品相对于事件触发者 (initiator) 的偏移坐标。
/// 只有当 initiator 存在且未指定 Position 时才使用。
/// </summary>
[JsonProperty("relativeOffset")]
public Vector3? RelativeOffset { get; set; }
}
/// <summary>
/// 一个继承自 EventWorkClassBase 的类,用于处理游戏世界中物品的生成。
/// 通过 JSON 配置来指定要生成的物品及其生成位置。
/// </summary>
public class Event_ItemGenerater : EventWorkClassBase
{
private ItemSpawnData _spawnData;
/// <summary>
/// 初始化物品生成工作类。通过解析 JSON 字符串来配置物品生成参数。
/// JSON 必须包含 "itemDefName" 字段,可以可选地包含 "position" 或 "relativeOffset"。
/// </summary>
/// <param name="value">包含物品生成配置的 JSON 字符串。</param>
/// <exception cref="ArgumentNullException">当 JSON 字符串为空或null时抛出。</exception>
/// <exception cref="JsonSerializationException">当 JSON 字符串格式不正确时抛出。</exception>
/// <exception cref="InvalidOperationException">当 JSON 中缺少必要的 "itemDefName" 字段时抛出。</exception>
public override void Init(string value)
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentNullException(nameof(value), "物品生成工作类的初始化JSON不能为空。");
try
{
_spawnData = JsonConvert.DeserializeObject<ItemSpawnData>(value);
}
catch (JsonException ex)
{
throw new JsonSerializationException(
"解析物品生成工作类配置JSON失败请检查JSON格式。", ex
);
}
if (_spawnData == null) throw new InvalidOperationException("物品生成数据无法反序列化。结果对象为null。");
if (string.IsNullOrWhiteSpace(_spawnData.ItemDefName))
throw new InvalidOperationException("物品生成配置缺少必填字段 'itemDefName'。");
}
/// <summary>
/// 执行物品生成操作。根据配置和initiator确定生成位置。
/// </summary>
/// <param name="dimensionID">物品生成的维度ID。</param>
/// <param name="initiator">触发此事件的实体,可用于相对定位。</param>
/// <exception cref="InvalidOperationException">
/// 当类未初始化、物品定义未找到或无法确定生成位置时抛出。
/// </exception>
public override void Run(string dimensionID, Entity.Entity initiator = null)
{
if (_spawnData == null) throw new InvalidOperationException("ItemSpawnWorkClass尚未初始化。请先调用Init()方法。");
// 查找物品定义
var itemDef = DefineManager.Instance.FindDefine<ItemDef>(_spawnData.ItemDefName);
if (itemDef == null)
throw new InvalidOperationException(
$"生成物品失败在DefineManager中未找到物品定义 '{_spawnData.ItemDefName}'。"
);
// 确定物品生成位置
Vector3 spawnPos;
if (_spawnData.Position.HasValue)
spawnPos = _spawnData.Position.Value;
else if (_spawnData.RelativeOffset.HasValue && initiator)
spawnPos = initiator.Position + _spawnData.RelativeOffset.Value;
else if (initiator)
spawnPos = initiator.Position;
else
throw new InvalidOperationException(
"无法确定物品生成位置。配置中未指定'position'或'relativeOffset',也未提供'initiator'实体作为默认位置。"
);
for (var i = 0; i < _spawnData.ItemCount; i++)
EntityManager.Instance.GeneratePickupEntity(dimensionID, itemDef, spawnPos);
}
}
}