mirror of
https://github.com/Bragin-Stepan/project-entity.git
synced 2026-03-05 07:41:10 +00:00
feat: add teleport system
This commit is contained in:
@@ -21,20 +21,20 @@ namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems
|
||||
{
|
||||
_currentEnergy = entity.CurrentEnergy;
|
||||
|
||||
_useEnergyRequest = entity.RegenEnergyRequest;
|
||||
_useEnergyEvent = entity.RegenEnergyEvent;
|
||||
_useEnergyRequest = entity.UseEnergyRequest;
|
||||
_useEnergyEvent = entity.UseEnergyEvent;
|
||||
|
||||
_canUse = entity.CanRegenEnergy;
|
||||
_canUse = entity.CanUseEnergy;
|
||||
|
||||
_useRequestDispose = _useEnergyRequest.Subscribe(OnRegenRequest);
|
||||
_useRequestDispose = _useEnergyRequest.Subscribe(OnUseRequest);
|
||||
}
|
||||
|
||||
private void OnRegenRequest(int value)
|
||||
private void OnUseRequest(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)
|
||||
if (_canUse.Evaluate() == false)
|
||||
return;
|
||||
|
||||
_currentEnergy.Value -= value;
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
using _Project.Develop.Runtime.Entities;
|
||||
using _Project.Develop.Runtime.Utils.InputManagement;
|
||||
using _Project.Develop.Runtime.Utils.ReactiveManagement.Event;
|
||||
using UnityEngine;
|
||||
|
||||
namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Input
|
||||
{
|
||||
public class TeleportByInputSystem : IInitializableSystem, IDisposableSystem
|
||||
{
|
||||
private readonly IPlayerInput _playerInput;
|
||||
|
||||
private ReactiveEvent _startTeleportRequest;
|
||||
|
||||
public TeleportByInputSystem(IPlayerInput playerInput)
|
||||
{
|
||||
_playerInput = playerInput;
|
||||
}
|
||||
|
||||
public void OnInit(Entity entity)
|
||||
{
|
||||
_startTeleportRequest = entity.StartTeleportRequest;
|
||||
|
||||
_playerInput.Jump.Enter += OnTeleportRequest;
|
||||
}
|
||||
|
||||
private void OnTeleportRequest(float value)
|
||||
{
|
||||
_startTeleportRequest.Invoke();
|
||||
}
|
||||
|
||||
public void OnDispose()
|
||||
{
|
||||
_playerInput.Jump.Enter -= OnTeleportRequest;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 585250d7186e42928f1909e712a63f12
|
||||
timeCreated: 1771759696
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 13758f03c6ec4963a8b410da943fb2ef
|
||||
timeCreated: 1771754702
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fa09db11825842cfbe7d717c61c0af1c
|
||||
timeCreated: 1771754762
|
||||
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
using _Project.Develop.Runtime.Entities;
|
||||
using _Project.Develop.Runtime.Utils.ReactiveManagement.Event;
|
||||
using UnityEngine;
|
||||
|
||||
namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Teleport.Systems
|
||||
{
|
||||
public class ProcessTeleportSystem : IInitializableSystem, IDisposableSystem
|
||||
{
|
||||
private Transform _target;
|
||||
private Transform _toPoint;
|
||||
|
||||
private ReactiveEvent _startTeleportEvent;
|
||||
private ReactiveEvent _endTeleportEvent;
|
||||
|
||||
private IDisposable _startTeleportEventDisposable;
|
||||
|
||||
public void OnInit(Entity entity)
|
||||
{
|
||||
_target = entity.TeleportTarget;
|
||||
_toPoint = entity.TeleportToPoint;
|
||||
|
||||
_startTeleportEvent = entity.StartTeleportEvent;
|
||||
_endTeleportEvent = entity.EndTeleportEvent;
|
||||
|
||||
_startTeleportEventDisposable = _startTeleportEvent.Subscribe(OnStartTeleportProcess);
|
||||
}
|
||||
|
||||
private void OnStartTeleportProcess()
|
||||
{
|
||||
_target.position = _toPoint.position;
|
||||
_endTeleportEvent.Invoke();
|
||||
}
|
||||
|
||||
public void OnDispose()
|
||||
{
|
||||
_startTeleportEventDisposable.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 10244fce53bb47079bf5d24b96ce2515
|
||||
timeCreated: 1771758234
|
||||
@@ -0,0 +1,51 @@
|
||||
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.Teleport.Systems
|
||||
{
|
||||
public class StartTeleportByEnergySystem: IInitializableSystem, IDisposableSystem
|
||||
{
|
||||
private ReactiveEvent<int> _useEnergyRequest;
|
||||
private ReactiveEvent _startTeleportRequest;
|
||||
private ReactiveEvent _startTeleportEvent;
|
||||
|
||||
private ReactiveVariable<bool> _inTeleportProcess;
|
||||
private ReactiveVariable<int> _teleportCost;
|
||||
|
||||
private ICompositeCondition _canStartTeleport;
|
||||
|
||||
private IDisposable _teleportRequestDispose;
|
||||
|
||||
public void OnInit(Entity entity)
|
||||
{
|
||||
_teleportCost = entity.EnergyTeleportCost;
|
||||
|
||||
_useEnergyRequest = entity.UseEnergyRequest;
|
||||
_startTeleportRequest = entity.StartTeleportRequest;
|
||||
_startTeleportEvent = entity.StartTeleportEvent;
|
||||
_inTeleportProcess = entity.InTeleportProcess;
|
||||
|
||||
_canStartTeleport = entity.CanStartTeleport;
|
||||
|
||||
_teleportRequestDispose = _startTeleportRequest.Subscribe(OnTeleportRequest);
|
||||
}
|
||||
|
||||
private void OnTeleportRequest()
|
||||
{
|
||||
if (_canStartTeleport.Evaluate())
|
||||
{
|
||||
_inTeleportProcess.Value = true;
|
||||
_useEnergyRequest.Invoke(_teleportCost.Value);
|
||||
_startTeleportEvent.Invoke();
|
||||
}
|
||||
}
|
||||
|
||||
public void OnDispose()
|
||||
{
|
||||
_teleportRequestDispose.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 94ff3554a2634a4bb835ed4ffd6240a6
|
||||
timeCreated: 1771754851
|
||||
@@ -0,0 +1,21 @@
|
||||
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 UnityEngine;
|
||||
|
||||
namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Teleport
|
||||
{
|
||||
public class TeleportTarget : IEntityComponent { public Transform Value; }
|
||||
public class TeleportToPoint : IEntityComponent { public Transform Value; }
|
||||
|
||||
public class CanStartTeleport : IEntityComponent { public ICompositeCondition Value; }
|
||||
public class InTeleportProcess : IEntityComponent { public ReactiveVariable<bool> Value; }
|
||||
|
||||
public class StartTeleportRequest : IEntityComponent { public ReactiveEvent Value; }
|
||||
public class StartTeleportEvent : IEntityComponent { public ReactiveEvent Value; }
|
||||
|
||||
public class EndTeleportEvent : IEntityComponent { public ReactiveEvent Value; }
|
||||
|
||||
public class EnergyTeleportCost : IEntityComponent { public ReactiveVariable<int> Value; }
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 22478060bdbf4b2b8556c31a7b93a97b
|
||||
timeCreated: 1771754772
|
||||
Reference in New Issue
Block a user