mirror of
http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite.git
synced 2025-11-20 00:57: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
109 lines
4.9 KiB
C#
109 lines
4.9 KiB
C#
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);
|
||
}
|
||
}
|
||
} |