From e07bde989a0bb72ffe01ee7683122ac888b1241f Mon Sep 17 00:00:00 2001 From: Bragin Stepan Date: Thu, 19 Feb 2026 20:46:32 +0500 Subject: [PATCH] feat: add conditions --- .idea/.idea.project-entity/.idea/vcs.xml | 6 ++ .../Runtime/Constants/PathToResources.cs | 1 + .../Gameplay/Entities/EntitiesFactory.cs | 12 ++-- .../Gameplay/Entities/Generated/EntityAPI.cs | 62 +++++++++++++++++++ .../Features/Movement/MovementComponents.cs | 7 ++- .../Gameplay/Infrastructure/TestGameplay.cs | 2 +- .../Develop/Runtime/Utilities/Conditions.meta | 3 + .../Conditions/CompositeCondition.cs | 56 +++++++++++++++++ .../Conditions/CompositeCondition.cs.meta | 11 ++++ .../Utilities/Conditions/FuncCondition.cs | 16 +++++ .../Conditions/FuncCondition.cs.meta | 11 ++++ .../Conditions/ICompositeCondition.cs | 11 ++++ .../Conditions/ICompositeCondition.cs.meta | 11 ++++ .../Utilities/Conditions/ICondition.cs | 12 ++++ .../Utilities/Conditions/ICondition.cs.meta | 11 ++++ .../Utilities/Conditions/LogicOperations.cs | 8 +++ .../Conditions/LogicOperations.cs.meta | 11 ++++ 17 files changed, 242 insertions(+), 9 deletions(-) create mode 100644 .idea/.idea.project-entity/.idea/vcs.xml create mode 100644 Assets/_Project/Develop/Runtime/Utilities/Conditions.meta create mode 100644 Assets/_Project/Develop/Runtime/Utilities/Conditions/CompositeCondition.cs create mode 100644 Assets/_Project/Develop/Runtime/Utilities/Conditions/CompositeCondition.cs.meta create mode 100644 Assets/_Project/Develop/Runtime/Utilities/Conditions/FuncCondition.cs create mode 100644 Assets/_Project/Develop/Runtime/Utilities/Conditions/FuncCondition.cs.meta create mode 100644 Assets/_Project/Develop/Runtime/Utilities/Conditions/ICompositeCondition.cs create mode 100644 Assets/_Project/Develop/Runtime/Utilities/Conditions/ICompositeCondition.cs.meta create mode 100644 Assets/_Project/Develop/Runtime/Utilities/Conditions/ICondition.cs create mode 100644 Assets/_Project/Develop/Runtime/Utilities/Conditions/ICondition.cs.meta create mode 100644 Assets/_Project/Develop/Runtime/Utilities/Conditions/LogicOperations.cs create mode 100644 Assets/_Project/Develop/Runtime/Utilities/Conditions/LogicOperations.cs.meta diff --git a/.idea/.idea.project-entity/.idea/vcs.xml b/.idea/.idea.project-entity/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/.idea.project-entity/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Constants/PathToResources.cs b/Assets/_Project/Develop/Runtime/Constants/PathToResources.cs index 54a1139..85298d3 100644 --- a/Assets/_Project/Develop/Runtime/Constants/PathToResources.cs +++ b/Assets/_Project/Develop/Runtime/Constants/PathToResources.cs @@ -35,6 +35,7 @@ namespace Assets._Project.Develop.Runtime.Utilities.SceneManagement public static class Entity { public const string TestEntity = "Entities/TestEntity"; + public const string Ghost = "Entities/TestEntity"; } private static readonly Dictionary _scriptableObject = new() diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs index 78b1393..eb4e830 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs @@ -19,12 +19,12 @@ namespace _Project.Develop.Runtime.Entities _monoEntitiesFactory = container.Resolve(); _playerInput = container.Resolve(); } - - public Entity CreateTestEntity(Vector3 position) + + public Entity CreateGhostEntity(Vector3 position) { Entity entity = CreateEmpty(); - _monoEntitiesFactory.Create(entity, position, PathToResources.Entity.TestEntity); + _monoEntitiesFactory.Create(entity, position, PathToResources.Entity.Ghost); entity .AddMoveDirection() @@ -33,10 +33,8 @@ namespace _Project.Develop.Runtime.Entities .AddRotationSpeed(new ReactiveVariable(800)); entity - .AddSystem(new CharacterControllerMovementSystem()) - .AddSystem(new TransformRotationSystem()) - // .AddSystem(new RigidbodyMovementSystem()) - // .AddSystem(new RigidbodyRotationSystem()) + .AddSystem(new RigidbodyMovementSystem()) + .AddSystem(new RigidbodyRotationSystem()) .AddSystem(new MoveDirectionByInputSystem(_playerInput)) .AddSystem(new RotateDirectionByInputSystem(_playerInput)); diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs index 716e668..e2900fe 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs @@ -126,6 +126,49 @@ namespace _Project.Develop.Runtime.Entities return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.MoveSpeed() {Value = value}); } + public _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.IsMoving IsMovingC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Movement.IsMoving>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable IsMoving => IsMovingC.Value; + + public bool TryGetIsMoving(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.IsMoving component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddIsMoving() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.IsMoving() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddIsMoving(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.IsMoving() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.CanMove CanMoveC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Movement.CanMove>(); + + public _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition CanMove => CanMoveC.Value; + + public bool TryGetCanMove(out _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.CanMove component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddCanMove(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.CanMove() {Value = value}); + } + public _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.RotateDirection RotateDirectionC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Movement.RotateDirection>(); public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable RotateDirection => RotateDirectionC.Value; @@ -174,6 +217,25 @@ namespace _Project.Develop.Runtime.Entities return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.RotationSpeed() {Value = value}); } + public _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.CanRotate CanRotateC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Movement.CanRotate>(); + + public _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition CanRotate => CanRotateC.Value; + + public bool TryGetCanRotate(out _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.CanRotate component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddCanRotate(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.CanRotate() {Value = value}); + } + public _Project.Develop.Runtime.Logic.Gameplay.Features.Movement.JumpForce JumpForceC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Movement.JumpForce>(); public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable JumpForce => JumpForceC.Value; diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Movement/MovementComponents.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Movement/MovementComponents.cs index 1cd3284..a2ac811 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Movement/MovementComponents.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Movement/MovementComponents.cs @@ -1,4 +1,5 @@ using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Utilities.Conditions; using _Project.Develop.Runtime.Utils.ReactiveManagement; using UnityEngine; @@ -6,9 +7,13 @@ namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Movement { public class MoveDirection : IEntityComponent { public ReactiveVariable Value; } public class MoveSpeed : IEntityComponent { public ReactiveVariable Value; } - + public class IsMoving : IEntityComponent { public ReactiveVariable Value; } + public class CanMove : IEntityComponent { public ICompositeCondition Value; } + public class RotateDirection : IEntityComponent { public ReactiveVariable Value; } public class RotationSpeed : IEntityComponent { public ReactiveVariable Value; } + public class CanRotate : IEntityComponent { public ICompositeCondition Value; } public class JumpForce : IEntityComponent { public ReactiveVariable Value; } + } \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/TestGameplay.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/TestGameplay.cs index ffe86a6..b070cec 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/TestGameplay.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Infrastructure/TestGameplay.cs @@ -23,7 +23,7 @@ namespace _Project.Develop.Runtime.Logic.Gameplay.Features public void Run() { - _entity = _entitiesFactory.CreateTestEntity(Vector3.zero); + _entity = _entitiesFactory.CreateGhostEntity(Vector3.zero); _isRunning = true; } diff --git a/Assets/_Project/Develop/Runtime/Utilities/Conditions.meta b/Assets/_Project/Develop/Runtime/Utilities/Conditions.meta new file mode 100644 index 0000000..c723b77 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Utilities/Conditions.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a03759ea3f034fa6a538e0a167d7c72a +timeCreated: 1771515376 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Utilities/Conditions/CompositeCondition.cs b/Assets/_Project/Develop/Runtime/Utilities/Conditions/CompositeCondition.cs new file mode 100644 index 0000000..ac0d842 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Utilities/Conditions/CompositeCondition.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace _Project.Develop.Runtime.Utilities.Conditions +{ + public class CompositeCondition : ICompositeCondition + { + private List<(ICondition, Func, int)> _conditions = new(); + private Func _standardLogicOperation; + + public CompositeCondition(Func standardLogicOperation) + { + _standardLogicOperation = standardLogicOperation; + } + + public CompositeCondition() : this(LogicOperationsUtils.And) + { + + } + + public ICompositeCondition Add(ICondition condition, int order = 0, Func logicOperation = null) + { + _conditions.Add((condition, logicOperation, order)); + _conditions = _conditions.OrderBy(cond => cond.Item3).ToList(); + return this; + } + + public bool Evaluate() + { + if (_conditions.Count == 0) + return false; + + bool result = _conditions[0].Item1.Evaluate(); + + for (int i = 1; i < _conditions.Count; i++) + { + (ICondition, Func, int) currentCondition = _conditions[i]; + + if (currentCondition.Item2 != null) + result = currentCondition.Item2.Invoke(result, currentCondition.Item1.Evaluate()); + else + result = _standardLogicOperation.Invoke(result, currentCondition.Item1.Evaluate()); + } + + return result; + } + + public ICompositeCondition Remove(ICondition condition) + { + (ICondition, Func, int) conditionPair = _conditions.First(condPair => condPair.Item1 == condition); + _conditions.Remove(conditionPair); + return this; + } + } +} diff --git a/Assets/_Project/Develop/Runtime/Utilities/Conditions/CompositeCondition.cs.meta b/Assets/_Project/Develop/Runtime/Utilities/Conditions/CompositeCondition.cs.meta new file mode 100644 index 0000000..0ed9ec4 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Utilities/Conditions/CompositeCondition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f44783069f2d1fb42bdd6608da2e604a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Develop/Runtime/Utilities/Conditions/FuncCondition.cs b/Assets/_Project/Develop/Runtime/Utilities/Conditions/FuncCondition.cs new file mode 100644 index 0000000..d6f7c8c --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Utilities/Conditions/FuncCondition.cs @@ -0,0 +1,16 @@ +using System; + +namespace _Project.Develop.Runtime.Utilities.Conditions +{ + public class FuncCondition : ICondition + { + private Func _condition; + + public FuncCondition(Func condition) + { + _condition = condition; + } + + public bool Evaluate() => _condition.Invoke(); + } +} diff --git a/Assets/_Project/Develop/Runtime/Utilities/Conditions/FuncCondition.cs.meta b/Assets/_Project/Develop/Runtime/Utilities/Conditions/FuncCondition.cs.meta new file mode 100644 index 0000000..9f03a96 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Utilities/Conditions/FuncCondition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d62e21bbc0d33c7408a9cd905463b830 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICompositeCondition.cs b/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICompositeCondition.cs new file mode 100644 index 0000000..74f1e88 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICompositeCondition.cs @@ -0,0 +1,11 @@ +using System; + +namespace _Project.Develop.Runtime.Utilities.Conditions +{ + public interface ICompositeCondition : ICondition + { + ICompositeCondition Add(ICondition condition, int order = 0, Func logicOperation = null); + + ICompositeCondition Remove(ICondition condition); + } +} diff --git a/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICompositeCondition.cs.meta b/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICompositeCondition.cs.meta new file mode 100644 index 0000000..9a816c9 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICompositeCondition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b3bfaadc771fd854f9d27882b2212136 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICondition.cs b/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICondition.cs new file mode 100644 index 0000000..920568e --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICondition.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace _Project.Develop.Runtime.Utilities.Conditions +{ + public interface ICondition + { + bool Evaluate(); + } +} diff --git a/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICondition.cs.meta b/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICondition.cs.meta new file mode 100644 index 0000000..b185787 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Utilities/Conditions/ICondition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 36fcc8f7fc765414388895dc842fe0f1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Develop/Runtime/Utilities/Conditions/LogicOperations.cs b/Assets/_Project/Develop/Runtime/Utilities/Conditions/LogicOperations.cs new file mode 100644 index 0000000..1e01da6 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Utilities/Conditions/LogicOperations.cs @@ -0,0 +1,8 @@ +namespace _Project.Develop.Runtime.Utilities.Conditions +{ + public class LogicOperationsUtils + { + public static bool And(bool a, bool b) => a && b; + public static bool Or(bool a, bool b) => a || b; + } +} diff --git a/Assets/_Project/Develop/Runtime/Utilities/Conditions/LogicOperations.cs.meta b/Assets/_Project/Develop/Runtime/Utilities/Conditions/LogicOperations.cs.meta new file mode 100644 index 0000000..9a44c40 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Utilities/Conditions/LogicOperations.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 44cb53d5052ea6244b01f10d6f37b4a8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: