迁移 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

View File

@ -1,6 +1,3 @@
using Components;
using Entity;
using Entity.EntityData;
using SepCore.DataTable; using SepCore.DataTable;
namespace SepCore.Definition namespace SepCore.Definition
@ -35,23 +32,5 @@ namespace SepCore.Definition
Rarity = rarity; Rarity = rarity;
IconAssetName = iconAssetName; 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);
}
}
} }
} }

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: cedb6e3c4b92edf4bbbe5fb34bb043ba
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

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

View File

@ -3,31 +3,20 @@ using System.Collections.Generic;
using SepCore.DataTable; using SepCore.DataTable;
using SepCore.Definition; using SepCore.Definition;
using UnityEngine; using UnityEngine;
using UnityGameFramework.Runtime;
namespace Entity.EntityData namespace Entity.EntityData
{ {
[Serializable] [Serializable]
public class EnemyData : TargetableObjectData public class EnemyData : TargetableObjectData
{ {
[SerializeField] private DREnemy _drEnemy; private DREnemy _drEnemy;
public EnemyData(int entityId, EnemyType enemyType, int level) : base( public EnemyData(int entityId, DREnemy drEnemy, int level) : base(
entityId, (int)enemyType, CampType.Enemy) entityId, drEnemy.Id, CampType.Enemy)
{ {
DREnemy enemyRow = GameEntry.DataTable.GetDataTableRow<DREnemy>((int)enemyType); _drEnemy = drEnemy;
if (enemyRow == null)
{
throw new Exception($"Enemy data table row is missing, EnemyType='{enemyType}'.");
}
else
{
_drEnemy = enemyRow;
}
int effectiveLevel = Mathf.Max(1, level); 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; public EnemyType EnemyType => (EnemyType)_drEnemy.Id;

View File

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

View File

@ -1,5 +1,4 @@
using System; using System;
using SepCore.DataTable;
using SepCore.Definition; using SepCore.Definition;
namespace Entity.EntityData namespace Entity.EntityData

View File

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

View File

@ -13,17 +13,11 @@ namespace Entity.EntityData
private int _entityTypeId = 0; private int _entityTypeId = 0;
public WeaponData(int entityId, WeaponType weaponType, int ownerId, CampType ownerCamp) public WeaponData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
: base(entityId, (int)weaponType, ownerId, ownerCamp) : base(entityId, drWeapon.Id, ownerId, ownerCamp)
{ {
_drWeapon = GameEntry.DataTable.GetDataTableRow<DRWeapon>((int)weaponType); _drWeapon = drWeapon;
_entityTypeId = drWeapon.EntityTypeId;
if (_drWeapon == null)
{
throw new Exception($"Weapon data table row is missing, WeaponType='{weaponType}'.");
}
_entityTypeId = _drWeapon.EntityTypeId;
} }
public WeaponType WeaponType => (WeaponType)_drWeapon.Id; public WeaponType WeaponType => (WeaponType)_drWeapon.Id;

View File

@ -1,4 +1,5 @@
using System; using System;
using SepCore.DataTable;
using SepCore.Definition; using SepCore.Definition;
namespace Entity.EntityData namespace Entity.EntityData
@ -12,8 +13,8 @@ namespace Entity.EntityData
{ {
public WeaponHandgunParamsData ParamsData { get; } public WeaponHandgunParamsData ParamsData { get; }
public WeaponHandgunData(int entityId, int ownerId, CampType ownerCamp) public WeaponHandgunData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
: base(entityId, WeaponType.WeaponHandgun, ownerId, ownerCamp) : base(entityId, drWeapon, ownerId, ownerCamp)
{ {
ParamsData = ParseParams<WeaponHandgunParamsData>(); ParamsData = ParseParams<WeaponHandgunParamsData>();
} }

View File

@ -1,4 +1,5 @@
using System; using System;
using SepCore.DataTable;
using SepCore.Definition; using SepCore.Definition;
namespace Entity.EntityData namespace Entity.EntityData
@ -13,8 +14,8 @@ namespace Entity.EntityData
{ {
public WeaponKnifeParamsData ParamsData { get; } public WeaponKnifeParamsData ParamsData { get; }
public WeaponKnifeData(int entityId, int ownerId, CampType ownerCamp) : base(entityId, WeaponType.WeaponKnife, public WeaponKnifeData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
ownerId, ownerCamp) : base(entityId, drWeapon, ownerId, ownerCamp)
{ {
ParamsData = ParseParams<WeaponKnifeParamsData>(); ParamsData = ParseParams<WeaponKnifeParamsData>();
} }

View File

@ -1,4 +1,5 @@
using System; using System;
using SepCore.DataTable;
using SepCore.Definition; using SepCore.Definition;
namespace Entity.EntityData namespace Entity.EntityData
@ -62,8 +63,8 @@ namespace Entity.EntityData
{ {
public WeaponLanceParamsData ParamsData { get; } public WeaponLanceParamsData ParamsData { get; }
public WeaponLanceData(int entityId, int ownerId, CampType ownerCamp) public WeaponLanceData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
: base(entityId, WeaponType.WeaponLance, ownerId, ownerCamp) : base(entityId, drWeapon, ownerId, ownerCamp)
{ {
ParamsData = ParseParams<WeaponLanceParamsData>(); ParamsData = ParseParams<WeaponLanceParamsData>();
} }

View File

@ -1,4 +1,5 @@
using System; using System;
using SepCore.DataTable;
using SepCore.Definition; using SepCore.Definition;
namespace Entity.EntityData namespace Entity.EntityData
@ -14,8 +15,8 @@ namespace Entity.EntityData
{ {
public WeaponLightningParamsData ParamsData { get; } public WeaponLightningParamsData ParamsData { get; }
public WeaponLightningData(int entityId, int ownerId, CampType ownerCamp) public WeaponLightningData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
: base(entityId, WeaponType.WeaponLightning, ownerId, ownerCamp) : base(entityId, drWeapon, ownerId, ownerCamp)
{ {
ParamsData = ParseParams<WeaponLightningParamsData>(); ParamsData = ParseParams<WeaponLightningParamsData>();
} }

View File

@ -1,4 +1,5 @@
using System; using System;
using SepCore.DataTable;
using SepCore.Definition; using SepCore.Definition;
namespace Entity.EntityData namespace Entity.EntityData
@ -13,8 +14,8 @@ namespace Entity.EntityData
{ {
public WeaponSlashParamsData ParamsData { get; } public WeaponSlashParamsData ParamsData { get; }
public WeaponSlashData(int entityId, int ownerId, CampType ownerCamp) public WeaponSlashData(int entityId, DRWeapon drWeapon, int ownerId, CampType ownerCamp)
: base(entityId, WeaponType.WeaponSlash, ownerId, ownerCamp) : base(entityId, drWeapon, ownerId, ownerCamp)
{ {
ParamsData = ParseParams<WeaponSlashParamsData>(); ParamsData = ParseParams<WeaponSlashParamsData>();
} }

View File

@ -1,5 +1,4 @@
using GameFramework; using System.IO;
using System.IO;
using UnityEngine; using UnityEngine;
using UnityGameFramework.Editor; using UnityGameFramework.Editor;
using UnityGameFramework.Editor.ResourceTools; using UnityGameFramework.Editor.ResourceTools;
@ -8,16 +7,20 @@ namespace SepCore.Editor
{ {
public static class GameFrameworkConfigs public static class GameFrameworkConfigs
{ {
[BuildSettingsConfigPath] [BuildSettingsConfigPath] public static string BuildSettingsConfig =
public static string BuildSettingsConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/BuildSettings.xml")); GameFramework.Utility.Path.GetRegularPath(Path.Combine(Application.dataPath,
"GameMain/Configs/BuildSettings.xml"));
[ResourceCollectionConfigPath] [ResourceCollectionConfigPath] public static string ResourceCollectionConfig =
public static string ResourceCollectionConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/ResourceCollection.xml")); GameFramework.Utility.Path.GetRegularPath(Path.Combine(Application.dataPath,
"GameMain/Configs/ResourceCollection.xml"));
[ResourceEditorConfigPath] [ResourceEditorConfigPath] public static string ResourceEditorConfig =
public static string ResourceEditorConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/ResourceEditor.xml")); GameFramework.Utility.Path.GetRegularPath(Path.Combine(Application.dataPath,
"GameMain/Configs/ResourceEditor.xml"));
[ResourceBuilderConfigPath] [ResourceBuilderConfigPath] public static string ResourceBuilderConfig =
public static string ResourceBuilderConfig = Utility.Path.GetRegularPath(Path.Combine(Application.dataPath, "GameMain/Configs/ResourceBuilder.xml")); GameFramework.Utility.Path.GetRegularPath(Path.Combine(Application.dataPath,
"GameMain/Configs/ResourceBuilder.xml"));
} }
} }

View File

@ -10,17 +10,19 @@ namespace SepCore.Editor
{ {
public bool ContinueOnFailure public bool ContinueOnFailure
{ {
get get { return false; }
{
return false;
}
} }
public void OnPreprocessAllPlatforms(string productName, string companyName, string gameIdentifier, string gameFrameworkVersion, string unityVersion, string applicableGameVersion, int internalResourceVersion, public void OnPreprocessAllPlatforms(string productName, string companyName, string gameIdentifier,
Platform platforms, AssetBundleCompressionType assetBundleCompression, string compressionHelperTypeName, bool additionalCompressionSelected, bool forceRebuildAssetBundleSelected, string buildEventHandlerTypeName, string outputDirectory, BuildAssetBundleOptions buildAssetBundleOptions, string gameFrameworkVersion, string unityVersion, string applicableGameVersion, int internalResourceVersion,
string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath, string buildReportPath) 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); string[] fileNames = Directory.GetFiles(streamingAssetsPath, "*", SearchOption.AllDirectories);
foreach (string fileName in fileNames) foreach (string fileName in fileNames)
{ {
@ -32,28 +34,39 @@ namespace SepCore.Editor
File.Delete(fileName); 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, public void OnPostprocessAllPlatforms(string productName, string companyName, string gameIdentifier,
Platform platforms, AssetBundleCompressionType assetBundleCompression, string compressionHelperTypeName, bool additionalCompressionSelected, bool forceRebuildAssetBundleSelected, string buildEventHandlerTypeName, string outputDirectory, BuildAssetBundleOptions buildAssetBundleOptions, string gameFrameworkVersion, string unityVersion, string applicableGameVersion, int internalResourceVersion,
string workingPath, bool outputPackageSelected, string outputPackagePath, bool outputFullSelected, string outputFullPath, bool outputPackedSelected, string outputPackedPath, string buildReportPath) 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) if (!outputPackageSelected)
{ {
@ -65,11 +78,13 @@ namespace SepCore.Editor
return; 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); string[] fileNames = Directory.GetFiles(outputPackagePath, "*", SearchOption.AllDirectories);
foreach (string fileName in fileNames) 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); FileInfo destFileInfo = new FileInfo(destFileName);
if (!destFileInfo.Directory.Exists) if (!destFileInfo.Directory.Exists)
{ {

View File

@ -81,14 +81,21 @@ namespace Components
public bool AttachProp(PropItem prop) public bool AttachProp(PropItem prop)
{ {
_props.Add(prop); _props.Add(prop);
prop.OnAttach(_statComponent); foreach (var modifier in prop.Modifiers)
{
_statComponent.AddModifier(modifier);
}
return true; return true;
} }
public bool DetachProp(PropItem prop) public bool DetachProp(PropItem prop)
{ {
_props.Remove(prop); _props.Remove(prop);
prop.OnDetach(_statComponent); foreach (var modifier in prop.Modifiers)
{
_statComponent.RemoveModifier(modifier);
}
return true; return true;
} }

View File

@ -4,6 +4,7 @@ using SepCore.Definition;
using Entity; using Entity;
using Entity.EntityData; using Entity.EntityData;
using GameFramework.Event; using GameFramework.Event;
using SepCore.Utility;
using UnityEngine; using UnityEngine;
using UnityGameFramework.Runtime; using UnityGameFramework.Runtime;
using Random = UnityEngine.Random; using Random = UnityEngine.Random;
@ -136,10 +137,8 @@ namespace CustomComponent
if (_currentEnemyCount >= _spawnEnemyMaxCount) return; if (_currentEnemyCount >= _spawnEnemyMaxCount) return;
int entityPoolId = _currentSpawnEnemyId % _spawnEnemyMaxCount; int entityPoolId = _currentSpawnEnemyId % _spawnEnemyMaxCount;
var enemyData = new EnemyData(entityPoolId, enemyType, _currentLevel) var enemyData = EntityDataFactory.Create(entityPoolId, enemyType, _currentLevel);
{ enemyData.Position = GetRandomPosition();
Position = GetRandomPosition()
};
_entity.ShowEnemy(enemyData); _entity.ShowEnemy(enemyData);
_currentSpawnEnemyId++; _currentSpawnEnemyId++;
} }

View File

@ -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;
}
/// <summary>
/// 拥有者编号。
/// </summary>
public int OwnerId
{
get
{
return m_OwnerId;
}
}
/// <summary>
/// 拥有者阵营。
/// </summary>
public CampType OwnerCamp
{
get
{
return m_OwnerCamp;
}
}
}
}

View File

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

View File

@ -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;
}
/// <summary>
/// 实体编号。
/// </summary>
public int Id => m_Id;
/// <summary>
/// 实体类型编号。
/// </summary>
public int TypeId => m_TypeId;
/// <summary>
/// 实体位置。
/// </summary>
public Vector3 Position
{
get => m_Position;
set => m_Position = value;
}
/// <summary>
/// 实体朝向。
/// </summary>
public Quaternion Rotation
{
get => m_Rotation;
set => m_Rotation = value;
}
}
}

View File

@ -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;
}
/// <summary>
/// 角色阵营。
/// </summary>
public CampType Camp => _camp;
/// <summary>
/// 最大生命。
/// </summary>
public abstract int MaxHealthBase
{
get;
}
}
}

View File

@ -7,6 +7,7 @@ using Entity.EntityData;
using GameFramework.Event; using GameFramework.Event;
using UnityGameFramework.Runtime; using UnityGameFramework.Runtime;
using Entity.Weapon; using Entity.Weapon;
using SepCore.Utility;
namespace Entity namespace Entity
{ {
@ -140,7 +141,8 @@ namespace Entity
// BackpackComponent // BackpackComponent
Coin = role.Coin; Coin = role.Coin;
_backpackComponent.OnInit(this, role.WeaponCapacity); _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 // StatComponent
foreach (var modifier in role.InitialProperties) foreach (var modifier in role.InitialProperties)

View File

@ -7,6 +7,7 @@ using Entity;
using Entity.EntityData; using Entity.EntityData;
using CustomUtility; using CustomUtility;
using GameFramework.DataTable; using GameFramework.DataTable;
using SepCore.Utility;
using UnityEngine; using UnityEngine;
using UnityGameFramework.Runtime; using UnityGameFramework.Runtime;
using Random = UnityEngine.Random; using Random = UnityEngine.Random;
@ -352,14 +353,10 @@ namespace SepCore.UI
return null; return null;
} }
DRWeapon drWeapon = _weaponDataTable != null ? _weaponDataTable.GetDataRow(goods.GoodsTypeId) : null; DRWeapon drWeapon = _weaponDataTable.GetDataRow(goods.GoodsTypeId);
if (drWeapon == null)
{
Log.Warning($"ShopFormUseCase::ApplyGoodsPurchase: Missing DRWeapon, id = {goods.GoodsTypeId}");
return null;
}
var weaponData = CreateWeaponData(goods.GoodsTypeId); var weaponData = EntityDataFactory.Create(GameEntry.Entity.GenerateSerialId(), drWeapon, Player.Id,
CampType.Player);
if (weaponData == null) if (weaponData == null)
{ {
Log.Warning( Log.Warning(
@ -380,30 +377,6 @@ namespace SepCore.UI
return null; 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) public bool TryRecycleWeapon(int argsIndex, int argsPrice)
{ {
Player player = Player; Player player = Player;

View File

@ -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<DREnemy>((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<DRWeapon>((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()
};
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d562d735e382c1e4388ff5f7d3b57bd8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.