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

109 lines
4.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}
}