清理 Player 以及相关组件

This commit is contained in:
2026-09-15 11:31:20 +08:00
parent 88ed35e757
commit 1e4d3ef8d7
15 changed files with 150 additions and 134 deletions
Binary file not shown.
@@ -3,6 +3,9 @@
"weaponCapacity": 6, "weaponCapacity": 6,
"propMaxCount": -1, "propMaxCount": -1,
"playerEntity": "Player", "playerEntity": "Player",
"absorbSpeed": 15000,
"collectDistance": 350,
"defaultAbsorbRange": 3000,
"weaponRecycleRate": 300, "weaponRecycleRate": 300,
"shopGoodsCount": 4, "shopGoodsCount": 4,
"shopPriceRandomPercent": 50, "shopPriceRandomPercent": 50,
@@ -24,6 +27,10 @@
"projectileLifeTime": 3000, "projectileLifeTime": 3000,
"projectileHeightOffset": 600, "projectileHeightOffset": 600,
"projectileSpeed": 12000, "projectileSpeed": 12000,
"projectileEntity": "Projectile" "projectileEntity": "Projectile",
"damageTextYOffset": 1100,
"entityAsyncTimeout": 30000,
"enemyBodyRadius": 450,
"enemySeparationIterations": 2
} }
] ]
@@ -20,6 +20,9 @@ public sealed partial class GlobalConfig : Luban.BeanBase
PropMaxCount = _buf.ReadInt(); PropMaxCount = _buf.ReadInt();
PlayerEntity = _buf.ReadString(); PlayerEntity = _buf.ReadString();
PlayerEntity_Ref = null; PlayerEntity_Ref = null;
AbsorbSpeed = _buf.ReadInt();
CollectDistance = _buf.ReadInt();
DefaultAbsorbRange = _buf.ReadInt();
WeaponRecycleRate = _buf.ReadInt(); WeaponRecycleRate = _buf.ReadInt();
ShopGoodsCount = _buf.ReadInt(); ShopGoodsCount = _buf.ReadInt();
ShopPriceRandomPercent = _buf.ReadInt(); ShopPriceRandomPercent = _buf.ReadInt();
@@ -43,6 +46,10 @@ public sealed partial class GlobalConfig : Luban.BeanBase
ProjectileSpeed = _buf.ReadInt(); ProjectileSpeed = _buf.ReadInt();
ProjectileEntity = _buf.ReadString(); ProjectileEntity = _buf.ReadString();
ProjectileEntity_Ref = null; ProjectileEntity_Ref = null;
DamageTextYOffset = _buf.ReadInt();
EntityAsyncTimeout = _buf.ReadInt();
EnemyBodyRadius = _buf.ReadInt();
EnemySeparationIterations = _buf.ReadInt();
} }
public static GlobalConfig DeserializeGlobalConfig(ByteBuf _buf) public static GlobalConfig DeserializeGlobalConfig(ByteBuf _buf)
@@ -64,6 +71,18 @@ public sealed partial class GlobalConfig : Luban.BeanBase
public readonly string PlayerEntity; public readonly string PlayerEntity;
public EntityConfig PlayerEntity_Ref; public EntityConfig PlayerEntity_Ref;
/// <summary> /// <summary>
/// 自动收集速度
/// </summary>
public readonly int AbsorbSpeed;
/// <summary>
/// 自动收集距离
/// </summary>
public readonly int CollectDistance;
/// <summary>
/// 默认吸收距离
/// </summary>
public readonly int DefaultAbsorbRange;
/// <summary>
/// 武器回收价比例 /// 武器回收价比例
/// </summary> /// </summary>
public readonly int WeaponRecycleRate; public readonly int WeaponRecycleRate;
@@ -152,6 +171,22 @@ public sealed partial class GlobalConfig : Luban.BeanBase
/// </summary> /// </summary>
public readonly string ProjectileEntity; public readonly string ProjectileEntity;
public EntityConfig ProjectileEntity_Ref; public EntityConfig ProjectileEntity_Ref;
/// <summary>
/// 伤害数字高度偏移
/// </summary>
public readonly int DamageTextYOffset;
/// <summary>
/// 实体生成超时时间
/// </summary>
public readonly int EntityAsyncTimeout;
/// <summary>
/// 敌人碰撞半径
/// </summary>
public readonly int EnemyBodyRadius;
/// <summary>
/// 敌人分离迭代次数
/// </summary>
public readonly int EnemySeparationIterations;
public const int __ID__ = -958250779; public const int __ID__ = -958250779;
public override int GetTypeId() => __ID__; public override int GetTypeId() => __ID__;
@@ -178,11 +213,18 @@ public sealed partial class GlobalConfig : Luban.BeanBase
ProjectileEntity_Ref = tables.TbEntityConfig.GetOrDefault(ProjectileEntity); ProjectileEntity_Ref = tables.TbEntityConfig.GetOrDefault(ProjectileEntity);
} }
public override string ToString() public override string ToString()
@@ -191,6 +233,9 @@ public sealed partial class GlobalConfig : Luban.BeanBase
+ "weaponCapacity:" + WeaponCapacity + "," + "weaponCapacity:" + WeaponCapacity + ","
+ "propMaxCount:" + PropMaxCount + "," + "propMaxCount:" + PropMaxCount + ","
+ "playerEntity:" + PlayerEntity + "," + "playerEntity:" + PlayerEntity + ","
+ "absorbSpeed:" + AbsorbSpeed + ","
+ "collectDistance:" + CollectDistance + ","
+ "defaultAbsorbRange:" + DefaultAbsorbRange + ","
+ "weaponRecycleRate:" + WeaponRecycleRate + "," + "weaponRecycleRate:" + WeaponRecycleRate + ","
+ "shopGoodsCount:" + ShopGoodsCount + "," + "shopGoodsCount:" + ShopGoodsCount + ","
+ "shopPriceRandomPercent:" + ShopPriceRandomPercent + "," + "shopPriceRandomPercent:" + ShopPriceRandomPercent + ","
@@ -213,6 +258,10 @@ public sealed partial class GlobalConfig : Luban.BeanBase
+ "projectileHeightOffset:" + ProjectileHeightOffset + "," + "projectileHeightOffset:" + ProjectileHeightOffset + ","
+ "projectileSpeed:" + ProjectileSpeed + "," + "projectileSpeed:" + ProjectileSpeed + ","
+ "projectileEntity:" + ProjectileEntity + "," + "projectileEntity:" + ProjectileEntity + ","
+ "damageTextYOffset:" + DamageTextYOffset + ","
+ "entityAsyncTimeout:" + EntityAsyncTimeout + ","
+ "enemyBodyRadius:" + EnemyBodyRadius + ","
+ "enemySeparationIterations:" + EnemySeparationIterations + ","
+ "}"; + "}";
} }
} }
@@ -43,6 +43,18 @@ public partial class TbGlobalConfig
/// </summary> /// </summary>
public string PlayerEntity => _data.PlayerEntity; public string PlayerEntity => _data.PlayerEntity;
/// <summary> /// <summary>
/// 自动收集速度
/// </summary>
public int AbsorbSpeed => _data.AbsorbSpeed;
/// <summary>
/// 自动收集距离
/// </summary>
public int CollectDistance => _data.CollectDistance;
/// <summary>
/// 默认吸收距离
/// </summary>
public int DefaultAbsorbRange => _data.DefaultAbsorbRange;
/// <summary>
/// 武器回收价比例 /// 武器回收价比例
/// </summary> /// </summary>
public int WeaponRecycleRate => _data.WeaponRecycleRate; public int WeaponRecycleRate => _data.WeaponRecycleRate;
@@ -130,6 +142,22 @@ public partial class TbGlobalConfig
/// 投射物实体 /// 投射物实体
/// </summary> /// </summary>
public string ProjectileEntity => _data.ProjectileEntity; public string ProjectileEntity => _data.ProjectileEntity;
/// <summary>
/// 伤害数字高度偏移
/// </summary>
public int DamageTextYOffset => _data.DamageTextYOffset;
/// <summary>
/// 实体生成超时时间
/// </summary>
public int EntityAsyncTimeout => _data.EntityAsyncTimeout;
/// <summary>
/// 敌人碰撞半径
/// </summary>
public int EnemyBodyRadius => _data.EnemyBodyRadius;
/// <summary>
/// 敌人分离迭代次数
/// </summary>
public int EnemySeparationIterations => _data.EnemySeparationIterations;
public void ResolveRef(Tables tables) public void ResolveRef(Tables tables)
{ {
@@ -1,9 +1,3 @@
using System.Collections;
using System.Collections.Generic;
using GameFramework.Fsm;
using GameFramework.Procedure;
using UnityEngine;
namespace SepCore.Procedure namespace SepCore.Procedure
{ {
public abstract class GameStateBase public abstract class GameStateBase
@@ -7,11 +7,7 @@ namespace SepCore.Components
{ {
public class AbsorbComponent : MonoBehaviour public class AbsorbComponent : MonoBehaviour
{ {
[SerializeField] private float _absorbRangeBase = 3f;
[SerializeField] private float _absorbSpeed = 15f;
[SerializeField] private float _collectDistance = 0.35f;
[SerializeField] private int _maxDetectCount = 64; [SerializeField] private int _maxDetectCount = 64;
[SerializeField] private LayerMask _detectLayerMask = ~0;
private Player _player; private Player _player;
private Transform _target; private Transform _target;
@@ -21,38 +17,34 @@ namespace SepCore.Components
private StatProperty _absorbRangeStat; private StatProperty _absorbRangeStat;
private Action<modifier, bool> _absorbRangeStatCallback; private Action<modifier, bool> _absorbRangeStatCallback;
private float AbsorbRange => Mathf.Max(0f, (_absorbRangeBase + _absorbRangeStat.Value) * _absorbRangeStat.Percent); private float AbsorbRangeBase => GameEntry.Luban.Global.DefaultAbsorbRange / 1000f;
private float AbsorbSpeed => GameEntry.Luban.Global.AbsorbSpeed / 1000f;
private float CollectDistance => GameEntry.Luban.Global.CollectDistance / 1000f;
public void OnInit(Player player, StatComponent statComponent = null) private float AbsorbRange => Mathf.Max(0f, (AbsorbRangeBase + _absorbRangeStat.Value) * _absorbRangeStat.Percent);
public void OnInit(Player player, StatComponent statComponent)
{ {
_player = player; _player = player;
_target = player != null ? player.CachedTransform : null; _target = player.CachedTransform;
_statComponent = statComponent; _statComponent = statComponent;
_buffer = new Collider[Mathf.Max(1, _maxDetectCount)]; _buffer = new Collider[Mathf.Max(1, _maxDetectCount)];
if (_statComponent != null)
{
_absorbRangeStat = _statComponent.GetStat(StatType.AbsorbRange); _absorbRangeStat = _statComponent.GetStat(StatType.AbsorbRange);
_absorbRangeStatCallback = (modifier, isApply) => _absorbRangeStatCallback = (modifier, isApply) =>
_statComponent.UpdateStat(_absorbRangeStat, modifier, isApply); _statComponent.UpdateStat(_absorbRangeStat, modifier, isApply);
_statComponent.Subscribe(StatType.AbsorbRange, _absorbRangeStatCallback); _statComponent.Subscribe(StatType.AbsorbRange, _absorbRangeStatCallback);
} }
else
{
_absorbRangeStat = new StatProperty();
}
}
public void OnUpdate(float elapseSeconds, float realElapseSeconds) public void OnUpdate(float elapseSeconds, float realElapseSeconds)
{ {
if (_player == null || !_player.Available || _target == null || _buffer == null) return; if (!_player.Available) return;
int hitCount = Physics.OverlapSphereNonAlloc( int hitCount = Physics.OverlapSphereNonAlloc(
_target.position, _target.position,
AbsorbRange, AbsorbRange,
_buffer, _buffer,
_detectLayerMask, Constant.Layer.DropLayerMask
QueryTriggerInteraction.Collide
); );
for (int i = 0; i < hitCount; i++) for (int i = 0; i < hitCount; i++)
@@ -64,7 +56,7 @@ namespace SepCore.Components
if (coin != null && coin.Available) if (coin != null && coin.Available)
{ {
AbsorbDrop(coin.CachedTransform, elapseSeconds); AbsorbDrop(coin.CachedTransform, elapseSeconds);
coin.TryCollect(_player, _collectDistance); coin.TryCollect(_player, CollectDistance);
continue; continue;
} }
@@ -72,7 +64,7 @@ namespace SepCore.Components
if (exp != null && exp.Available) if (exp != null && exp.Available)
{ {
AbsorbDrop(exp.CachedTransform, elapseSeconds); AbsorbDrop(exp.CachedTransform, elapseSeconds);
exp.TryCollect(_player, _collectDistance); exp.TryCollect(_player, CollectDistance);
} }
} }
} }
@@ -93,8 +85,7 @@ namespace SepCore.Components
private void AbsorbDrop(Transform drop, float deltaTime) private void AbsorbDrop(Transform drop, float deltaTime)
{ {
if (drop == null || _target == null) return; drop.position = Vector3.MoveTowards(drop.position, _target.position, AbsorbSpeed * deltaTime);
drop.position = Vector3.MoveTowards(drop.position, _target.position, _absorbSpeed * deltaTime);
} }
} }
} }
@@ -1,24 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using SepCore.Entity;
using UnityEngine;
namespace SepCore.Components
{
public class AttackComponent : MonoBehaviour
{
private bool _isAttacking = false;
private List<WeaponBase> _weapons;
public void SetIsAttacking(bool isAttacking) => _isAttacking = isAttacking;
public void OnInit()
{
}
public void OnUpdate(float elapsedTime, float realElapseSeconds)
{
}
}
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: a2b35b5ae4185cb4cab2d84b0569db3d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -94,7 +94,6 @@ namespace SepCore.Components
public void SetWeaponState(bool state) public void SetWeaponState(bool state)
{ {
if (_weapons == null) return;
foreach (var weapon in _weapons) foreach (var weapon in _weapons)
{ {
weapon.SetEnabled(state); weapon.SetEnabled(state);
@@ -43,8 +43,6 @@ namespace SepCore.Components
{ {
_maxHealthBase = maxHealth; _maxHealthBase = maxHealth;
_currentHealth = maxHealth; _currentHealth = maxHealth;
_statComponent = statComponent;
_statComponent = statComponent; _statComponent = statComponent;
if (_statComponent != null) if (_statComponent != null)
{ {
@@ -98,7 +96,8 @@ namespace SepCore.Components
{ {
if (_isDead) return; if (_isDead) return;
if (_dodgeStat.Value > UnityEngine.Random.value) float maxDodge = GameEntry.Luban.Global.MaxDodgeRate / 1000f;
if (UnityEngine.Random.value < Mathf.Clamp(_dodgeStat.Value, 0f, maxDodge))
{ {
damage = 0; damage = 0;
} }
@@ -108,6 +107,8 @@ namespace SepCore.Components
float defensePercent = _defenseStat.Percent; float defensePercent = _defenseStat.Percent;
damage -= defenseValue; damage -= defenseValue;
damage = Mathf.CeilToInt(damage / defensePercent); damage = Mathf.CeilToInt(damage / defensePercent);
int minDamage = GameEntry.Luban.Global.MinDamage;
if (damage < minDamage) damage = minDamage;
} }
_currentHealth -= damage; _currentHealth -= damage;
@@ -118,8 +119,9 @@ namespace SepCore.Components
private void CauseDamage(int damage) private void CauseDamage(int damage)
{ {
if (damage <= 0 || GameEntry.DamageText == null) return; if (damage <= 0) return;
GameEntry.DamageText.ShowDamage(transform.position + Vector3.up * 1.1f, damage); float yOffset = GameEntry.Luban.Global.DamageTextYOffset / 1000f;
GameEntry.DamageText.ShowDamage(transform.position + Vector3.up * yOffset, damage);
} }
} }
} }
@@ -15,9 +15,6 @@ namespace SepCore.Components
GameEntry.InputModule.RegisterListener(InputActionId.Move, OnMove); GameEntry.InputModule.RegisterListener(InputActionId.Move, OnMove);
} }
public void OnUpdate(float elapseSeconds, float realElapseSeconds)
{
}
public void OnReset() public void OnReset()
{ {
@@ -13,8 +13,8 @@ namespace SepCore.Components
[SerializeField] private Vector3 _direction; [SerializeField] private Vector3 _direction;
[SerializeField] private Transform _cachedTransform; [SerializeField] private Transform _cachedTransform;
[SerializeField] private bool _avoidEnemyOverlap; [SerializeField] private bool _avoidEnemyOverlap;
[SerializeField] private float _enemyBodyRadius = 0.45f; [SerializeField] private float _enemyBodyRadius;
[SerializeField] private int _separationIterations = 2; [SerializeField] private int _separationIterations;
public float Speed => (_speedBase + _movementStat.Value) * _movementStat.Percent; public float Speed => (_speedBase + _movementStat.Value) * _movementStat.Percent;
public bool AvoidEnemyOverlap => _avoidEnemyOverlap; public bool AvoidEnemyOverlap => _avoidEnemyOverlap;
@@ -26,19 +26,24 @@ namespace SepCore.Components
[SerializeField] private float _speedBase; [SerializeField] private float _speedBase;
private StatComponent _statComponent; private StatComponent _statComponent;
private Player _player;
private EnemyBase _enemy;
private StatProperty _movementStat; private StatProperty _movementStat;
private Action<modifier, bool> _movementStatCallback; private Action<modifier, bool> _movementStatCallback;
public void OnInit(float speed, Transform target, StatComponent statComponent = null, public void OnInit(float speed, Transform target, StatComponent statComponent = null,
bool avoidEnemyOverlap = false, float enemyBodyRadius = 0.45f, int separationIterations = 2) bool avoidEnemyOverlap = false, float? enemyBodyRadius = null, int? separationIterations = null)
{ {
_speedBase = speed; _speedBase = speed;
_cachedTransform = target; _cachedTransform = target;
_direction = Vector3.forward; _direction = Vector3.forward;
_avoidEnemyOverlap = avoidEnemyOverlap; _avoidEnemyOverlap = avoidEnemyOverlap;
_enemyBodyRadius = Mathf.Max(0.01f, enemyBodyRadius); _enemyBodyRadius = Mathf.Max(0.01f, enemyBodyRadius ?? (GameEntry.Luban.Global.EnemyBodyRadius / 1000f));
_separationIterations = Mathf.Max(1, separationIterations); _separationIterations = Mathf.Max(1, separationIterations ?? GameEntry.Luban.Global.EnemySeparationIterations);
TryGetComponent(out _player);
TryGetComponent(out _enemy);
_statComponent = statComponent; _statComponent = statComponent;
if (_statComponent != null) if (_statComponent != null)
@@ -73,8 +78,10 @@ namespace SepCore.Components
_direction = Vector3.zero; _direction = Vector3.zero;
_isMoving = false; _isMoving = false;
_avoidEnemyOverlap = false; _avoidEnemyOverlap = false;
_enemyBodyRadius = 0.45f; _enemyBodyRadius = GameEntry.Luban.Global.EnemyBodyRadius / 1000f;
_separationIterations = 2; _separationIterations = GameEntry.Luban.Global.EnemySeparationIterations;
_player = null;
_enemy = null;
if (_statComponent != null) if (_statComponent != null)
{ {
@@ -86,8 +93,7 @@ namespace SepCore.Components
if (transformToUnregister != null) if (transformToUnregister != null)
{ {
var simulationWorld = GameEntry.SimulationWorld; GameEntry.SimulationWorld.UnregisterPlayerMovement(transformToUnregister);
simulationWorld?.UnregisterPlayerMovement(transformToUnregister);
} }
} }
@@ -112,12 +118,6 @@ namespace SepCore.Components
return; return;
} }
SimulationWorld simulationWorld = GameEntry.SimulationWorld;
if (simulationWorld == null)
{
return;
}
Vector3 direction = _direction; Vector3 direction = _direction;
direction.y = 0f; direction.y = 0f;
if (direction.sqrMagnitude > Mathf.Epsilon) if (direction.sqrMagnitude > Mathf.Epsilon)
@@ -125,15 +125,15 @@ namespace SepCore.Components
direction.Normalize(); direction.Normalize();
} }
if (TryGetComponent(out Player _)) if (_player != null)
{ {
simulationWorld.SyncPlayerMovementInput(_cachedTransform, _isMoving, direction, Speed); GameEntry.SimulationWorld.SyncPlayerMovementInput(_cachedTransform, _isMoving, direction, Speed);
return; return;
} }
if (TryGetComponent(out EnemyBase enemy)) if (_enemy != null)
{ {
simulationWorld.SyncEnemyMovementInput(enemy.Id, _isMoving, direction, Speed, GameEntry.SimulationWorld.SyncEnemyMovementInput(_enemy.Id, _isMoving, direction, Speed,
_avoidEnemyOverlap, _enemyBodyRadius, _separationIterations); _avoidEnemyOverlap, _enemyBodyRadius, _separationIterations);
} }
} }
@@ -7,13 +7,11 @@ namespace SepCore.Components
{ {
public class StatComponent : MonoBehaviour public class StatComponent : MonoBehaviour
{ {
private Dictionary<StatType, List<modifier>> _statModifiers; private readonly Dictionary<StatType, List<modifier>> _statModifiers = new();
private Dictionary<StatType, Action<modifier, bool>> _statModifierCallbacks; private readonly Dictionary<StatType, Action<modifier, bool>> _statModifierCallbacks = new();
public void OnInit() public void OnInit()
{ {
_statModifiers = new Dictionary<StatType, List<modifier>>();
_statModifierCallbacks = new Dictionary<StatType, Action<modifier, bool>>();
} }
public void OnReset() public void OnReset()
@@ -26,13 +24,10 @@ namespace SepCore.Components
{ {
if (!_statModifiers.TryGetValue(modifier.StatType, out var modifiers)) if (!_statModifiers.TryGetValue(modifier.StatType, out var modifiers))
{ {
_statModifiers.Add(modifier.StatType, modifiers = new List<modifier>()); modifiers = new List<modifier>();
modifiers.Add(modifier); _statModifiers.Add(modifier.StatType, modifiers);
} }
else
{
modifiers.Add(modifier); modifiers.Add(modifier);
}
if (_statModifierCallbacks.TryGetValue(modifier.StatType, out var callbacks)) if (_statModifierCallbacks.TryGetValue(modifier.StatType, out var callbacks))
callbacks?.Invoke(modifier, true); callbacks?.Invoke(modifier, true);
@@ -42,7 +37,7 @@ namespace SepCore.Components
{ {
if (_statModifiers.TryGetValue(modifier.StatType, out var modifiers)) if (_statModifiers.TryGetValue(modifier.StatType, out var modifiers))
{ {
_statModifiers[modifier.StatType].Remove(modifier); modifiers.Remove(modifier);
} }
if (_statModifierCallbacks.TryGetValue(modifier.StatType, out var callbacks)) if (_statModifierCallbacks.TryGetValue(modifier.StatType, out var callbacks))
@@ -64,7 +64,7 @@ namespace SepCore.Entity
get => _exp; get => _exp;
set set
{ {
if (_expRequires != null && _currentLevel + 1 < _expRequires.Length && value >= _expRequires[_currentLevel + 1]) if (_currentLevel + 1 < _expRequires.Length && value >= _expRequires[_currentLevel + 1])
{ {
value -= _expRequires[_currentLevel + 1]; value -= _expRequires[_currentLevel + 1];
_currentLevel++; _currentLevel++;
@@ -72,9 +72,9 @@ namespace SepCore.Entity
GameEntry.Event.Fire(this, PlayerLevelUpEventArgs.Create()); GameEntry.Event.Fire(this, PlayerLevelUpEventArgs.Create());
} }
int requiredExp = _expRequires != null && _currentLevel + 1 < _expRequires.Length int requiredExp = _currentLevel + 1 < _expRequires.Length
? _expRequires[_currentLevel + 1] ? _expRequires[_currentLevel + 1]
: 100; : _expRequires[^1];
GameEntry.Event.Fire(this, PlayerExpChangeEventArgs.Create(value, requiredExp)); GameEntry.Event.Fire(this, PlayerExpChangeEventArgs.Create(value, requiredExp));
_exp = value; _exp = value;
} }
@@ -84,24 +84,25 @@ namespace SepCore.Entity
public int PendingLevelPoints { get; set; } public int PendingLevelPoints { get; set; }
public IReadOnlyList<WeaponBase> Weapons => _backpackComponent != null ? _backpackComponent.Weapons : null; public IReadOnlyList<WeaponBase> Weapons => _backpackComponent.Weapons;
public IReadOnlyList<PropItem> Props => _backpackComponent != null ? _backpackComponent.Props : null; public IReadOnlyList<PropItem> Props => _backpackComponent.Props;
public int WeaponCapacity => _backpackComponent != null ? _backpackComponent.WeaponCapacity : 0; public int WeaponCapacity => _backpackComponent.WeaponCapacity;
public bool AddProp(PropItem prop) public bool AddProp(PropItem prop)
{ {
if (prop == null || _backpackComponent == null) return false; if (prop == null) return false;
return _backpackComponent.AttachProp(prop); return _backpackComponent.AttachProp(prop);
} }
public async UniTask<WeaponBase> AddWeaponAsync(WeaponData weaponData, float timeout = 30f) public async UniTask<WeaponBase> AddWeaponAsync(WeaponData weaponData, float? timeout = null)
{ {
if (weaponData == null || _backpackComponent == null) if (weaponData == null)
{ {
return null; return null;
} }
WeaponBase weapon = await GameEntry.Entity.ShowWeaponAsync(weaponData, timeout); float actualTimeout = timeout ?? (GameEntry.Luban.Global.EntityAsyncTimeout / 1000f);
WeaponBase weapon = await GameEntry.Entity.ShowWeaponAsync(weaponData, actualTimeout);
if (weapon == null) if (weapon == null)
{ {
return null; return null;
@@ -118,7 +119,7 @@ namespace SepCore.Entity
public bool RemoveWeapon(WeaponBase weapon) public bool RemoveWeapon(WeaponBase weapon)
{ {
if (weapon == null || _backpackComponent == null) if (weapon == null)
{ {
return false; return false;
} }
@@ -150,7 +151,7 @@ namespace SepCore.Entity
public void SetWeaponEnabled(bool enabled) public void SetWeaponEnabled(bool enabled)
{ {
_weaponEnabled = enabled; _weaponEnabled = enabled;
_backpackComponent?.SetWeaponState(_enable && _weaponEnabled); _backpackComponent.SetWeaponState(_enable && _weaponEnabled);
} }
public void InitRole(RoleConfig role, LevelExperienceConfig expConfig) public void InitRole(RoleConfig role, LevelExperienceConfig expConfig)
@@ -168,22 +169,18 @@ namespace SepCore.Entity
AddWeaponAsync(EntityDataFactory.Create(GameEntry.Entity.NextId(), WeaponType.Knife, Id, _playerData.Camp)).Forget(); AddWeaponAsync(EntityDataFactory.Create(GameEntry.Entity.NextId(), WeaponType.Knife, Id, _playerData.Camp)).Forget();
// StatComponent // StatComponent
if (role.Modifiers != null)
{
foreach (var modifier in role.Modifiers) foreach (var modifier in role.Modifiers)
{ {
_statComponent.AddModifier(modifier); _statComponent.AddModifier(modifier);
} }
}
_expRequires = expConfig != null ? expConfig.ToTargetLevelArray() : null; _expRequires = expConfig.ToTargetLevelArray();
// Fire Events // Fire Events
GameEntry.Event.Fire(this, GameEntry.Event.Fire(this,
PlayerHealthChangeEventArgs.Create(0, _healthComponent.CurrentHealth, _healthComponent.MaxHealth)); PlayerHealthChangeEventArgs.Create(0, _healthComponent.CurrentHealth, _healthComponent.MaxHealth));
int initialTargetExp = _expRequires != null && _expRequires.Length > 1 ? _expRequires[1] : 100; GameEntry.Event.Fire(this, PlayerExpChangeEventArgs.Create(0, _expRequires[1]));
GameEntry.Event.Fire(this, PlayerExpChangeEventArgs.Create(0, initialTargetExp));
GameEntry.Event.Fire(this, PlayerCoinChangeEventArgs.Create(Coin, Coin)); GameEntry.Event.Fire(this, PlayerCoinChangeEventArgs.Create(Coin, Coin));
} }
@@ -203,13 +200,7 @@ namespace SepCore.Entity
_movementComponent = GetComponent<MovementComponent>(); _movementComponent = GetComponent<MovementComponent>();
_absorbComponent = GetComponent<AbsorbComponent>(); _absorbComponent = GetComponent<AbsorbComponent>();
_statComponent = GetComponent<StatComponent>(); _statComponent = GetComponent<StatComponent>();
_healthComponent = GetComponent<HealthComponent>();
_backpackComponent = GetComponent<BackpackComponent>(); _backpackComponent = GetComponent<BackpackComponent>();
if (_absorbComponent == null)
{
_absorbComponent = gameObject.AddComponent<AbsorbComponent>();
}
} }
protected override void OnShow(object userData) protected override void OnShow(object userData)
@@ -235,8 +226,6 @@ namespace SepCore.Entity
{ {
base.OnUpdate(elapseSeconds, realElapseSeconds); base.OnUpdate(elapseSeconds, realElapseSeconds);
_inputComponent.OnUpdate(elapseSeconds, realElapseSeconds);
_movementComponent.SetDirection(_inputComponent.Direction); _movementComponent.SetDirection(_inputComponent.Direction);
_absorbComponent.OnUpdate(elapseSeconds, realElapseSeconds); _absorbComponent.OnUpdate(elapseSeconds, realElapseSeconds);
} }
Binary file not shown.