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
This commit is contained in:
Mikolaj 2022-05-03 07:05:29 +02:00
parent 7ca474aba1
commit d9f869fbd4
13 changed files with 414 additions and 114 deletions

View file

@ -38,7 +38,7 @@
"id": "edb5e334-0aab-4f72-8872-53382954c983",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"interactions": "Hold(duration=0.2)",
"initialStateCheck": false
},
{

View file

@ -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);
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8182877c8e1aff543b5bd05e5a5c7c8f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -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

View file

@ -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}

View file

@ -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");

View file

@ -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);
}
}

View file

@ -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
}
}
}

View file

@ -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;
}

View file

@ -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<CharacterHover>();
_characterMovementConfig = GetComponent<CharacterMovementConfig>();
_characterStateMachine = GetComponent<CharacterStateMachine>();
}
@ -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;
}
}
}

View file

@ -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
},
{

View file

@ -8,8 +8,10 @@ namespace TTTSC.Player.Character.Controller
{
private float _lookX, _lookY;
bool _sprintIsHeld, _crouchIsHeld, _jumpIsHeld;
float _sprintStageValue, _crouchStageValue, _jumpStageValue;
public event Action<Vector2, bool> MoveInputEvent, LookInputEvent;
public event Action<bool> SprintInputEvent, CrouchInputEvent, JumpInputEvent;
public event Action<bool, float> 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<float>();
_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<Vector2>();
bool performing = !(value == new Vector2(0, 0));
MoveInputEvent?.Invoke(value, performing);
@ -155,19 +182,28 @@ namespace TTTSC.Player.Character.Controller
{
float value = ctx.ReadValue<float>();
SprintInputEvent?.Invoke(FloatBool(value, "==", 1));
_sprintIsHeld = FloatBool(value, "==", 1);
}
private void CrouchInputReceiver(InputAction.CallbackContext ctx)
{
float value = ctx.ReadValue<float>();
CrouchInputEvent?.Invoke(FloatBool(value, "==", 1));
_crouchIsHeld = FloatBool(value, "==", 1);
}
private void JumpInputReceiver(InputAction.CallbackContext ctx)
{
JumpInputEvent?.Invoke(ctx.ReadValue<bool>());
float value = ctx.ReadValue<float>();
_jumpIsHeld = FloatBool(value, "==", 1);
}
}
}

View file

@ -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
-
-
-