迁移 EntityData 到 Base 中

- 新增 EntityDataFactory 工厂类,提供创建 EntityData 的统一入口
- 移出 EntityData 及派生类对 GameEntry 的依赖并移入 SepCore.Base 程序集中
This commit is contained in:
SepComet
2026-06-03 15:12:55 +08:00
parent 91f70dd783
commit 5de3fdc795
52 changed files with 284 additions and 315 deletions
@@ -0,0 +1,36 @@
using SepCore.DataTable;
namespace SepCore.Definition
{
public class PropItem
{
private readonly StatModifier[] _modifiers;
public string Title { get; private set; }
public string IconAssetName { get; private set; }
public ItemRarity Rarity { get; private set; }
public StatModifier[] Modifiers => _modifiers;
public PropItem(DRProp prop)
{
if (prop == null) return;
_modifiers = prop.Modifiers;
Title = prop.Title;
Rarity = prop.Rarity;
IconAssetName = prop.IconAssetName;
}
public PropItem(StatModifier[] modifiers)
{
_modifiers = modifiers;
}
public PropItem(StatModifier[] modifiers, ItemRarity rarity, string title, string iconAssetName)
{
_modifiers = modifiers;
Title = title;
Rarity = rarity;
IconAssetName = iconAssetName;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 135b5ab1b6f5491989f080cf8b949201
timeCreated: 1770212750
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: cedb6e3c4b92edf4bbbe5fb34bb043ba
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 58efe0589d7e90f498c8bcbbf94c6be4
folderAsset: yes
timeCreated: 1528026151
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,31 @@
using System;
using SepCore.Definition;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public abstract class AccessoryObjectData : EntityDataBase
{
[SerializeField] private int _ownerId = 0;
[SerializeField] private CampType _ownerCamp = CampType.Unknown;
public AccessoryObjectData(int entityId, int typeId, int ownerId, CampType ownerCamp)
: base(entityId, typeId)
{
_ownerId = ownerId;
_ownerCamp = ownerCamp;
}
/// <summary>
/// 拥有者编号。
/// </summary>
public int OwnerId => _ownerId;
/// <summary>
/// 拥有者阵营。
/// </summary>
public CampType OwnerCamp => _ownerCamp;
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 83cb841b7411a844581691d5547bf866
timeCreated: 1528026151
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,18 @@
namespace Entity.EntityData
{
public class CoinData : EntityDataBase
{
private int _value;
public CoinData(int value, int entityId, int typeId) : base(entityId, typeId)
{
_value = value;
}
public int Value
{
get => _value;
set => _value = value;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d9caee22d67a42018113acc77155d6ba
timeCreated: 1770292597
@@ -0,0 +1,20 @@
using System;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public class EffectData : EntityDataBase
{
[SerializeField]
private float _keepTime = 0f;
public EffectData(int entityId, int typeId)
: base(entityId, typeId)
{
_keepTime = 3f;
}
public float KeepTime => _keepTime;
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: e5b93dcbe30421a429c196bda0af31ed
timeCreated: 1528026152
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 611437bd292819b439512f684e13c7e3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using SepCore.DataTable;
using SepCore.Definition;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public class EnemyData : TargetableObjectData
{
private DREnemy _drEnemy;
public EnemyData(int entityId, DREnemy drEnemy, int level) : base(
entityId, drEnemy.Id, CampType.Enemy)
{
_drEnemy = drEnemy;
int effectiveLevel = Mathf.Max(1, level);
MaxHealthBase = _drEnemy.MaxHealth + _drEnemy.HpAddPerLevel * (effectiveLevel - 1);
}
public EnemyType EnemyType => (EnemyType)_drEnemy.Id;
public int EntityTypeId => _drEnemy.EntityTypeId;
public override int MaxHealthBase { get; }
public int AttackDamage => _drEnemy.AttackDamage;
public float AttackCooldown => _drEnemy.AttackCooldown;
public float AttackRange => _drEnemy.AttackRange;
public float SpeedBase => _drEnemy.Speed;
public int DropCoin => _drEnemy.DropCoin;
public int DropExp => _drEnemy.DropExp;
public float DropPercent => _drEnemy.DropPercent;
public IReadOnlyDictionary<string, string> Params => _drEnemy.Params;
public bool TryGetParam(string key, out string value)
{
value = null;
if (string.IsNullOrEmpty(key) || _drEnemy?.Params == null)
{
return false;
}
return _drEnemy.Params.TryGetValue(key, out value);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1b802c30cc274e04929b8659ec631e84
timeCreated: 1768890974
@@ -0,0 +1,29 @@
using System;
using SepCore.Definition;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public class EnemyProjectileData : EntityDataBase
{
public EnemyProjectileData(int entityId, int ownerEntityId, CampType ownerCamp, int attackDamage,
float speed, float lifeTime, Vector3 direction)
: base(entityId, 0)
{
OwnerEntityId = ownerEntityId;
OwnerCamp = ownerCamp;
AttackDamage = attackDamage;
Speed = speed;
LifeTime = lifeTime;
Direction = direction;
}
public int OwnerEntityId { get; }
public CampType OwnerCamp { get; }
public int AttackDamage { get; }
public float Speed { get; }
public float LifeTime { get; }
public Vector3 Direction { get; }
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 52b38f83ab6c4029803d40c189db47c7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,51 @@
using System;
using UnityEngine;
namespace Entity.EntityData
{
[Serializable]
public abstract class EntityDataBase
{
[SerializeField] private int _id = 0;
[SerializeField] private int _typeId = 0;
[SerializeField] private Vector3 _position = Vector3.zero;
[SerializeField] private Quaternion _rotation = Quaternion.identity;
public EntityDataBase(int entityId, int typeId)
{
_id = entityId;
_typeId = typeId;
}
/// <summary>
/// 实体编号。
/// </summary>
public int Id => _id;
/// <summary>
/// 实体类型编号。
/// </summary>
public int TypeId => _typeId;
/// <summary>
/// 实体位置。
/// </summary>
public Vector3 Position
{
get => _position;
set => _position = value;
}
/// <summary>
/// 实体朝向。
/// </summary>
public Quaternion Rotation
{
get => _rotation;
set => _rotation = value;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: afb91fe3ed8105e4a96b7bd5917ecc2b
timeCreated: 1528026152
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,18 @@
namespace Entity.EntityData
{
public class ExpData : EntityDataBase
{
private int _value;
public ExpData(int value, int entityId, int typeId) : base(entityId, typeId)
{
_value = value;
}
public int Value
{
get => _value;
set => _value = value;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e0f6c8e117da49f1ad04fd8810882043
timeCreated: 1770292932
@@ -0,0 +1,18 @@
using System;
using SepCore.Definition;
namespace Entity.EntityData
{
[Serializable]
public class PlayerData : TargetableObjectData
{
private int _maxExp;
public PlayerData(int entityId, int typeId) : base(entityId, typeId, CampType.Player)
{
MaxHealthBase = MaxHealthBase;
}
public override int MaxHealthBase { get; }
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b69d3168ac4f442994f8dc4d906daa60
timeCreated: 1768890638
@@ -0,0 +1,27 @@
using System;
using SepCore.Definition;
namespace Entity.EntityData
{
[Serializable]
public abstract class TargetableObjectData : EntityDataBase
{
private CampType _camp;
public TargetableObjectData(int entityId, int typeId, CampType camp)
: base(entityId, typeId)
{
_camp = camp;
}
/// <summary>
/// 角色阵营。
/// </summary>
public CampType Camp => _camp;
/// <summary>
/// 最大生命。
/// </summary>
public abstract int MaxHealthBase { get; }
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: f866c15cf3f2a45429251d4a66f70c77
timeCreated: 1528026152
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d8b2591453b7f0841940c8e45528f465
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,104 @@
using System;
using System.Collections.Generic;
using SepCore.DataTable;
using SepCore.Definition;
using GameFramework;
namespace Entity.EntityData
{
[Serializable]
public class WeaponData : AccessoryObjectData
{
private DRWeapon _drWeapon;
private int _entityTypeId = 0;
public WeaponData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
: base(entityId, drWeapon.Id, ownerId, ownerCamp)
{
_drWeapon = drWeapon;
_entityTypeId = drWeapon.EntityTypeId;
}
public WeaponType WeaponType => (WeaponType)_drWeapon.Id;
public bool TryGetParam(string key, out string value)
{
value = null;
if (string.IsNullOrEmpty(key) || Params == null)
{
return false;
}
return Params.TryGetValue(key, out value);
}
protected TParams ParseParams<TParams>() where TParams : new()
{
if (string.IsNullOrWhiteSpace(_drWeapon.ParamsJson))
{
return new TParams();
}
try
{
TParams parsed = Utility.Json.ToObject<TParams>(_drWeapon.ParamsJson);
return parsed ?? new TParams();
}
catch (Exception exception)
{
throw new Exception(
$"Failed to parse weapon params, WeaponType='{WeaponType}', Json='{_drWeapon.ParamsJson}'.",
exception);
}
}
/// <summary>
/// 攻击力。
/// </summary>
public int Attack => _drWeapon.Attack;
public int EntityTypeId => _entityTypeId;
/// <summary>
/// 武器名称。
/// </summary>
public string Title => _drWeapon.Title;
/// <summary>
/// 图标资源名称。
/// </summary>
public string IconAssetName => _drWeapon.IconAssetName;
public ItemRarity Rarity => _drWeapon.Rarity;
public int Price => _drWeapon.Price;
/// <summary>
/// 攻击间隔。
/// </summary>
public float Cooldown => _drWeapon.Cooldown;
/// <summary>
/// 攻击范围。
/// </summary>
public float AttackRange => _drWeapon.AttackRange;
/// <summary>
/// 攻击音效。
/// </summary>
public int AttackSoundId => _drWeapon.AttackSoundId;
/// <summary>
/// 额外参数。
/// </summary>
public Dictionary<string, string> Params => _drWeapon.Pramas;
public string ParamsJson => _drWeapon.ParamsJson;
/// <summary>
/// 额外属性。
/// </summary>
public StatModifier[] Modifiers => _drWeapon.Modifiers;
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: e813e3219579f834d8e619c17a8083d4
timeCreated: 1528026153
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,22 @@
using System;
using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
{
[Serializable]
public sealed class WeaponHandgunParamsData
{
}
public class WeaponHandgunData : WeaponData
{
public WeaponHandgunParamsData ParamsData { get; }
public WeaponHandgunData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
: base(entityId, drWeapon, ownerId, ownerCamp)
{
ParamsData = ParseParams<WeaponHandgunParamsData>();
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 574d105bf89bf7546a682ed407708034
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,23 @@
using System;
using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
{
[Serializable]
public sealed class WeaponKnifeParamsData
{
public float HitRadius { get; set; }
}
public class WeaponKnifeData : WeaponData
{
public WeaponKnifeParamsData ParamsData { get; }
public WeaponKnifeData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
: base(entityId, drWeapon, ownerId, ownerCamp)
{
ParamsData = ParseParams<WeaponKnifeParamsData>();
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: da25d8e0669f0194d8f56f4283c67b38
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,72 @@
using System;
using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
{
[Serializable]
public sealed class WeaponLanceParamsData
{
/// <summary>
/// 横向半宽,表示前戳矩形判定的一半宽度。
/// </summary>
public float HitHalfWidth { get; set; }
/// <summary>
/// 旧字段兼容,未配置 HitHalfWidth 时回退使用。
/// </summary>
public float HitRadius { get; set; }
/// <summary>
/// 前戳判定盒体的总高度。
/// </summary>
public float HitHeight { get; set; }
/// <summary>
/// 判定盒体中心相对战斗平面的高度偏移。
/// </summary>
public float HitCenterYOffset { get; set; }
/// <summary>
/// 前刺距离,同时驱动武器位移和命中长度。
/// </summary>
public float PierceLength { get; set; }
/// <summary>
/// 旧字段兼容,未配置 PierceLength 时回退使用。
/// </summary>
public float ThrustDistance { get; set; }
/// <summary>
/// 判定起点相对武器当前位置的前置偏移。
/// </summary>
public float ForwardOffset { get; set; }
/// <summary>
/// 追踪目标时的转向速度。
/// </summary>
public float RotateSpeed { get; set; }
/// <summary>
/// 向前突刺阶段耗时。
/// </summary>
public float AttackDuration { get; set; }
/// <summary>
/// 收枪返回阶段耗时。
/// </summary>
public float ReturnDuration { get; set; }
}
[Serializable]
public class WeaponLanceData : WeaponData
{
public WeaponLanceParamsData ParamsData { get; }
public WeaponLanceData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
: base(entityId, drWeapon, ownerId, ownerCamp)
{
ParamsData = ParseParams<WeaponLanceParamsData>();
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4d1a821e8ee1a9a4b912b70b0a1616eb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,24 @@
using System;
using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
{
[Serializable]
public sealed class WeaponLightningParamsData
{
public float HitRadius { get; set; }
public float HoverHeight { get; set; }
}
public class WeaponLightningData : WeaponData
{
public WeaponLightningParamsData ParamsData { get; }
public WeaponLightningData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
: base(entityId, drWeapon, ownerId, ownerCamp)
{
ParamsData = ParseParams<WeaponLightningParamsData>();
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 25b0006918fd46959c7f6b8ec1bbc8ab
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,23 @@
using System;
using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
{
[Serializable]
public sealed class WeaponSlashParamsData
{
public float SectorAngle { get; set; }
}
public class WeaponSlashData : WeaponData
{
public WeaponSlashParamsData ParamsData { get; }
public WeaponSlashData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
: base(entityId, drWeapon, ownerId, ownerCamp)
{
ParamsData = ParseParams<WeaponSlashParamsData>();
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4aa6473525dc4c62aeee02ff562ec453
timeCreated: 1771484661