From 5de3fdc795af2a6716eecc20e977b74721fe1522 Mon Sep 17 00:00:00 2001
From: SepComet <202308010230@stu.csust.edu.cn>
Date: Wed, 3 Jun 2026 15:12:55 +0800
Subject: [PATCH] =?UTF-8?q?=E8=BF=81=E7=A7=BB=20EntityData=20=E5=88=B0=20B?=
=?UTF-8?q?ase=20=E4=B8=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 新增 EntityDataFactory 工厂类,提供创建 EntityData 的统一入口
- 移出 EntityData 及派生类对 GameEntry 的依赖并移入 SepCore.Base 程序集中
---
.../Definition/DataStruct}/PropItem.cs | 23 +------
.../Definition/DataStruct}/PropItem.cs.meta | 0
Assets/GameMain/Scripts/Base/Entity.meta | 8 +++
.../{Runtime => Base}/Entity/EntityData.meta | 0
.../Entity/EntityData/AccessoryObjectData.cs | 31 +++++++++
.../EntityData/AccessoryObjectData.cs.meta | 0
.../Entity/EntityData/CoinData.cs | 0
.../Entity/EntityData/CoinData.cs.meta | 0
.../Base/Entity/EntityData/EffectData.cs | 20 ++++++
.../Entity/EntityData/EffectData.cs.meta | 0
.../Entity/EntityData/Enemy.meta | 0
.../Entity/EntityData/Enemy/EnemyData.cs | 21 ++----
.../Entity/EntityData/Enemy/EnemyData.cs.meta | 0
.../EntityData/Enemy/EnemyProjectileData.cs | 0
.../Enemy/EnemyProjectileData.cs.meta | 0
.../Base/Entity/EntityData/EntityDataBase.cs | 51 ++++++++++++++
.../Entity/EntityData/EntityDataBase.cs.meta | 0
.../Entity/EntityData/ExpData.cs | 0
.../Entity/EntityData/ExpData.cs.meta | 0
.../Entity/EntityData/PlayerData.cs | 3 +-
.../Entity/EntityData/PlayerData.cs.meta | 0
.../Entity/EntityData/TargetableObjectData.cs | 27 ++++++++
.../EntityData/TargetableObjectData.cs.meta | 0
.../Entity/EntityData/Weapon.meta | 0
.../Entity/EntityData/Weapon/WeaponData.cs | 14 ++--
.../EntityData/Weapon/WeaponData.cs.meta | 0
.../EntityData/Weapon/WeaponHandgunData.cs | 5 +-
.../Weapon/WeaponHandgunData.cs.meta | 0
.../EntityData/Weapon/WeaponKnifeData.cs | 5 +-
.../EntityData/Weapon/WeaponKnifeData.cs.meta | 0
.../EntityData/Weapon/WeaponLanceData.cs | 5 +-
.../EntityData/Weapon/WeaponLanceData.cs.meta | 0
.../EntityData/Weapon/WeaponLightningData.cs | 5 +-
.../Weapon/WeaponLightningData.cs.meta | 0
.../EntityData/Weapon/WeaponSlashData.cs | 5 +-
.../EntityData/Weapon/WeaponSlashData.cs.meta | 0
.../Scripts/Editor/GameFrameworkConfigs.cs | 23 ++++---
.../Editor/VampireLikeBuildEventHandler.cs | 51 +++++++++-----
.../{ => BuiltinComponent}/AsyncTaskHelper.cs | 0
.../AsyncTaskHelper.cs.meta | 0
.../Runtime/Components/BackpackComponent.cs | 11 +++-
.../EnemyManager/EnemyManagerComponent.cs | 9 ++-
.../Entity/EntityData/AccessoryObjectData.cs | 53 ---------------
.../Runtime/Entity/EntityData/EffectData.cs | 33 ----------
.../Entity/EntityData/EntityDataBase.cs | 62 ------------------
.../Entity/EntityData/TargetableObjectData.cs | 40 -----------
.../Runtime/Entity/EntityLogic/Player.cs | 4 +-
.../Runtime/UIBase/Main/Shop/ShopUseCase.cs | 35 ++--------
.../Runtime/Utility/EntityDataFactory.cs | 44 +++++++++++++
.../Runtime/Utility/EntityDataFactory.cs.meta | 11 ++++
数据表/Entity/Enemy.xlsx | Bin 10837 -> 10841 bytes
数据表/Entity/Weapon.xlsx | Bin 12931 -> 12958 bytes
52 files changed, 284 insertions(+), 315 deletions(-)
rename Assets/GameMain/Scripts/{Runtime => Base/Definition/DataStruct}/PropItem.cs (61%)
rename Assets/GameMain/Scripts/{Runtime => Base/Definition/DataStruct}/PropItem.cs.meta (100%)
create mode 100644 Assets/GameMain/Scripts/Base/Entity.meta
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData.meta (100%)
create mode 100644 Assets/GameMain/Scripts/Base/Entity/EntityData/AccessoryObjectData.cs
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/AccessoryObjectData.cs.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/CoinData.cs (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/CoinData.cs.meta (100%)
create mode 100644 Assets/GameMain/Scripts/Base/Entity/EntityData/EffectData.cs
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/EffectData.cs.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Enemy.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Enemy/EnemyData.cs (67%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Enemy/EnemyData.cs.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Enemy/EnemyProjectileData.cs (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Enemy/EnemyProjectileData.cs.meta (100%)
create mode 100644 Assets/GameMain/Scripts/Base/Entity/EntityData/EntityDataBase.cs
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/EntityDataBase.cs.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/ExpData.cs (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/ExpData.cs.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/PlayerData.cs (93%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/PlayerData.cs.meta (100%)
create mode 100644 Assets/GameMain/Scripts/Base/Entity/EntityData/TargetableObjectData.cs
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/TargetableObjectData.cs.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponData.cs (84%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponData.cs.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponHandgunData.cs (66%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponHandgunData.cs.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponKnifeData.cs (68%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponKnifeData.cs.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponLanceData.cs (91%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponLanceData.cs.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponLightningData.cs (71%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponLightningData.cs.meta (100%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponSlashData.cs (68%)
rename Assets/GameMain/Scripts/{Runtime => Base}/Entity/EntityData/Weapon/WeaponSlashData.cs.meta (100%)
rename Assets/GameMain/Scripts/Runtime/{ => BuiltinComponent}/AsyncTaskHelper.cs (100%)
rename Assets/GameMain/Scripts/Runtime/{ => BuiltinComponent}/AsyncTaskHelper.cs.meta (100%)
delete mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityData/AccessoryObjectData.cs
delete mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityData/EffectData.cs
delete mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityData/EntityDataBase.cs
delete mode 100644 Assets/GameMain/Scripts/Runtime/Entity/EntityData/TargetableObjectData.cs
create mode 100644 Assets/GameMain/Scripts/Runtime/Utility/EntityDataFactory.cs
create mode 100644 Assets/GameMain/Scripts/Runtime/Utility/EntityDataFactory.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/PropItem.cs b/Assets/GameMain/Scripts/Base/Definition/DataStruct/PropItem.cs
similarity index 61%
rename from Assets/GameMain/Scripts/Runtime/PropItem.cs
rename to Assets/GameMain/Scripts/Base/Definition/DataStruct/PropItem.cs
index 9fd0716..35aefb1 100644
--- a/Assets/GameMain/Scripts/Runtime/PropItem.cs
+++ b/Assets/GameMain/Scripts/Base/Definition/DataStruct/PropItem.cs
@@ -1,6 +1,3 @@
-using Components;
-using Entity;
-using Entity.EntityData;
using SepCore.DataTable;
namespace SepCore.Definition
@@ -12,7 +9,7 @@ namespace SepCore.Definition
public string IconAssetName { get; private set; }
public ItemRarity Rarity { get; private set; }
public StatModifier[] Modifiers => _modifiers;
-
+
public PropItem(DRProp prop)
{
if (prop == null) return;
@@ -35,23 +32,5 @@ namespace SepCore.Definition
Rarity = rarity;
IconAssetName = iconAssetName;
}
-
- public void OnAttach(StatComponent statComponent)
- {
- if (_modifiers == null || statComponent == null) return;
- foreach (var modifier in _modifiers)
- {
- statComponent.AddModifier(modifier);
- }
- }
-
- public void OnDetach(StatComponent statComponent)
- {
- if (_modifiers == null || statComponent == null) return;
- foreach (var modifier in _modifiers)
- {
- statComponent.RemoveModifier(modifier);
- }
- }
}
}
diff --git a/Assets/GameMain/Scripts/Runtime/PropItem.cs.meta b/Assets/GameMain/Scripts/Base/Definition/DataStruct/PropItem.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/PropItem.cs.meta
rename to Assets/GameMain/Scripts/Base/Definition/DataStruct/PropItem.cs.meta
diff --git a/Assets/GameMain/Scripts/Base/Entity.meta b/Assets/GameMain/Scripts/Base/Entity.meta
new file mode 100644
index 0000000..d0fe80b
--- /dev/null
+++ b/Assets/GameMain/Scripts/Base/Entity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cedb6e3c4b92edf4bbbe5fb34bb043ba
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData.meta
diff --git a/Assets/GameMain/Scripts/Base/Entity/EntityData/AccessoryObjectData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/AccessoryObjectData.cs
new file mode 100644
index 0000000..e1d80fb
--- /dev/null
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/AccessoryObjectData.cs
@@ -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;
+ }
+
+ ///
+ /// 拥有者编号。
+ ///
+ public int OwnerId => _ownerId;
+
+ ///
+ /// 拥有者阵营。
+ ///
+ public CampType OwnerCamp => _ownerCamp;
+ }
+}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/AccessoryObjectData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/AccessoryObjectData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/AccessoryObjectData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/AccessoryObjectData.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/CoinData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/CoinData.cs
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/CoinData.cs
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/CoinData.cs
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/CoinData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/CoinData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/CoinData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/CoinData.cs.meta
diff --git a/Assets/GameMain/Scripts/Base/Entity/EntityData/EffectData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/EffectData.cs
new file mode 100644
index 0000000..f423ca1
--- /dev/null
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/EffectData.cs
@@ -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;
+ }
+}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/EffectData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/EffectData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/EffectData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/EffectData.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Enemy.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Enemy.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Enemy/EnemyData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyData.cs
similarity index 67%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Enemy/EnemyData.cs
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyData.cs
index 6920f43..ff4b69a 100644
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Enemy/EnemyData.cs
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyData.cs
@@ -3,31 +3,20 @@ using System.Collections.Generic;
using SepCore.DataTable;
using SepCore.Definition;
using UnityEngine;
-using UnityGameFramework.Runtime;
namespace Entity.EntityData
{
[Serializable]
public class EnemyData : TargetableObjectData
{
- [SerializeField] private DREnemy _drEnemy;
+ private DREnemy _drEnemy;
- public EnemyData(int entityId, EnemyType enemyType, int level) : base(
- entityId, (int)enemyType, CampType.Enemy)
+ public EnemyData(int entityId, DREnemy drEnemy, int level) : base(
+ entityId, drEnemy.Id, CampType.Enemy)
{
- DREnemy enemyRow = GameEntry.DataTable.GetDataTableRow((int)enemyType);
-
- if (enemyRow == null)
- {
- throw new Exception($"Enemy data table row is missing, EnemyType='{enemyType}'.");
- }
- else
- {
- _drEnemy = enemyRow;
- }
-
+ _drEnemy = drEnemy;
int effectiveLevel = Mathf.Max(1, level);
- MaxHealthBase = enemyRow.MaxHealth + enemyRow.HpAddPerLevel * (effectiveLevel - 1);
+ MaxHealthBase = _drEnemy.MaxHealth + _drEnemy.HpAddPerLevel * (effectiveLevel - 1);
}
public EnemyType EnemyType => (EnemyType)_drEnemy.Id;
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Enemy/EnemyData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Enemy/EnemyData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyData.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Enemy/EnemyProjectileData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyProjectileData.cs
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Enemy/EnemyProjectileData.cs
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyProjectileData.cs
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Enemy/EnemyProjectileData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyProjectileData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Enemy/EnemyProjectileData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Enemy/EnemyProjectileData.cs.meta
diff --git a/Assets/GameMain/Scripts/Base/Entity/EntityData/EntityDataBase.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/EntityDataBase.cs
new file mode 100644
index 0000000..4587877
--- /dev/null
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/EntityDataBase.cs
@@ -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;
+ }
+
+ ///
+ /// 实体编号。
+ ///
+ public int Id => _id;
+
+ ///
+ /// 实体类型编号。
+ ///
+ public int TypeId => _typeId;
+
+ ///
+ /// 实体位置。
+ ///
+ public Vector3 Position
+ {
+ get => _position;
+ set => _position = value;
+ }
+
+ ///
+ /// 实体朝向。
+ ///
+ public Quaternion Rotation
+ {
+ get => _rotation;
+ set => _rotation = value;
+ }
+ }
+}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/EntityDataBase.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/EntityDataBase.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/EntityDataBase.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/EntityDataBase.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/ExpData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/ExpData.cs
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/ExpData.cs
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/ExpData.cs
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/ExpData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/ExpData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/ExpData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/ExpData.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/PlayerData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/PlayerData.cs
similarity index 93%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/PlayerData.cs
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/PlayerData.cs
index d114df4..c5f4fed 100644
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/PlayerData.cs
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/PlayerData.cs
@@ -1,5 +1,4 @@
using System;
-using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
@@ -16,4 +15,4 @@ namespace Entity.EntityData
public override int MaxHealthBase { get; }
}
-}
\ No newline at end of file
+}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/PlayerData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/PlayerData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/PlayerData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/PlayerData.cs.meta
diff --git a/Assets/GameMain/Scripts/Base/Entity/EntityData/TargetableObjectData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/TargetableObjectData.cs
new file mode 100644
index 0000000..74ca3f7
--- /dev/null
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/TargetableObjectData.cs
@@ -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;
+ }
+
+ ///
+ /// 角色阵营。
+ ///
+ public CampType Camp => _camp;
+
+ ///
+ /// 最大生命。
+ ///
+ public abstract int MaxHealthBase { get; }
+ }
+}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/TargetableObjectData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/TargetableObjectData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/TargetableObjectData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/TargetableObjectData.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponData.cs
similarity index 84%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponData.cs
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponData.cs
index 8a5e400..81d3585 100644
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponData.cs
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponData.cs
@@ -13,17 +13,11 @@ namespace Entity.EntityData
private int _entityTypeId = 0;
- public WeaponData(int entityId, WeaponType weaponType, int ownerId, CampType ownerCamp)
- : base(entityId, (int)weaponType, ownerId, ownerCamp)
+ public WeaponData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
+ : base(entityId, drWeapon.Id, ownerId, ownerCamp)
{
- _drWeapon = GameEntry.DataTable.GetDataTableRow((int)weaponType);
-
- if (_drWeapon == null)
- {
- throw new Exception($"Weapon data table row is missing, WeaponType='{weaponType}'.");
- }
-
- _entityTypeId = _drWeapon.EntityTypeId;
+ _drWeapon = drWeapon;
+ _entityTypeId = drWeapon.EntityTypeId;
}
public WeaponType WeaponType => (WeaponType)_drWeapon.Id;
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponData.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponHandgunData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponHandgunData.cs
similarity index 66%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponHandgunData.cs
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponHandgunData.cs
index 9f83cb9..9b2cd85 100644
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponHandgunData.cs
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponHandgunData.cs
@@ -1,4 +1,5 @@
using System;
+using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
@@ -12,8 +13,8 @@ namespace Entity.EntityData
{
public WeaponHandgunParamsData ParamsData { get; }
- public WeaponHandgunData(int entityId, int ownerId, CampType ownerCamp)
- : base(entityId, WeaponType.WeaponHandgun, ownerId, ownerCamp)
+ public WeaponHandgunData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
+ : base(entityId, drWeapon, ownerId, ownerCamp)
{
ParamsData = ParseParams();
}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponHandgunData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponHandgunData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponHandgunData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponHandgunData.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponKnifeData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponKnifeData.cs
similarity index 68%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponKnifeData.cs
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponKnifeData.cs
index 582f0f3..c8a7930 100644
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponKnifeData.cs
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponKnifeData.cs
@@ -1,4 +1,5 @@
using System;
+using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
@@ -13,8 +14,8 @@ namespace Entity.EntityData
{
public WeaponKnifeParamsData ParamsData { get; }
- public WeaponKnifeData(int entityId, int ownerId, CampType ownerCamp) : base(entityId, WeaponType.WeaponKnife,
- ownerId, ownerCamp)
+ public WeaponKnifeData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
+ : base(entityId, drWeapon, ownerId, ownerCamp)
{
ParamsData = ParseParams();
}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponKnifeData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponKnifeData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponKnifeData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponKnifeData.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponLanceData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponLanceData.cs
similarity index 91%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponLanceData.cs
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponLanceData.cs
index 937a5cf..5ede889 100644
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponLanceData.cs
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponLanceData.cs
@@ -1,4 +1,5 @@
using System;
+using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
@@ -62,8 +63,8 @@ namespace Entity.EntityData
{
public WeaponLanceParamsData ParamsData { get; }
- public WeaponLanceData(int entityId, int ownerId, CampType ownerCamp)
- : base(entityId, WeaponType.WeaponLance, ownerId, ownerCamp)
+ public WeaponLanceData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
+ : base(entityId, drWeapon, ownerId, ownerCamp)
{
ParamsData = ParseParams();
}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponLanceData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponLanceData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponLanceData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponLanceData.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponLightningData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponLightningData.cs
similarity index 71%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponLightningData.cs
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponLightningData.cs
index 4052f94..3cbc499 100644
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponLightningData.cs
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponLightningData.cs
@@ -1,4 +1,5 @@
using System;
+using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
@@ -14,8 +15,8 @@ namespace Entity.EntityData
{
public WeaponLightningParamsData ParamsData { get; }
- public WeaponLightningData(int entityId, int ownerId, CampType ownerCamp)
- : base(entityId, WeaponType.WeaponLightning, ownerId, ownerCamp)
+ public WeaponLightningData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
+ : base(entityId, drWeapon, ownerId, ownerCamp)
{
ParamsData = ParseParams();
}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponLightningData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponLightningData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponLightningData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponLightningData.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponSlashData.cs b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponSlashData.cs
similarity index 68%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponSlashData.cs
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponSlashData.cs
index 128e0fd..e699303 100644
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponSlashData.cs
+++ b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponSlashData.cs
@@ -1,4 +1,5 @@
using System;
+using SepCore.DataTable;
using SepCore.Definition;
namespace Entity.EntityData
@@ -13,8 +14,8 @@ namespace Entity.EntityData
{
public WeaponSlashParamsData ParamsData { get; }
- public WeaponSlashData(int entityId, int ownerId, CampType ownerCamp)
- : base(entityId, WeaponType.WeaponSlash, ownerId, ownerCamp)
+ public WeaponSlashData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
+ : base(entityId, drWeapon, ownerId, ownerCamp)
{
ParamsData = ParseParams();
}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponSlashData.cs.meta b/Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponSlashData.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/Entity/EntityData/Weapon/WeaponSlashData.cs.meta
rename to Assets/GameMain/Scripts/Base/Entity/EntityData/Weapon/WeaponSlashData.cs.meta
diff --git a/Assets/GameMain/Scripts/Editor/GameFrameworkConfigs.cs b/Assets/GameMain/Scripts/Editor/GameFrameworkConfigs.cs
index b6ec084..12f265a 100644
--- a/Assets/GameMain/Scripts/Editor/GameFrameworkConfigs.cs
+++ b/Assets/GameMain/Scripts/Editor/GameFrameworkConfigs.cs
@@ -1,5 +1,4 @@
-using GameFramework;
-using System.IO;
+using System.IO;
using UnityEngine;
using UnityGameFramework.Editor;
using UnityGameFramework.Editor.ResourceTools;
@@ -8,16 +7,20 @@ namespace SepCore.Editor
{
public static class GameFrameworkConfigs
{
- [BuildSettingsConfigPath]
- public static string BuildSettingsConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/BuildSettings.xml"));
+ [BuildSettingsConfigPath] public static string BuildSettingsConfig =
+ GameFramework.Utility.Path.GetRegularPath(Path.Combine(Application.dataPath,
+ "GameMain/Configs/BuildSettings.xml"));
- [ResourceCollectionConfigPath]
- public static string ResourceCollectionConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/ResourceCollection.xml"));
+ [ResourceCollectionConfigPath] public static string ResourceCollectionConfig =
+ GameFramework.Utility.Path.GetRegularPath(Path.Combine(Application.dataPath,
+ "GameMain/Configs/ResourceCollection.xml"));
- [ResourceEditorConfigPath]
- public static string ResourceEditorConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/ResourceEditor.xml"));
+ [ResourceEditorConfigPath] public static string ResourceEditorConfig =
+ GameFramework.Utility.Path.GetRegularPath(Path.Combine(Application.dataPath,
+ "GameMain/Configs/ResourceEditor.xml"));
- [ResourceBuilderConfigPath]
- public static string ResourceBuilderConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/ResourceBuilder.xml"));
+ [ResourceBuilderConfigPath] public static string ResourceBuilderConfig =
+ GameFramework.Utility.Path.GetRegularPath(Path.Combine(Application.dataPath,
+ "GameMain/Configs/ResourceBuilder.xml"));
}
}
diff --git a/Assets/GameMain/Scripts/Editor/VampireLikeBuildEventHandler.cs b/Assets/GameMain/Scripts/Editor/VampireLikeBuildEventHandler.cs
index e92e7ef..0a771fe 100644
--- a/Assets/GameMain/Scripts/Editor/VampireLikeBuildEventHandler.cs
+++ b/Assets/GameMain/Scripts/Editor/VampireLikeBuildEventHandler.cs
@@ -10,17 +10,19 @@ namespace SepCore.Editor
{
public bool ContinueOnFailure
{
- get
- {
- return false;
- }
+ get { return false; }
}
- public void OnPreprocessAllPlatforms(string productName, string companyName, string gameIdentifier, string gameFrameworkVersion, string unityVersion, string applicableGameVersion, int internalResourceVersion,
- Platform platforms, AssetBundleCompressionType assetBundleCompression, string compressionHelperTypeName, bool additionalCompressionSelected, bool forceRebuildAssetBundleSelected, string buildEventHandlerTypeName, string outputDirectory, BuildAssetBundleOptions buildAssetBundleOptions,
- string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath, string buildReportPath)
+ public void OnPreprocessAllPlatforms(string productName, string companyName, string gameIdentifier,
+ string gameFrameworkVersion, string unityVersion, string applicableGameVersion, int internalResourceVersion,
+ Platform platforms, AssetBundleCompressionType assetBundleCompression, string compressionHelperTypeName,
+ bool additionalCompressionSelected, bool forceRebuildAssetBundleSelected, string buildEventHandlerTypeName,
+ string outputDirectory, BuildAssetBundleOptions buildAssetBundleOptions,
+ string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected,
+ string outputFullPath, bool outputPackedSelected, string outputPackedPath, string buildReportPath)
{
- string streamingAssetsPath = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "StreamingAssets"));
+ string streamingAssetsPath =
+ GameFramework.Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "StreamingAssets"));
string[] fileNames = Directory.GetFiles(streamingAssetsPath, "*", SearchOption.AllDirectories);
foreach (string fileName in fileNames)
{
@@ -32,28 +34,39 @@ namespace SepCore.Editor
File.Delete(fileName);
}
- Utility.Path.RemoveEmptyDirectory(streamingAssetsPath);
+ GameFramework.Utility.Path.RemoveEmptyDirectory(streamingAssetsPath);
}
- public void OnPostprocessAllPlatforms(string productName, string companyName, string gameIdentifier, string gameFrameworkVersion, string unityVersion, string applicableGameVersion, int internalResourceVersion,
- Platform platforms, AssetBundleCompressionType assetBundleCompression, string compressionHelperTypeName, bool additionalCompressionSelected, bool forceRebuildAssetBundleSelected, string buildEventHandlerTypeName, string outputDirectory, BuildAssetBundleOptions buildAssetBundleOptions,
- string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath, string buildReportPath)
+ public void OnPostprocessAllPlatforms(string productName, string companyName, string gameIdentifier,
+ string gameFrameworkVersion, string unityVersion, string applicableGameVersion, int internalResourceVersion,
+ Platform platforms, AssetBundleCompressionType assetBundleCompression, string compressionHelperTypeName,
+ bool additionalCompressionSelected, bool forceRebuildAssetBundleSelected, string buildEventHandlerTypeName,
+ string outputDirectory, BuildAssetBundleOptions buildAssetBundleOptions,
+ string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected,
+ string outputFullPath, bool outputPackedSelected, string outputPackedPath, string buildReportPath)
{
}
- public void OnPreprocessPlatform(Platform platform, string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath)
+ public void OnPreprocessPlatform(Platform platform, string workingPath, bool outputPackageSelected,
+ string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected,
+ string outputPackedPath)
{
}
- public void OnBuildAssetBundlesComplete(Platform platform, string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath, AssetBundleManifest assetBundleManifest)
+ public void OnBuildAssetBundlesComplete(Platform platform, string workingPath, bool outputPackageSelected,
+ string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected,
+ string outputPackedPath, AssetBundleManifest assetBundleManifest)
{
}
- public void OnOutputUpdatableVersionListData(Platform platform, string versionListPath, int versionListLength, int versionListHashCode, int versionListCompressedLength, int versionListCompressedHashCode)
+ public void OnOutputUpdatableVersionListData(Platform platform, string versionListPath, int versionListLength,
+ int versionListHashCode, int versionListCompressedLength, int versionListCompressedHashCode)
{
}
- public void OnPostprocessPlatform(Platform platform, string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath, bool isSuccess)
+ public void OnPostprocessPlatform(Platform platform, string workingPath, bool outputPackageSelected,
+ string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected,
+ string outputPackedPath, bool isSuccess)
{
if (!outputPackageSelected)
{
@@ -65,11 +78,13 @@ namespace SepCore.Editor
return;
}
- string streamingAssetsPath = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "StreamingAssets"));
+ string streamingAssetsPath =
+ GameFramework.Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "StreamingAssets"));
string[] fileNames = Directory.GetFiles(outputPackagePath, "*", SearchOption.AllDirectories);
foreach (string fileName in fileNames)
{
- string destFileName = Utility.Path.GetRegularPath(Path.Combine(streamingAssetsPath, fileName.Substring(outputPackagePath.Length)));
+ string destFileName = GameFramework.Utility.Path.GetRegularPath(Path.Combine(streamingAssetsPath,
+ fileName.Substring(outputPackagePath.Length)));
FileInfo destFileInfo = new FileInfo(destFileName);
if (!destFileInfo.Directory.Exists)
{
diff --git a/Assets/GameMain/Scripts/Runtime/AsyncTaskHelper.cs b/Assets/GameMain/Scripts/Runtime/BuiltinComponent/AsyncTaskHelper.cs
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/AsyncTaskHelper.cs
rename to Assets/GameMain/Scripts/Runtime/BuiltinComponent/AsyncTaskHelper.cs
diff --git a/Assets/GameMain/Scripts/Runtime/AsyncTaskHelper.cs.meta b/Assets/GameMain/Scripts/Runtime/BuiltinComponent/AsyncTaskHelper.cs.meta
similarity index 100%
rename from Assets/GameMain/Scripts/Runtime/AsyncTaskHelper.cs.meta
rename to Assets/GameMain/Scripts/Runtime/BuiltinComponent/AsyncTaskHelper.cs.meta
diff --git a/Assets/GameMain/Scripts/Runtime/Components/BackpackComponent.cs b/Assets/GameMain/Scripts/Runtime/Components/BackpackComponent.cs
index 2a5a27c..5c92798 100644
--- a/Assets/GameMain/Scripts/Runtime/Components/BackpackComponent.cs
+++ b/Assets/GameMain/Scripts/Runtime/Components/BackpackComponent.cs
@@ -81,14 +81,21 @@ namespace Components
public bool AttachProp(PropItem prop)
{
_props.Add(prop);
- prop.OnAttach(_statComponent);
+ foreach (var modifier in prop.Modifiers)
+ {
+ _statComponent.AddModifier(modifier);
+ }
+
return true;
}
public bool DetachProp(PropItem prop)
{
_props.Remove(prop);
- prop.OnDetach(_statComponent);
+ foreach (var modifier in prop.Modifiers)
+ {
+ _statComponent.RemoveModifier(modifier);
+ }
return true;
}
diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs
index 449b03a..0756987 100644
--- a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs
+++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs
@@ -4,6 +4,7 @@ using SepCore.Definition;
using Entity;
using Entity.EntityData;
using GameFramework.Event;
+using SepCore.Utility;
using UnityEngine;
using UnityGameFramework.Runtime;
using Random = UnityEngine.Random;
@@ -124,7 +125,7 @@ namespace CustomComponent
_nextSpawnTimes = null;
ClearEnemies();
-
+
_currentEnemyCount = 0;
}
@@ -136,10 +137,8 @@ namespace CustomComponent
if (_currentEnemyCount >= _spawnEnemyMaxCount) return;
int entityPoolId = _currentSpawnEnemyId % _spawnEnemyMaxCount;
- var enemyData = new EnemyData(entityPoolId, enemyType, _currentLevel)
- {
- Position = GetRandomPosition()
- };
+ var enemyData = EntityDataFactory.Create(entityPoolId, enemyType, _currentLevel);
+ enemyData.Position = GetRandomPosition();
_entity.ShowEnemy(enemyData);
_currentSpawnEnemyId++;
}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/AccessoryObjectData.cs b/Assets/GameMain/Scripts/Runtime/Entity/EntityData/AccessoryObjectData.cs
deleted file mode 100644
index 75143d3..0000000
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/AccessoryObjectData.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------
-// Game Framework
-// Copyright © 2013-2021 Jiang Yin. All rights reserved.
-// Homepage: https://gameframework.cn/
-// Feedback: mailto:ellan@gameframework.cn
-//------------------------------------------------------------
-
-using System;
-using SepCore.Definition;
-using StarForce;
-using UnityEngine;
-
-namespace Entity.EntityData
-{
- [Serializable]
- public abstract class AccessoryObjectData : EntityDataBase
- {
- [SerializeField]
- private int m_OwnerId = 0;
-
- [SerializeField]
- private CampType m_OwnerCamp = CampType.Unknown;
-
- public AccessoryObjectData(int entityId, int typeId, int ownerId, CampType ownerCamp)
- : base(entityId, typeId)
- {
- m_OwnerId = ownerId;
- m_OwnerCamp = ownerCamp;
- }
-
- ///
- /// 拥有者编号。
- ///
- public int OwnerId
- {
- get
- {
- return m_OwnerId;
- }
- }
-
- ///
- /// 拥有者阵营。
- ///
- public CampType OwnerCamp
- {
- get
- {
- return m_OwnerCamp;
- }
- }
- }
-}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/EffectData.cs b/Assets/GameMain/Scripts/Runtime/Entity/EntityData/EffectData.cs
deleted file mode 100644
index 7c1a7b9..0000000
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/EffectData.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-//------------------------------------------------------------
-// Game Framework
-// Copyright © 2013-2021 Jiang Yin. All rights reserved.
-// Homepage: https://gameframework.cn/
-// Feedback: mailto:ellan@gameframework.cn
-//------------------------------------------------------------
-
-using System;
-using UnityEngine;
-
-namespace Entity.EntityData
-{
- [Serializable]
- public class EffectData : EntityDataBase
- {
- [SerializeField]
- private float m_KeepTime = 0f;
-
- public EffectData(int entityId, int typeId)
- : base(entityId, typeId)
- {
- m_KeepTime = 3f;
- }
-
- public float KeepTime
- {
- get
- {
- return m_KeepTime;
- }
- }
- }
-}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/EntityDataBase.cs b/Assets/GameMain/Scripts/Runtime/Entity/EntityData/EntityDataBase.cs
deleted file mode 100644
index 530e936..0000000
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/EntityDataBase.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------
-// Game Framework
-// Copyright © 2013-2021 Jiang Yin. All rights reserved.
-// Homepage: https://gameframework.cn/
-// Feedback: mailto:ellan@gameframework.cn
-//------------------------------------------------------------
-
-using System;
-using UnityEngine;
-
-namespace Entity.EntityData
-{
- [Serializable]
- public abstract class EntityDataBase
- {
- [SerializeField]
- private int m_Id = 0;
-
- [SerializeField]
- private int m_TypeId = 0;
-
- [SerializeField]
- private Vector3 m_Position = Vector3.zero;
-
- [SerializeField]
- private Quaternion m_Rotation = Quaternion.identity;
-
- public EntityDataBase(int entityId, int typeId)
- {
- m_Id = entityId;
- m_TypeId = typeId;
- }
-
- ///
- /// 实体编号。
- ///
- public int Id => m_Id;
-
- ///
- /// 实体类型编号。
- ///
- public int TypeId => m_TypeId;
-
- ///
- /// 实体位置。
- ///
- public Vector3 Position
- {
- get => m_Position;
- set => m_Position = value;
- }
-
- ///
- /// 实体朝向。
- ///
- public Quaternion Rotation
- {
- get => m_Rotation;
- set => m_Rotation = value;
- }
- }
-}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/TargetableObjectData.cs b/Assets/GameMain/Scripts/Runtime/Entity/EntityData/TargetableObjectData.cs
deleted file mode 100644
index 071d3fb..0000000
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityData/TargetableObjectData.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------
-// Game Framework
-// Copyright © 2013-2021 Jiang Yin. All rights reserved.
-// Homepage: https://gameframework.cn/
-// Feedback: mailto:ellan@gameframework.cn
-//------------------------------------------------------------
-
-using System;
-using SepCore.Definition;
-using StarForce;
-using UnityEngine;
-
-namespace Entity.EntityData
-{
- [Serializable]
- public abstract class TargetableObjectData : EntityDataBase
- {
- [SerializeField]
- private CampType _camp = CampType.Unknown;
-
- public TargetableObjectData(int entityId, int typeId, CampType camp)
- : base(entityId, typeId)
- {
- _camp = camp;
- }
-
- ///
- /// 角色阵营。
- ///
- public CampType Camp => _camp;
-
- ///
- /// 最大生命。
- ///
- public abstract int MaxHealthBase
- {
- get;
- }
- }
-}
diff --git a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Player.cs b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Player.cs
index abd3132..d4071cf 100644
--- a/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Player.cs
+++ b/Assets/GameMain/Scripts/Runtime/Entity/EntityLogic/Player.cs
@@ -7,6 +7,7 @@ using Entity.EntityData;
using GameFramework.Event;
using UnityGameFramework.Runtime;
using Entity.Weapon;
+using SepCore.Utility;
namespace Entity
{
@@ -140,7 +141,8 @@ namespace Entity
// BackpackComponent
Coin = role.Coin;
_backpackComponent.OnInit(this, role.WeaponCapacity);
- GameEntry.Entity.ShowWeapon(new WeaponKnifeData(GameEntry.Entity.GenerateSerialId(), Id, _playerData.Camp));
+ GameEntry.Entity.ShowWeapon(EntityDataFactory.Create(GameEntry.Entity.GenerateSerialId(),
+ WeaponType.WeaponKnife, Id, _playerData.Camp));
// StatComponent
foreach (var modifier in role.InitialProperties)
diff --git a/Assets/GameMain/Scripts/Runtime/UIBase/Main/Shop/ShopUseCase.cs b/Assets/GameMain/Scripts/Runtime/UIBase/Main/Shop/ShopUseCase.cs
index 000f786..31dc16f 100644
--- a/Assets/GameMain/Scripts/Runtime/UIBase/Main/Shop/ShopUseCase.cs
+++ b/Assets/GameMain/Scripts/Runtime/UIBase/Main/Shop/ShopUseCase.cs
@@ -7,6 +7,7 @@ using Entity;
using Entity.EntityData;
using CustomUtility;
using GameFramework.DataTable;
+using SepCore.Utility;
using UnityEngine;
using UnityGameFramework.Runtime;
using Random = UnityEngine.Random;
@@ -352,14 +353,10 @@ namespace SepCore.UI
return null;
}
- DRWeapon drWeapon = _weaponDataTable != null ? _weaponDataTable.GetDataRow(goods.GoodsTypeId) : null;
- if (drWeapon == null)
- {
- Log.Warning($"ShopFormUseCase::ApplyGoodsPurchase: Missing DRWeapon, id = {goods.GoodsTypeId}");
- return null;
- }
+ DRWeapon drWeapon = _weaponDataTable.GetDataRow(goods.GoodsTypeId);
- var weaponData = CreateWeaponData(goods.GoodsTypeId);
+ var weaponData = EntityDataFactory.Create(GameEntry.Entity.GenerateSerialId(), drWeapon, Player.Id,
+ CampType.Player);
if (weaponData == null)
{
Log.Warning(
@@ -380,30 +377,6 @@ namespace SepCore.UI
return null;
}
- private WeaponData CreateWeaponData(int weaponTypeId)
- {
- int entityId = GameEntry.Entity.GenerateSerialId();
- int ownerId = Player.Id;
- CampType ownerCamp = CampType.Player;
-
- WeaponType weaponType = (WeaponType)weaponTypeId;
- switch (weaponType)
- {
- case WeaponType.WeaponKnife:
- return new WeaponKnifeData(entityId, ownerId, ownerCamp);
- case WeaponType.WeaponHandgun:
- return new WeaponHandgunData(entityId, ownerId, ownerCamp);
- case WeaponType.WeaponSlash:
- return new WeaponSlashData(entityId, ownerId, ownerCamp);
- case WeaponType.WeaponLightning:
- return new WeaponLightningData(entityId, ownerId, ownerCamp);
- case WeaponType.WeaponLance:
- return new WeaponLanceData(entityId, ownerId, ownerCamp);
- default:
- return null;
- }
- }
-
public bool TryRecycleWeapon(int argsIndex, int argsPrice)
{
Player player = Player;
diff --git a/Assets/GameMain/Scripts/Runtime/Utility/EntityDataFactory.cs b/Assets/GameMain/Scripts/Runtime/Utility/EntityDataFactory.cs
new file mode 100644
index 0000000..c9cc68b
--- /dev/null
+++ b/Assets/GameMain/Scripts/Runtime/Utility/EntityDataFactory.cs
@@ -0,0 +1,44 @@
+using System;
+using SepCore.DataTable;
+using Entity.EntityData;
+using SepCore.Definition;
+
+namespace SepCore.Utility
+{
+ public static class EntityDataFactory
+ {
+ public static EnemyData Create(int entityId, EnemyType enemyType, int level)
+ {
+ var dr = GameEntry.DataTable.GetDataTableRow((int)enemyType);
+ return new EnemyData(entityId, dr, level);
+ }
+
+ public static WeaponData Create(int entityId, WeaponType weaponType, int ownerId, CampType ownerCamp)
+ {
+ var dr = GameEntry.DataTable.GetDataTableRow((int)weaponType);
+ return weaponType switch
+ {
+ WeaponType.WeaponHandgun => new WeaponHandgunData(entityId, dr, ownerId, ownerCamp),
+ WeaponType.WeaponKnife => new WeaponKnifeData(entityId, dr, ownerId, ownerCamp),
+ WeaponType.WeaponSlash => new WeaponSlashData(entityId, dr, ownerId, ownerCamp),
+ WeaponType.WeaponLightning => new WeaponLightningData(entityId, dr, ownerId, ownerCamp),
+ WeaponType.WeaponLance => new WeaponLanceData(entityId, dr, ownerId, ownerCamp),
+ _ => throw new NotImplementedException()
+ };
+ }
+
+ public static WeaponData Create(int entityId, DRWeapon dr, int ownerId, CampType ownerCamp)
+ {
+ WeaponType type = (WeaponType)dr.Id;
+ return type switch
+ {
+ WeaponType.WeaponHandgun => new WeaponHandgunData(entityId, dr, ownerId, ownerCamp),
+ WeaponType.WeaponKnife => new WeaponKnifeData(entityId, dr, ownerId, ownerCamp),
+ WeaponType.WeaponSlash => new WeaponSlashData(entityId, dr, ownerId, ownerCamp),
+ WeaponType.WeaponLightning => new WeaponLightningData(entityId, dr, ownerId, ownerCamp),
+ WeaponType.WeaponLance => new WeaponLanceData(entityId, dr, ownerId, ownerCamp),
+ _ => throw new NotImplementedException()
+ };
+ }
+ }
+}
diff --git a/Assets/GameMain/Scripts/Runtime/Utility/EntityDataFactory.cs.meta b/Assets/GameMain/Scripts/Runtime/Utility/EntityDataFactory.cs.meta
new file mode 100644
index 0000000..a4e4a78
--- /dev/null
+++ b/Assets/GameMain/Scripts/Runtime/Utility/EntityDataFactory.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d562d735e382c1e4388ff5f7d3b57bd8
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/数据表/Entity/Enemy.xlsx b/数据表/Entity/Enemy.xlsx
index f50e4c5136252a629a1cbb123ec8f3eebd9aee22..5047bb3ba28e6b8681bf2732c6fd42941acc06bd 100644
GIT binary patch
delta 4039
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
delta 4075
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
R|9YI~Xah&lDy4qi{swaZT)qGR
diff --git a/数据表/Entity/Weapon.xlsx b/数据表/Entity/Weapon.xlsx
index 28a267a4ce5be1a17df58dc176dab62edfe05980..d2c93ce8396b7745fad23f527a5f47e55674c258 100644
GIT binary patch
delta 6996
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
o4gdhM|A1(~dwDr1|9O#w{J-Ola2&q>D{cta<{9
delta 6954
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