feat: add energy system

This commit is contained in:
Bragin Stepan
2026-02-22 15:03:12 +05:00
parent c73c15dd4a
commit 809958ec35
11 changed files with 472 additions and 0 deletions

View File

@@ -628,6 +628,284 @@ namespace _Project.Develop.Runtime.Entities
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Lifetime.DisableCollidersOnDeath() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CurrentEnergy CurrentEnergyC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CurrentEnergy>();
public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32> CurrentEnergy => CurrentEnergyC.Value;
public bool TryGetCurrentEnergy(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32> value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CurrentEnergy component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32>);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddCurrentEnergy()
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CurrentEnergy() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32>() });
}
public _Project.Develop.Runtime.Entities.Entity AddCurrentEnergy(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32> value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CurrentEnergy() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.MaxEnergy MaxEnergyC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.MaxEnergy>();
public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32> MaxEnergy => MaxEnergyC.Value;
public bool TryGetMaxEnergy(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32> value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.MaxEnergy component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32>);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddMaxEnergy()
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.MaxEnergy() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32>() });
}
public _Project.Develop.Runtime.Entities.Entity AddMaxEnergy(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32> value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.MaxEnergy() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanUseEnergy CanUseEnergyC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanUseEnergy>();
public _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition CanUseEnergy => CanUseEnergyC.Value;
public bool TryGetCanUseEnergy(out _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanUseEnergy component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddCanUseEnergy(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanUseEnergy() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyRequest UseEnergyRequestC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyRequest>();
public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> UseEnergyRequest => UseEnergyRequestC.Value;
public bool TryGetUseEnergyRequest(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyRequest component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32>);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddUseEnergyRequest()
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyRequest() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32>() });
}
public _Project.Develop.Runtime.Entities.Entity AddUseEnergyRequest(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyRequest() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyEvent UseEnergyEventC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyEvent>();
public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> UseEnergyEvent => UseEnergyEventC.Value;
public bool TryGetUseEnergyEvent(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyEvent component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32>);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddUseEnergyEvent()
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyEvent() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32>() });
}
public _Project.Develop.Runtime.Entities.Entity AddUseEnergyEvent(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyEvent() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanRegenEnergy CanRegenEnergyC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanRegenEnergy>();
public _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition CanRegenEnergy => CanRegenEnergyC.Value;
public bool TryGetCanRegenEnergy(out _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanRegenEnergy component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddCanRegenEnergy(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanRegenEnergy() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyRequest RegenEnergyRequestC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyRequest>();
public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> RegenEnergyRequest => RegenEnergyRequestC.Value;
public bool TryGetRegenEnergyRequest(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyRequest component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32>);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddRegenEnergyRequest()
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyRequest() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32>() });
}
public _Project.Develop.Runtime.Entities.Entity AddRegenEnergyRequest(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyRequest() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyEvent RegenEnergyEventC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyEvent>();
public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> RegenEnergyEvent => RegenEnergyEventC.Value;
public bool TryGetRegenEnergyEvent(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyEvent component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32>);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddRegenEnergyEvent()
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyEvent() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32>() });
}
public _Project.Develop.Runtime.Entities.Entity AddRegenEnergyEvent(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Int32> value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyEvent() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.AutoRegenEnergyAmount AutoRegenEnergyAmountC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.AutoRegenEnergyAmount>();
public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32> AutoRegenEnergyAmount => AutoRegenEnergyAmountC.Value;
public bool TryGetAutoRegenEnergyAmount(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32> value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.AutoRegenEnergyAmount component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32>);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddAutoRegenEnergyAmount()
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.AutoRegenEnergyAmount() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32>() });
}
public _Project.Develop.Runtime.Entities.Entity AddAutoRegenEnergyAmount(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Int32> value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.AutoRegenEnergyAmount() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.InAutoRegenEnergy InAutoRegenEnergyC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.InAutoRegenEnergy>();
public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Boolean> InAutoRegenEnergy => InAutoRegenEnergyC.Value;
public bool TryGetInAutoRegenEnergy(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Boolean> value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.InAutoRegenEnergy component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Boolean>);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddInAutoRegenEnergy()
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.InAutoRegenEnergy() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Boolean>() });
}
public _Project.Develop.Runtime.Entities.Entity AddInAutoRegenEnergy(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Boolean> value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.InAutoRegenEnergy() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenInitialTime EnergyAutoRegenInitialTimeC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenInitialTime>();
public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Single> EnergyAutoRegenInitialTime => EnergyAutoRegenInitialTimeC.Value;
public bool TryGetEnergyAutoRegenInitialTime(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Single> value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenInitialTime component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Single>);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddEnergyAutoRegenInitialTime()
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenInitialTime() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Single>() });
}
public _Project.Develop.Runtime.Entities.Entity AddEnergyAutoRegenInitialTime(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Single> value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenInitialTime() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenCurrentTime EnergyAutoRegenCurrentTimeC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenCurrentTime>();
public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Single> EnergyAutoRegenCurrentTime => EnergyAutoRegenCurrentTimeC.Value;
public bool TryGetEnergyAutoRegenCurrentTime(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Single> value)
{
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenCurrentTime component);
if(result)
value = component.Value;
else
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Single>);
return result;
}
public _Project.Develop.Runtime.Entities.Entity AddEnergyAutoRegenCurrentTime()
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenCurrentTime() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Single>() });
}
public _Project.Develop.Runtime.Entities.Entity AddEnergyAutoRegenCurrentTime(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable<System.Single> value)
{
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenCurrentTime() {Value = value});
}
public _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageRequest TakeDamageRequestC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageRequest>();
public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Single> TakeDamageRequest => TakeDamageRequestC.Value;

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c78247f0460346b9ac065e10c8200ad1
timeCreated: 1771750078

