From d9f869fbd4dbdd807afefc17b3c8e9bca92dcbf9 Mon Sep 17 00:00:00 2001 From: Mikolaj Date: Tue, 3 May 2022 07:05:29 +0200 Subject: [PATCH] Finished basic character controller I have finished basic features of character controller and polished it quite a bit but there is a pair of missing features: walking up ladders, swiming --- .../Character/Controller/Player.inputactions | 2 +- Assets/RotationAnalogTracker.cs | 80 +++++++++++++ Assets/RotationAnalogTracker.cs.meta | 11 ++ Assets/Scenes/InventorySystemTest.unity | 5 + Assets/Scenes/MovementTesting.unity | 113 ++++++++++++------ .../Controller/Alive/CharacterHover.cs | 61 ++++++---- .../Controller/Alive/CharacterMover.cs | 99 +++++++++++++-- .../Controller/CharacterMovementConfig.cs | 37 ++++-- .../Controller/CharacterStateChanger.cs | 26 ++-- .../Controller/CharacterStateEnforcer.cs | 29 ++++- .../Controller/Core/PlayerInputSender.cs | 2 +- .../Controller/PlayerInputReceiver.cs | 46 ++++++- ProjectSettings/TagManager.asset | 17 +-- 13 files changed, 414 insertions(+), 114 deletions(-) create mode 100644 Assets/RotationAnalogTracker.cs create mode 100644 Assets/RotationAnalogTracker.cs.meta diff --git a/Assets/Character/Controller/Player.inputactions b/Assets/Character/Controller/Player.inputactions index 98a7e5e..91120c7 100644 --- a/Assets/Character/Controller/Player.inputactions +++ b/Assets/Character/Controller/Player.inputactions @@ -38,7 +38,7 @@ "id": "edb5e334-0aab-4f72-8872-53382954c983", "expectedControlType": "Button", "processors": "", - "interactions": "", + "interactions": "Hold(duration=0.2)", "initialStateCheck": false }, { diff --git a/Assets/RotationAnalogTracker.cs b/Assets/RotationAnalogTracker.cs new file mode 100644 index 0000000..44131bf --- /dev/null +++ b/Assets/RotationAnalogTracker.cs @@ -0,0 +1,80 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class RotationAnalogTracker : MonoBehaviour +{ + [SerializeField] + private Transform _trackedObject; + + [SerializeField] + float _currentRotation = 0; + + [Header("Z+")][SerializeField] + private bool _Facing_Z_Plus; + [SerializeField] + private float _lookDirectionForwardMin, _lookDirectionForwardMax; + + [Header("X+")] + [SerializeField] + private bool _Facing_X_Plus; + [SerializeField] + private float _lookDirectionRightMin, _lookDirectionRightMax; + + [Header("X-")] + [SerializeField] + private bool _Facing_X_Minus; + [SerializeField] + private float _lookDirectionLeftMin, _lookDirectionLeftMax; + + [Header("Z-")][SerializeField] + private bool _Facing_Z_Minus; + [SerializeField] + private float _lookDirectionBackMin, _lookDirectionBackMax; + + + bool IsInRange(float valueToCheck, float minimumValue, float maximumValue) + { + bool result; + + if(valueToCheck >= minimumValue && valueToCheck <= maximumValue) + { + result = true; + } + else + { + result = false; + } + + return result; + } + + // Start is called before the first frame update + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + + _currentRotation = _trackedObject.rotation.y; + + _Facing_Z_Plus = IsInRange(_trackedObject.rotation.y, _lookDirectionForwardMin, _lookDirectionForwardMax); + if (!IsInRange(_trackedObject.rotation.y, _lookDirectionBackMin, _lookDirectionBackMax)) + { + _Facing_Z_Minus = true; + } + else + { + _Facing_Z_Minus = false; + } + _Facing_X_Minus = IsInRange(_trackedObject.rotation.y, _lookDirectionLeftMin, _lookDirectionLeftMax); + _Facing_X_Plus = IsInRange(_trackedObject.rotation.y, _lookDirectionRightMin, _lookDirectionRightMax); + + + + } +} diff --git a/Assets/RotationAnalogTracker.cs.meta b/Assets/RotationAnalogTracker.cs.meta new file mode 100644 index 0000000..3faf14f --- /dev/null +++ b/Assets/RotationAnalogTracker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8182877c8e1aff543b5bd05e5a5c7c8f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/InventorySystemTest.unity b/Assets/Scenes/InventorySystemTest.unity index ab55aa8..07d6743 100644 --- a/Assets/Scenes/InventorySystemTest.unity +++ b/Assets/Scenes/InventorySystemTest.unity @@ -557,6 +557,11 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 740122246} m_Modifications: + - target: {fileID: 4618792495020702613, guid: a6c9897145ea93b41abf3c531f857e3b, + type: 3} + propertyPath: maxNormalmSlots + value: 6 + objectReference: {fileID: 0} - target: {fileID: 4618792496510273084, guid: a6c9897145ea93b41abf3c531f857e3b, type: 3} propertyPath: m_RootOrder diff --git a/Assets/Scenes/MovementTesting.unity b/Assets/Scenes/MovementTesting.unity index b7a90ff..c2ccd96 100644 --- a/Assets/Scenes/MovementTesting.unity +++ b/Assets/Scenes/MovementTesting.unity @@ -266,7 +266,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 164827064} - m_Layer: 0 + m_Layer: 3 m_Name: CameraHolder m_TagString: Untagged m_Icon: {fileID: 0} @@ -338,7 +338,7 @@ GameObject: - component: {fileID: 275207161} - component: {fileID: 275207163} - component: {fileID: 275207162} - m_Layer: 0 + m_Layer: 3 m_Name: Alive m_TagString: Untagged m_Icon: {fileID: 0} @@ -398,6 +398,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _ReffrenceHub: {fileID: 1551772761} + _inAirCounterForce: 0.2 + _moveCounterForce: 0.88 + _autoB_Hop: 0 _hoverForceMode: 3 _moveForceMode: 2 _characterDrag: 10 @@ -413,15 +416,15 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 47fbeaf5a8b077b4196092280e5755df, type: 3} m_Name: m_EditorClassIdentifier: + _capsuleCastHight: 0.25 + _capsuleCastRadius: 0.35 characterReffrenceHub: {fileID: 1551772761} - _groundCheckOrigins: {fileID: 955568360} - _groundCheckLength: 1.5 + _groundCheckOrigin: {fileID: 955568360} _layerMask: serializedVersion: 2 - m_Bits: 512 - hoverHight: 1.4 - _hoverStrenght: 2 - _hoverDampening: 10 + m_Bits: 576 + currentHoverHight: 0 + _capsuleMesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} --- !u!114 &275207160 MonoBehaviour: m_ObjectHideFlags: 0 @@ -435,21 +438,27 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: characterRigidbody: {fileID: 1551772756} - moveSpeed: 1 - airControlStrength: 0.1 - crouchSpeedDecrease: 2 - sprintSpeedIncrease: 1.5 - ladderClimbingSpeed: 0 - jumpPower: 0 - crouchHeight: 0 + moveForce: 1 + moveCounterForce: 0.88 + crouchMoveForce: 0.7 + crouchMoveCounterForce: 0.6 + sprintMoveForce: 0 + sprintMoveCounterForce: 0 + ladderClimbingForce: 0 + desieredHoverHight: 1.2 + crouchHeight: 0.7 crouchSmoothing: 0 + allowSprint: 0 + jumpForce: 3 + groundCheckLength: 1.1 + hoverStrenght: 0.43 + hoverDampening: 5 + airControlForce: 0 + airControlCounterForce: 0 lookVerticalSpeed: 300 lookHorizontalSpeed: 300 aimVerticalSpeed: 0 aimHorizontalSpeed: 0 - stepSmoothing: 0 - stepHeight: 0 - allowSprint: 0 --- !u!114 &275207161 MonoBehaviour: m_ObjectHideFlags: 0 @@ -498,7 +507,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 68e69a066cfcd3b45b91db0b5825eea3, type: 3} m_Name: m_EditorClassIdentifier: - _reffrenceHub: {fileID: 0} + _reffrenceHub: {fileID: 1551772761} + _desieredStandingColliderPosition: {x: 0, y: 0.2, z: 0} + _desieredStandingColliderHight: 1.6 + _desieredCrouchedColliderPosition: {x: 0, y: 0.3, z: 0} + _desieredCrouchedColliderHight: 1.4 + _characterEnviormentCollider: {fileID: 1224580545} --- !u!1 &351313843 GameObject: m_ObjectHideFlags: 0 @@ -852,13 +866,13 @@ GameObject: - component: {fileID: 525099634} - component: {fileID: 525099637} - component: {fileID: 525099636} - m_Layer: 0 + m_Layer: 3 m_Name: Cube m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &525099634 Transform: m_ObjectHideFlags: 0 @@ -867,8 +881,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 525099633} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0.479, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalPosition: {x: 0, y: 0.681, z: 0} + m_LocalScale: {x: 0.8, y: 0.8, z: 0.8} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1203630888} @@ -937,7 +951,7 @@ GameObject: - component: {fileID: 555114078} - component: {fileID: 555114077} - component: {fileID: 555114076} - m_Layer: 0 + m_Layer: 6 m_Name: Cube m_TagString: Untagged m_Icon: {fileID: 0} @@ -952,7 +966,7 @@ Rigidbody: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 555114075} serializedVersion: 2 - m_Mass: 1 + m_Mass: 10 m_Drag: 0 m_AngularDrag: 0.05 m_UseGravity: 1 @@ -1615,7 +1629,7 @@ GameObject: - component: {fileID: 883269171} - component: {fileID: 883269174} - component: {fileID: 883269173} - m_Layer: 0 + m_Layer: 3 m_Name: Capsule m_TagString: Untagged m_Icon: {fileID: 0} @@ -1631,7 +1645,7 @@ Transform: m_GameObject: {fileID: 883269170} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalScale: {x: 0.8, y: 1, z: 0.8} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1203630888} @@ -1732,7 +1746,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 955568360} - m_Layer: 0 + m_Layer: 3 m_Name: GroundCheck m_TagString: Untagged m_Icon: {fileID: 0} @@ -2463,7 +2477,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 1203630888} - m_Layer: 0 + m_Layer: 3 m_Name: PlayerModel m_TagString: Untagged m_Icon: {fileID: 0} @@ -2595,7 +2609,7 @@ GameObject: m_Component: - component: {fileID: 1224580544} - component: {fileID: 1224580545} - m_Layer: 7 + m_Layer: 3 m_Name: EnviormentCollider m_TagString: Untagged m_Icon: {fileID: 0} @@ -2627,10 +2641,10 @@ CapsuleCollider: m_Material: {fileID: 13400000, guid: c67f223e1c1ff6d44956ef766851951c, type: 2} m_IsTrigger: 0 m_Enabled: 1 - m_Radius: 0.5 + m_Radius: 0.4 m_Height: 1.6 m_Direction: 1 - m_Center: {x: 0, y: 0.1, z: 0} + m_Center: {x: 0, y: 0.2, z: 0} --- !u!1 &1244159270 GameObject: m_ObjectHideFlags: 0 @@ -3085,9 +3099,10 @@ GameObject: - component: {fileID: 1551772752} - component: {fileID: 1551772758} - component: {fileID: 1551772756} - m_Layer: 0 + - component: {fileID: 1551772762} + m_Layer: 3 m_Name: Player_Ghost - m_TagString: Untagged + m_TagString: Player m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 @@ -3183,6 +3198,32 @@ MonoBehaviour: playerInputReceiver: {fileID: 1551772752} characterHover: {fileID: 275207159} characterStateChanger: {fileID: 275207161} +--- !u!114 &1551772762 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1551772751} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8182877c8e1aff543b5bd05e5a5c7c8f, type: 3} + m_Name: + m_EditorClassIdentifier: + _trackedObject: {fileID: 1551772755} + _currentRotation: 0 + _lookingForward: 0 + _lookDirectionForwardMin: -0.38 + _lookDirectionForwardMax: 0.38 + _lookingBack: 0 + _lookDirectionBackMin: -0.93 + _lookDirectionBackMax: 0.93 + _lookingLeft: 0 + _lookDirectionLeftMin: -0.92 + _lookDirectionLeftMax: -0.39 + _lookingRight: 0 + _lookDirectionRightMin: 0.39 + _lookDirectionRightMax: 0.92 --- !u!1 &1591108313 GameObject: m_ObjectHideFlags: 0 @@ -3419,7 +3460,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 1764865396} - m_Layer: 0 + m_Layer: 3 m_Name: Colliders m_TagString: Untagged m_Icon: {fileID: 0} @@ -4217,7 +4258,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 2100773756} - m_Layer: 0 + m_Layer: 3 m_Name: PCPlayerBody m_TagString: Untagged m_Icon: {fileID: 0} diff --git a/Assets/Scripts/Player/Character/Controller/Alive/CharacterHover.cs b/Assets/Scripts/Player/Character/Controller/Alive/CharacterHover.cs index 2d6345f..583f679 100644 --- a/Assets/Scripts/Player/Character/Controller/Alive/CharacterHover.cs +++ b/Assets/Scripts/Player/Character/Controller/Alive/CharacterHover.cs @@ -6,30 +6,36 @@ namespace TTTSC.Player.Character.Controller { public class CharacterHover : MonoBehaviour { + [SerializeField] + float _capsuleCastHight, _capsuleCastRadius; + + Vector3 _downVector; + [SerializeField] private CharacterReffrenceHub characterReffrenceHub; private CharacterMovementConfig _characterMovementConfig; private CharacterStateMachine _characterStateMachine; [SerializeField] - private Transform _groundCheckOrigins; - [SerializeField] - float _groundCheckLength; + private Transform _groundCheckOrigin; [SerializeField] LayerMask _layerMask; - public float hoverHight; + + public float hoverForce { get; private set; } + + public float currentHoverHight; + + RaycastHit _hoverRayHit; + [SerializeField] - float _hoverStrenght, _hoverDampening; - public float hoverForces { get; private set; } - - RaycastHit _hoverRayHits; - - bool _rayStatuses; + Mesh _capsuleMesh; + + bool _rayStatus; private void OnDrawGizmos() { - Gizmos.DrawLine(_groundCheckOrigins.transform.position, _groundCheckOrigins.transform.position + Vector3.down * _groundCheckLength); + _characterMovementConfig = characterReffrenceHub.characterMovementConfig; - switch (_rayStatuses) + switch (_rayStatus) { case true: Gizmos.color = Color.green; @@ -38,6 +44,16 @@ namespace TTTSC.Player.Character.Controller Gizmos.color = Color.red; break; } + + Gizmos.DrawMesh(_capsuleMesh, new Vector3(_groundCheckOrigin.position.x, (_groundCheckOrigin.position.y - _capsuleCastHight) - _hoverRayHit.distance, _groundCheckOrigin.position.z), Quaternion.identity,new Vector3(_capsuleCastRadius * 2,_capsuleCastHight / 2,_capsuleCastRadius * 2)); + + //Gizmos.DrawSphere(new Vector3(_groundCheckOrigin.position.x, (_capsuleCastHight / 2) + _groundCheckOrigin.position.y , _groundCheckOrigin.position.z), 0.5f); + //Gizmos.DrawSphere(new Vector3(_groundCheckOrigin.position.x, (-_capsuleCastHight / 2) + _groundCheckOrigin.position.y, _groundCheckOrigin.position.z), 0.5f); + + Gizmos.DrawLine(_groundCheckOrigin.transform.position, _groundCheckOrigin.transform.position + _downVector * _characterMovementConfig.groundCheckLength); + + + } private void Awake() @@ -49,36 +65,35 @@ namespace TTTSC.Player.Character.Controller // Update is called once per frame void FixedUpdate() { - Vector3 downVector = transform.TransformDirection(Vector3.down); + _downVector = transform.TransformDirection(Vector3.down); Vector3 characterVelocity = _characterMovementConfig.characterRigidbody.velocity; + _rayStatus = Physics.CapsuleCast(new Vector3(_groundCheckOrigin.position.x, (_capsuleCastHight / 2) + _groundCheckOrigin.position.y, _groundCheckOrigin.position.z), + new Vector3(_groundCheckOrigin.position.x, (-_capsuleCastHight / 2) + _groundCheckOrigin.position.y, _groundCheckOrigin.position.z), _capsuleCastRadius,_downVector, out _hoverRayHit, _characterMovementConfig.groundCheckLength, _layerMask); - _rayStatuses = Physics.Raycast(_groundCheckOrigins.position, downVector, out _hoverRayHits, _groundCheckLength, _layerMask); - - switch (_rayStatuses) + switch (_rayStatus) { case true: Vector3 otherObjectVelocity = Vector3.zero; _characterStateMachine.characterState = CharacterStateMachine.CharacterStates.Grounded; - Rigidbody otherRigidbody = _hoverRayHits.rigidbody; + Rigidbody otherRigidbody = _hoverRayHit.rigidbody; if (otherRigidbody != null) { otherObjectVelocity = otherRigidbody.velocity; - } - float characterDirectionalVelocity = Vector3.Dot(downVector, characterVelocity); - float otherObjectDirectionalVelocity = Vector3.Dot(downVector, otherObjectVelocity); + float characterDirectionalVelocity = Vector3.Dot(_downVector, characterVelocity); + float otherObjectDirectionalVelocity = Vector3.Dot(_downVector, otherObjectVelocity); float realVelocity = characterDirectionalVelocity - otherObjectDirectionalVelocity; - float characterHightDiffrence = _hoverRayHits.distance - hoverHight; + float characterHightDiffrence = _hoverRayHit.distance - currentHoverHight; - hoverForces = (characterHightDiffrence * _hoverStrenght) - (realVelocity * _hoverDampening) * Time.deltaTime; + hoverForce = (characterHightDiffrence * _characterMovementConfig.hoverStrenght) - (realVelocity * _characterMovementConfig.hoverDampening) * Time.deltaTime; //Debug.Log("ray number " + ray + " found ground " + characterHightDiffrence); @@ -88,7 +103,7 @@ namespace TTTSC.Player.Character.Controller case false: _characterStateMachine.characterState = CharacterStateMachine.CharacterStates.InAir; - hoverForces = 0; + hoverForce = 0; //Debug.Log("ray number " + ray + " did not found ground"); diff --git a/Assets/Scripts/Player/Character/Controller/Alive/CharacterMover.cs b/Assets/Scripts/Player/Character/Controller/Alive/CharacterMover.cs index 64dde99..ccbfacf 100644 --- a/Assets/Scripts/Player/Character/Controller/Alive/CharacterMover.cs +++ b/Assets/Scripts/Player/Character/Controller/Alive/CharacterMover.cs @@ -15,12 +15,21 @@ namespace TTTSC.Player.Character.Controller.Alive private CharacterHover _characterHover; private PlayerInputReceiver _playerInputReceiver; private Rigidbody _characterRigidbody; + + [SerializeField] + private float _inAirCounterForce, _moveCounterForce; + + [SerializeField] + private bool _autoB_Hop; + [SerializeField] private ForceModes _hoverForceMode, _moveForceMode; [SerializeField] private float _characterDrag; + private float _jumpStageValue; + private bool _jumpInputHeld; private bool _performingMoveInput; private Vector3 _moveDirection; @@ -32,7 +41,10 @@ namespace TTTSC.Player.Character.Controller.Alive _characterMovementConfig = _ReffrenceHub.characterMovementConfig; _characterHover = _ReffrenceHub.characterHover; _playerInputReceiver = _ReffrenceHub.playerInputReceiver; + + _playerInputReceiver.MoveInputEvent += MoveInput; + _playerInputReceiver.JumpInputEvent += JumpInput; } void Start() @@ -48,6 +60,13 @@ namespace TTTSC.Player.Character.Controller.Alive _moveDirection = new Vector2(moveDirection.x, moveDirection.y); } + //Remember to change jumpPower from 0 to some other number that preferably is in the positives and not negatives + private void JumpInput(bool performed, float stageValue) + { + _jumpInputHeld = performed; + _jumpStageValue = stageValue; + } + #endregion enum ForceModes @@ -61,6 +80,7 @@ namespace TTTSC.Player.Character.Controller.Alive private void FixedUpdate() { + Vector3 downVector = transform.TransformDirection(Vector3.down); Drag(); @@ -68,20 +88,29 @@ namespace TTTSC.Player.Character.Controller.Alive switch (_characterStateMachine.characterState) { case CharacterStateMachine.CharacterStates.Grounded: - _characterDrag = 10; + if (_characterStateMachine.movementStates == CharacterStateMachine.MovementStates.Idle) + { + _characterDrag = _characterMovementConfig.idleDrag; + } + else + { + _characterDrag = _characterMovementConfig.moveDrag; + } Move(); + Jump(); + break; case CharacterStateMachine.CharacterStates.InAir: - _characterDrag = 0; + _characterDrag = _characterMovementConfig.inAirDrag; InAirMove(); break; } - _characterRigidbody.AddForce(_characterHover.hoverForces * downVector, ForceMode.VelocityChange); + _characterRigidbody.AddForce(_characterHover.hoverForce * downVector, ForceMode.VelocityChange); } @@ -120,48 +149,92 @@ namespace TTTSC.Player.Character.Controller.Alive private void InAirMove() { Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward; + + Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.airControlForce; + + Vector3 counterForce = -movement.normalized * _inAirCounterForce; - Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.airControlStrength; if (_characterStateMachine.movementStates == CharacterStateMachine.MovementStates.Walking) { - _characterRigidbody.AddForce(normalizedMovement, ForceMode.Impulse); + _characterRigidbody.AddForce(normalizedMovement, ForceMode.VelocityChange); + _characterRigidbody.AddForce(counterForce, ForceMode.VelocityChange); } } private void Jump() { + + switch (_autoB_Hop) + { + case true: + if (_jumpInputHeld && _characterStateMachine.movementStates != CharacterStateMachine.MovementStates.Crouching) + { + _characterRigidbody.velocity = new Vector3(_characterRigidbody.velocity.x, 0f, _characterRigidbody.velocity.z); + _characterRigidbody.AddForce(_characterMovementConfig.jumpForce * transform.up, ForceMode.VelocityChange); + } + break; + case false: + if (_jumpStageValue == 1 && _characterStateMachine.movementStates != CharacterStateMachine.MovementStates.Crouching) + { + _characterRigidbody.velocity = new Vector3(_characterRigidbody.velocity.x, 0f, _characterRigidbody.velocity.z); + _characterRigidbody.AddForce(_characterMovementConfig.jumpForce * transform.up, ForceMode.VelocityChange); + } + break; + + } + } - + private void Walking() { Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward; - Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.moveSpeed; + Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.moveForce; - _characterRigidbody.AddForce(normalizedMovement, ForceMode.Impulse); + Vector3 counterForce = -movement.normalized * _characterMovementConfig.moveCounterForce; + + _characterRigidbody.AddForce(normalizedMovement, ForceMode.VelocityChange); + //_characterRigidbody.AddForce(counterForce, ForceMode.VelocityChange); } private void Crouching() { + //bool switched; + Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward; - Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.moveSpeed / _characterMovementConfig.crouchSpeedDecrease; - - _characterRigidbody.AddForce(normalizedMovement, ForceMode.Impulse); + Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.crouchMoveForce; + + Vector3 counterForce = -movement.normalized * _characterMovementConfig.crouchMoveCounterForce; + + /*(switch (switched) + { + case false: + _characterRigidbody.AddForce(_characterRigidbody.velocity, ForceMode.VelocityChange); + switched = true; + break; + }*/ + + _characterRigidbody.AddForce(normalizedMovement, ForceMode.VelocityChange); + //_characterRigidbody.AddForce(counterForce, ForceMode.VelocityChange); } private void Sprinting() { + Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward; - Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.moveSpeed * _characterMovementConfig.sprintSpeedIncrease; + Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.sprintMoveForce; + + Vector3 counterForce = -movement.normalized *_characterMovementConfig.sprintMoveCounterForce; - _characterRigidbody.AddForce(normalizedMovement, ForceMode.Impulse); + _characterRigidbody.AddForce(normalizedMovement, ForceMode.VelocityChange); + //_characterRigidbody.AddForce(counterForce, ForceMode.VelocityChange); } } diff --git a/Assets/Scripts/Player/Character/Controller/CharacterMovementConfig.cs b/Assets/Scripts/Player/Character/Controller/CharacterMovementConfig.cs index 53021f7..1def7ce 100644 --- a/Assets/Scripts/Player/Character/Controller/CharacterMovementConfig.cs +++ b/Assets/Scripts/Player/Character/Controller/CharacterMovementConfig.cs @@ -5,20 +5,37 @@ namespace TTTSC.Player.Character.Controller public class CharacterMovementConfig : MonoBehaviour { public Rigidbody characterRigidbody; // Rigidbody that will be used for moving character around - public float moveSpeed; // This value controlls at what speed your character walks - public float airControlStrength; // This value controlls strenght of the force applied to the player when in the air - public float crouchSpeedDecrease; // This value controlls how much slower are you while crouching (equasion: walkSpeed / crouchSpeedDecrease) - public float sprintSpeedIncrease; // This value controlls how much faster are you while sprinting (equasion: walkSpeed * sprintSpeedIncrease) - public float ladderClimbingSpeed; // This value controlls how fast dose the character climb ladders - public float jumpPower; // This value controlls character's jump height + + [Header("On Ground")] + public float moveForce; // This value controlls at what speed your character walks + public float moveCounterForce; // This value controlls at what speed your character walks + public float crouchMoveForce; // This value controlls how much slower are you while crouching (equasion: walkSpeed / crouchSpeedDecrease) + public float crouchMoveCounterForce; // This value controlls how much slower are you while crouching (equasion: walkSpeed / crouchSpeedDecrease) + public float sprintMoveForce; // This value controlls how much faster are you while sprinting (equasion: walkSpeed * sprintSpeedIncrease) + public float sprintMoveCounterForce; // This value controlls h ow much faster are you while sprinting (equasion: walkSpeed * sprintSpeedIncrease) + public float ladderClimbingForce; // This value controlls how fast dose the character climb ladders + public float desieredHoverHight; public float crouchHeight; // This value controlls the hight of player when crouched public float crouchSmoothing; // This value controlls the transition speed of standing to crouch and viceversa + public bool allowSprint; // bool for enabling sprint + public float jumpForce; // This value controlls character's jump height + + [Header("Drag")] + public float idleDrag; + public float moveDrag; + public float inAirDrag; + + [Header("Hover")] + public float groundCheckLength; + public float hoverStrenght; + public float hoverDampening; + + [Header("Misc")] + public float airControlForce; // This value controlls strenght of the force applied to the player when in the air + public float airControlCounterForce; // This value controlls strenght of the force applied to the player when in the air public float lookVerticalSpeed; // This value controlls vertical looking speed public float lookHorizontalSpeed; // This value controlls horizontal looking speed public float aimVerticalSpeed; // This value controlls vertical looking speed while aiming down the sight public float aimHorizontalSpeed; // This value controlls horizontal looking speed while aiming down the sight - public float stepSmoothing; // This value controlls the time value of lerp in CameraSmoother - public float stepHeight; // This value controlls how high steps charecter takes - public bool allowSprint; // bool for enabling sprint } -} \ No newline at end of file +} \ No newline at end of file diff --git a/Assets/Scripts/Player/Character/Controller/CharacterStateChanger.cs b/Assets/Scripts/Player/Character/Controller/CharacterStateChanger.cs index de4601c..5a92d70 100644 --- a/Assets/Scripts/Player/Character/Controller/CharacterStateChanger.cs +++ b/Assets/Scripts/Player/Character/Controller/CharacterStateChanger.cs @@ -11,7 +11,7 @@ namespace TTTSC.Player.Character.Controller private PlayerInputReceiver _playerInputReceiver; private CharacterStateMachine _characterStateMachine; - private bool _walkIsPerforming, _crouchIsPerforming, _sprintIsPerforming; + private bool _walkIsPerforming, _crouchIsHeld, _sprintIsPerforming; private void Awake() { @@ -29,36 +29,32 @@ namespace TTTSC.Player.Character.Controller private void Walk(Vector2 direction, bool performing) { _walkIsPerforming = performing; - - } - private void Crouch(bool performing) + private void Crouch(bool performing, float stageValue) { - _crouchIsPerforming = performing; - - if (!_sprintIsPerforming) - _characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Crouching; + _crouchIsHeld = performing; } - private void Sprint(bool performing) + private void Sprint(bool held, float stageValue) { - _sprintIsPerforming = performing; - - + _sprintIsPerforming = held; } private void Update() { - if (_walkIsPerforming && !_crouchIsPerforming && !_sprintIsPerforming) + if (_crouchIsHeld && !_sprintIsPerforming) + _characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Crouching; + + if (_walkIsPerforming && !_crouchIsHeld && !_sprintIsPerforming) _characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Walking; - if (_sprintIsPerforming && !_crouchIsPerforming && _walkIsPerforming) + if (_sprintIsPerforming && !_crouchIsHeld && _walkIsPerforming) _characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Sprinting; - if (!_walkIsPerforming && !_crouchIsPerforming && !_sprintIsPerforming) + if (!_walkIsPerforming && !_crouchIsHeld && !_sprintIsPerforming) { _characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Idle; } diff --git a/Assets/Scripts/Player/Character/Controller/CharacterStateEnforcer.cs b/Assets/Scripts/Player/Character/Controller/CharacterStateEnforcer.cs index 3ba4728..9a458b9 100644 --- a/Assets/Scripts/Player/Character/Controller/CharacterStateEnforcer.cs +++ b/Assets/Scripts/Player/Character/Controller/CharacterStateEnforcer.cs @@ -9,6 +9,23 @@ namespace TTTSC.Player.Character.Controller [SerializeField] private CharacterReffrenceHub _reffrenceHub; + + [Header("Normal")] + [SerializeField] + private Vector3 _desieredStandingColliderPosition; + [SerializeField] + private float _desieredStandingColliderHight; + + [Header("Crouched")] + [SerializeField] + private Vector3 _desieredCrouchedColliderPosition; + [SerializeField] + private float _desieredCrouchedColliderHight; + + + [SerializeField] + private CapsuleCollider _characterEnviormentCollider; + private CharacterMovementConfig _characterMovementConfig; private CharacterHover _characterHover; private CharacterStateMachine _characterStateMachine; @@ -17,6 +34,7 @@ namespace TTTSC.Player.Character.Controller void Start() { _characterHover = GetComponent(); + _characterMovementConfig = GetComponent(); _characterStateMachine = GetComponent(); } @@ -36,12 +54,19 @@ namespace TTTSC.Player.Character.Controller private void CharacterCrouch() { - _characterHover.hoverHight = 1f; + _characterHover.currentHoverHight = _characterMovementConfig.crouchHeight; + + _characterEnviormentCollider.height = _desieredCrouchedColliderHight; + _characterEnviormentCollider.center = _desieredCrouchedColliderPosition; } private void CharacterDefault() { - _characterHover.hoverHight = 1.4f; + _characterHover.currentHoverHight = _characterMovementConfig.desieredHoverHight; + + _characterEnviormentCollider.height = _desieredStandingColliderHight; + _characterEnviormentCollider.center = _desieredStandingColliderPosition; + } } } diff --git a/Assets/Scripts/Player/Character/Controller/Core/PlayerInputSender.cs b/Assets/Scripts/Player/Character/Controller/Core/PlayerInputSender.cs index 1495523..3ebfdf4 100644 --- a/Assets/Scripts/Player/Character/Controller/Core/PlayerInputSender.cs +++ b/Assets/Scripts/Player/Character/Controller/Core/PlayerInputSender.cs @@ -62,7 +62,7 @@ namespace TTTSC.Player.Character.Controller ""id"": ""edb5e334-0aab-4f72-8872-53382954c983"", ""expectedControlType"": ""Button"", ""processors"": """", - ""interactions"": """", + ""interactions"": ""Hold(duration=0.2)"", ""initialStateCheck"": false }, { diff --git a/Assets/Scripts/Player/Character/Controller/PlayerInputReceiver.cs b/Assets/Scripts/Player/Character/Controller/PlayerInputReceiver.cs index a577294..3e36b35 100644 --- a/Assets/Scripts/Player/Character/Controller/PlayerInputReceiver.cs +++ b/Assets/Scripts/Player/Character/Controller/PlayerInputReceiver.cs @@ -8,8 +8,10 @@ namespace TTTSC.Player.Character.Controller { private float _lookX, _lookY; + bool _sprintIsHeld, _crouchIsHeld, _jumpIsHeld; + float _sprintStageValue, _crouchStageValue, _jumpStageValue; public event Action MoveInputEvent, LookInputEvent; - public event Action SprintInputEvent, CrouchInputEvent, JumpInputEvent; + public event Action SprintInputEvent, CrouchInputEvent, JumpInputEvent; public PlayerInputSender playerInputEvents; @@ -37,6 +39,8 @@ namespace TTTSC.Player.Character.Controller playerInputEvents.Controlls.Crouch.performed -= CrouchInputReceiver; } + #region FloatBool function + bool FloatBool(float a, string calculationOperator, float b) { bool result = false; @@ -118,6 +122,28 @@ namespace TTTSC.Player.Character.Controller } return result; } + #endregion + + private void FixedUpdate() + { + playerInputEvents.Controlls.Sprint.started += ctx => _sprintStageValue = 1; + playerInputEvents.Controlls.Sprint.performed += ctx => _sprintStageValue = 2; + playerInputEvents.Controlls.Sprint.canceled += ctx => _sprintStageValue = 0; + + SprintInputEvent?.Invoke(_sprintIsHeld, _sprintStageValue); + + playerInputEvents.Controlls.Crouch.started += ctx => _crouchStageValue = 1; + playerInputEvents.Controlls.Crouch.performed += ctx => _crouchStageValue = 2; + playerInputEvents.Controlls.Crouch.canceled += ctx => _crouchStageValue = 0; + + CrouchInputEvent?.Invoke(_crouchIsHeld, _crouchStageValue); + + playerInputEvents.Controlls.Jump.started += ctx => _jumpStageValue = 1; + playerInputEvents.Controlls.Jump.performed += ctx => _jumpStageValue = 2; + playerInputEvents.Controlls.Jump.canceled += ctx => _jumpStageValue = 0; + + JumpInputEvent?.Invoke(_jumpIsHeld, _jumpStageValue); + } private void LookXInputReceiver(InputAction.CallbackContext ctx) { @@ -132,6 +158,7 @@ namespace TTTSC.Player.Character.Controller float value = ctx.ReadValue(); _lookY = value; + Look(FloatBool(value, "!=", 0)); } @@ -145,7 +172,7 @@ namespace TTTSC.Player.Character.Controller private void WalkInputReceiver(InputAction.CallbackContext ctx) { var value = ctx.ReadValue(); - + bool performing = !(value == new Vector2(0, 0)); MoveInputEvent?.Invoke(value, performing); @@ -155,19 +182,28 @@ namespace TTTSC.Player.Character.Controller { float value = ctx.ReadValue(); - SprintInputEvent?.Invoke(FloatBool(value, "==", 1)); + _sprintIsHeld = FloatBool(value, "==", 1); + + + } private void CrouchInputReceiver(InputAction.CallbackContext ctx) { float value = ctx.ReadValue(); - CrouchInputEvent?.Invoke(FloatBool(value, "==", 1)); + _crouchIsHeld = FloatBool(value, "==", 1); + + + } private void JumpInputReceiver(InputAction.CallbackContext ctx) { - JumpInputEvent?.Invoke(ctx.ReadValue()); + float value = ctx.ReadValue(); + + _jumpIsHeld = FloatBool(value, "==", 1); + } } } diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index 1c92a78..3baead5 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -3,20 +3,21 @@ --- !u!78 &1 TagManager: serializedVersion: 2 - tags: [] + tags: + - Ladder layers: - Default - TransparentFX - Ignore Raycast - - + - Player - Water - UI - - - - - - - - - - - - + - Object + - CharEnvironmentCollider + - CharObjectCollider + - Enviorment + - Ladder + - Stairs - - -