mirror of
https://github.com/Bragin-Stepan/project-entity.git
synced 2026-03-02 22:31:10 +00:00
feat: add feature damage
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using _Project.Develop.Runtime.Logic.Gameplay.Features.Lifetime.Systems;
|
using _Project.Develop.Runtime.Logic.Gameplay.Features.Damage;
|
||||||
|
using _Project.Develop.Runtime.Logic.Gameplay.Features.Lifetime.Systems;
|
||||||
using _Project.Develop.Runtime.Logic.Gameplay.Features.Movement;
|
using _Project.Develop.Runtime.Logic.Gameplay.Features.Movement;
|
||||||
using _Project.Develop.Runtime.Utilities.Conditions;
|
using _Project.Develop.Runtime.Utilities.Conditions;
|
||||||
using _Project.Develop.Runtime.Utils.InputManagement;
|
using _Project.Develop.Runtime.Utils.InputManagement;
|
||||||
@@ -35,6 +36,8 @@ namespace _Project.Develop.Runtime.Entities
|
|||||||
.AddRotationSpeed(new ReactiveVariable<float>(800))
|
.AddRotationSpeed(new ReactiveVariable<float>(800))
|
||||||
.AddMaxHealth(new ReactiveVariable<float>(150))
|
.AddMaxHealth(new ReactiveVariable<float>(150))
|
||||||
.AddCurrentHealth(new ReactiveVariable<float>(150))
|
.AddCurrentHealth(new ReactiveVariable<float>(150))
|
||||||
|
.AddTakeDamageRequest()
|
||||||
|
.AddTakeDamageEvent()
|
||||||
.AddIsDead()
|
.AddIsDead()
|
||||||
.AddIsMoving()
|
.AddIsMoving()
|
||||||
.AddInDeathProcess()
|
.AddInDeathProcess()
|
||||||
@@ -53,14 +56,19 @@ namespace _Project.Develop.Runtime.Entities
|
|||||||
ICompositeCondition mustSelfRelease = new CompositeCondition()
|
ICompositeCondition mustSelfRelease = new CompositeCondition()
|
||||||
.Add(new FuncCondition(() => entity.IsDead.Value))
|
.Add(new FuncCondition(() => entity.IsDead.Value))
|
||||||
.Add(new FuncCondition(() => entity.InDeathProcess.Value == false));
|
.Add(new FuncCondition(() => entity.InDeathProcess.Value == false));
|
||||||
|
|
||||||
|
ICompositeCondition canApplyDamage = new CompositeCondition()
|
||||||
|
.Add(new FuncCondition(() => entity.IsDead.Value == false));
|
||||||
|
|
||||||
entity
|
entity
|
||||||
.AddCanMove(canMove)
|
.AddCanMove(canMove)
|
||||||
.AddCanRotate(canRotate)
|
.AddCanRotate(canRotate)
|
||||||
|
.AddCanApplyDamage(canApplyDamage)
|
||||||
.AddMustDie(mustDie)
|
.AddMustDie(mustDie)
|
||||||
.AddMustSelfRelease(mustSelfRelease);
|
.AddMustSelfRelease(mustSelfRelease);
|
||||||
|
|
||||||
entity
|
entity
|
||||||
|
.AddSystem(new ApplyDamageSystem())
|
||||||
.AddSystem(new RigidbodyMovementSystem())
|
.AddSystem(new RigidbodyMovementSystem())
|
||||||
.AddSystem(new RigidbodyRotationSystem())
|
.AddSystem(new RigidbodyRotationSystem())
|
||||||
.AddSystem(new MoveDirectionByInputSystem(_playerInput))
|
.AddSystem(new MoveDirectionByInputSystem(_playerInput))
|
||||||
|
|||||||
@@ -461,5 +461,72 @@ namespace _Project.Develop.Runtime.Entities
|
|||||||
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.CanJump() {Value = value});
|
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.CanJump() {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;
|
||||||
|
|
||||||
|
public bool TryGetTakeDamageRequest(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Single> value)
|
||||||
|
{
|
||||||
|
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageRequest component);
|
||||||
|
if(result)
|
||||||
|
value = component.Value;
|
||||||
|
else
|
||||||
|
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Single>);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public _Project.Develop.Runtime.Entities.Entity AddTakeDamageRequest()
|
||||||
|
{
|
||||||
|
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageRequest() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Single>() });
|
||||||
|
}
|
||||||
|
|
||||||
|
public _Project.Develop.Runtime.Entities.Entity AddTakeDamageRequest(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Single> value)
|
||||||
|
{
|
||||||
|
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageRequest() {Value = value});
|
||||||
|
}
|
||||||
|
|
||||||
|
public _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageEvent TakeDamageEventC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageEvent>();
|
||||||
|
|
||||||
|
public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Single> TakeDamageEvent => TakeDamageEventC.Value;
|
||||||
|
|
||||||
|
public bool TryGetTakeDamageEvent(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Single> value)
|
||||||
|
{
|
||||||
|
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageEvent component);
|
||||||
|
if(result)
|
||||||
|
value = component.Value;
|
||||||
|
else
|
||||||
|
value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Single>);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public _Project.Develop.Runtime.Entities.Entity AddTakeDamageEvent()
|
||||||
|
{
|
||||||
|
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageEvent() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Single>() });
|
||||||
|
}
|
||||||
|
|
||||||
|
public _Project.Develop.Runtime.Entities.Entity AddTakeDamageEvent(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent<System.Single> value)
|
||||||
|
{
|
||||||
|
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageEvent() {Value = value});
|
||||||
|
}
|
||||||
|
|
||||||
|
public _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.CanApplyDamage CanApplyDamageC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Damage.CanApplyDamage>();
|
||||||
|
|
||||||
|
public _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition CanApplyDamage => CanApplyDamageC.Value;
|
||||||
|
|
||||||
|
public bool TryGetCanApplyDamage(out _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value)
|
||||||
|
{
|
||||||
|
bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.CanApplyDamage component);
|
||||||
|
if(result)
|
||||||
|
value = component.Value;
|
||||||
|
else
|
||||||
|
value = default(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public _Project.Develop.Runtime.Entities.Entity AddCanApplyDamage(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value)
|
||||||
|
{
|
||||||
|
return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.CanApplyDamage() {Value = value});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b87bc393428846e3b37bf463760253c1
|
||||||
|
timeCreated: 1771525636
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
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.Damage
|
||||||
|
{
|
||||||
|
public class ApplyDamageSystem : IInitializableSystem, IDisposableSystem
|
||||||
|
{
|
||||||
|
private ReactiveEvent<float> _damageRequest;
|
||||||
|
private ReactiveEvent<float> _damageEvent;
|
||||||
|
|
||||||
|
private ReactiveVariable<float> _health;
|
||||||
|
|
||||||
|
private ICompositeCondition _canApplyDamage;
|
||||||
|
|
||||||
|
private IDisposable _requestDisposable;
|
||||||
|
|
||||||
|
public void OnInit(Entity entity)
|
||||||
|
{
|
||||||
|
_damageRequest = entity.TakeDamageRequest;
|
||||||
|
_damageEvent = entity.TakeDamageEvent;
|
||||||
|
|
||||||
|
_health = entity.CurrentHealth;
|
||||||
|
|
||||||
|
_canApplyDamage = entity.CanApplyDamage;
|
||||||
|
|
||||||
|
_requestDisposable = _damageRequest.Subscribe(OnDamageRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnDispose()
|
||||||
|
{
|
||||||
|
_requestDisposable.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDamageRequest(float damage)
|
||||||
|
{
|
||||||
|
if (damage < 0)
|
||||||
|
throw new ArgumentOutOfRangeException(nameof(damage));
|
||||||
|
|
||||||
|
if (_canApplyDamage.Evaluate() == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_health.Value = MathF.Max(_health.Value - damage, 0);
|
||||||
|
_damageEvent.Invoke(damage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: bd8ccd1d58fe484d933c61c5c640fff3
|
||||||
|
timeCreated: 1771525914
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
using _Project.Develop.Runtime.Entities;
|
||||||
|
using _Project.Develop.Runtime.Utilities.Conditions;
|
||||||
|
using _Project.Develop.Runtime.Utils.ReactiveManagement.Event;
|
||||||
|
|
||||||
|
namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Damage
|
||||||
|
{
|
||||||
|
public class TakeDamageRequest : IEntityComponent { public ReactiveEvent<float> Value; }
|
||||||
|
|
||||||
|
public class TakeDamageEvent : IEntityComponent { public ReactiveEvent<float> Value; }
|
||||||
|
|
||||||
|
public class CanApplyDamage : IEntityComponent { public ICompositeCondition Value; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 79d8679b310c457bb73f676d4aaef890
|
||||||
|
timeCreated: 1771525646
|
||||||
Reference in New Issue
Block a user