View File

@@ -0,0 +1,23 @@
using _Project.Develop.Runtime.Entities;
using _Project.Develop.Runtime.Utilities.Conditions;
using _Project.Develop.Runtime.Utils.ReactiveManagement;
using _Project.Develop.Runtime.Utils.ReactiveManagement.Event;
namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy
{
public class CurrentEnergy : IEntityComponent { public ReactiveVariable<int> Value; }
public class MaxEnergy : IEntityComponent { public ReactiveVariable<int> Value; }
public class CanUseEnergy : IEntityComponent { public ICompositeCondition Value; }
public class UseEnergyRequest : IEntityComponent { public ReactiveEvent<int> Value; }
public class UseEnergyEvent : IEntityComponent { public ReactiveEvent<int> Value; }
public class CanRegenEnergy : IEntityComponent { public ICompositeCondition Value; }
public class RegenEnergyRequest : IEntityComponent { public ReactiveEvent<int> Value; }
public class RegenEnergyEvent : IEntityComponent { public ReactiveEvent<int> Value; }
public class AutoRegenEnergyAmount : IEntityComponent { public ReactiveVariable<int> Value; }
public class InAutoRegenEnergy : IEntityComponent { public ReactiveVariable<bool> Value; }
public class EnergyAutoRegenInitialTime : IEntityComponent { public ReactiveVariable<float> Value; }
public class EnergyAutoRegenCurrentTime : IEntityComponent { public ReactiveVariable<float> Value; }
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a68596f1e7224a52a8b0fd4f8fa6d615
timeCreated: 1771750088

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 42c288d27514401b8476a278887ed7b2
timeCreated: 1771750377

View File

@@ -0,0 +1,43 @@
using _Project.Develop.Runtime.Entities;
using _Project.Develop.Runtime.Utils.ReactiveManagement;
using _Project.Develop.Runtime.Utils.ReactiveManagement.Event;
namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems
{
public class AutoRegenEnergyTimerSystem : IInitializableSystem, IUpdatableSystem
{
private ReactiveEvent<int> _regenEnergyRequest;
private ReactiveVariable<float> _initialTime;
private ReactiveVariable<float> _currentTime;
private ReactiveVariable<int> _regenAmount;
private ReactiveVariable<bool> _inAutoRegen;
public void OnInit(Entity entity)
{
_inAutoRegen = entity.InAutoRegenEnergy;
_regenAmount = entity.AutoRegenEnergyAmount;
_initialTime = entity.EnergyAutoRegenInitialTime;
_currentTime = entity.EnergyAutoRegenCurrentTime;
}
public void OnUpdate(float deltaTime)
{
if (_inAutoRegen.Value == false)
return;
_currentTime.Value += deltaTime;
if (TimeIsDone(_currentTime.Value))
{
_currentTime.Value = 0;
_regenEnergyRequest.Invoke(_regenAmount.Value);
}
}
private bool TimeIsDone(float currentTime) => currentTime >= _initialTime.Value;
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 13f11edf9c9548bbbe68d2762342dfac
timeCreated: 1771751485

View File

@@ -0,0 +1,60 @@
using System;
using _Project.Develop.Runtime.Entities;
using _Project.Develop.Runtime.Utilities.Conditions;
using _Project.Develop.Runtime.Utils.ReactiveManagement;
using _Project.Develop.Runtime.Utils.ReactiveManagement.Event;
using Unity.Mathematics;
namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems
{
public class RegenEnergySystem : IInitializableSystem, IDisposableSystem
{
private ReactiveEvent<int> _regenEnergyRequest;
private ReactiveEvent<int> _regenEnergyEvent;
private ReactiveVariable<int> _currentEnergy;
private ReactiveVariable<int> _maxEnergy;
private ICompositeCondition _canRegen;
private IDisposable _regenRequestDispose;
public void OnInit(Entity entity)
{
_currentEnergy = entity.CurrentEnergy;
_maxEnergy = entity.MaxEnergy;
_regenEnergyRequest = entity.RegenEnergyRequest;
_regenEnergyEvent = entity.RegenEnergyEvent;
_canRegen = entity.CanRegenEnergy;
_regenRequestDispose = _regenEnergyRequest.Subscribe(OnRegenRequest);
}
private void OnRegenRequest(int value)
{
if (value <= 0)
throw new ArgumentException($"Energy regen value must be positive. Received: {value}", nameof(value));
if (_canRegen.Evaluate() == false)
return;
int energyDifference = _maxEnergy.Value - _currentEnergy.Value;
if (energyDifference <= 0f)
return;
int valueAdded = math.min(value, energyDifference);
_currentEnergy.Value += valueAdded;
_regenEnergyEvent.Invoke(value);
}
public void OnDispose()
{
_regenRequestDispose.Dispose();
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8ca447304efc4cf89e9aa4255df05e93
timeCreated: 1771754143

View File

@@ -0,0 +1,50 @@
using System;
using _Project.Develop.Runtime.Entities;
using _Project.Develop.Runtime.Utilities.Conditions;
using _Project.Develop.Runtime.Utils.ReactiveManagement;
using _Project.Develop.Runtime.Utils.ReactiveManagement.Event;
namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems
{
public class UseEnergySystem : IInitializableSystem, IDisposableSystem
{
private ReactiveEvent<int> _useEnergyRequest;
private ReactiveEvent<int> _useEnergyEvent;
private ReactiveVariable<int> _currentEnergy;
private ICompositeCondition _canUse;
private IDisposable _useRequestDispose;
public void OnInit(Entity entity)
{
_currentEnergy = entity.CurrentEnergy;
_useEnergyRequest = entity.RegenEnergyRequest;
_useEnergyEvent = entity.RegenEnergyEvent;
_canUse = entity.CanRegenEnergy;
_useRequestDispose = _useEnergyRequest.Subscribe(OnRegenRequest);
}
private void OnRegenRequest(int value)
{
if (value <= 0)
throw new ArgumentException($"Energy use value must be positive. Received: {value}", nameof(value));
if (_canUse.Evaluate() == false || _currentEnergy.Value < value)
return;
_currentEnergy.Value -= value;
_useEnergyEvent.Invoke(value);
}
public void OnDispose()
{
_useRequestDispose.Dispose();
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8fd8b95b8162461c995fd1c494efc614
timeCreated: 1771754446