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", "id": "edb5e334-0aab-4f72-8872-53382954c983",
"expectedControlType": "Button", "expectedControlType": "Button",
"processors": "", "processors": "",
"interactions": "", "interactions": "Hold(duration=0.2)",
"initialStateCheck": false "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_Modification:
m_TransformParent: {fileID: 740122246} m_TransformParent: {fileID: 740122246}
m_Modifications: m_Modifications:
- target: {fileID: 4618792495020702613, guid: a6c9897145ea93b41abf3c531f857e3b,
type: 3}
propertyPath: maxNormalmSlots
value: 6
objectReference: {fileID: 0}
- target: {fileID: 4618792496510273084, guid: a6c9897145ea93b41abf3c531f857e3b, - target: {fileID: 4618792496510273084, guid: a6c9897145ea93b41abf3c531f857e3b,
type: 3} type: 3}
propertyPath: m_RootOrder propertyPath: m_RootOrder

View file

@ -266,7 +266,7 @@ GameObject:
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 164827064} - component: {fileID: 164827064}
m_Layer: 0 m_Layer: 3
m_Name: CameraHolder m_Name: CameraHolder
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
@ -338,7 +338,7 @@ GameObject:
- component: {fileID: 275207161} - component: {fileID: 275207161}
- component: {fileID: 275207163} - component: {fileID: 275207163}
- component: {fileID: 275207162} - component: {fileID: 275207162}
m_Layer: 0 m_Layer: 3
m_Name: Alive m_Name: Alive
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
@ -398,6 +398,9 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
_ReffrenceHub: {fileID: 1551772761} _ReffrenceHub: {fileID: 1551772761}
_inAirCounterForce: 0.2
_moveCounterForce: 0.88
_autoB_Hop: 0
_hoverForceMode: 3 _hoverForceMode: 3
_moveForceMode: 2 _moveForceMode: 2
_characterDrag: 10 _characterDrag: 10
@ -413,15 +416,15 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 47fbeaf5a8b077b4196092280e5755df, type: 3} m_Script: {fileID: 11500000, guid: 47fbeaf5a8b077b4196092280e5755df, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
_capsuleCastHight: 0.25
_capsuleCastRadius: 0.35
characterReffrenceHub: {fileID: 1551772761} characterReffrenceHub: {fileID: 1551772761}
_groundCheckOrigins: {fileID: 955568360} _groundCheckOrigin: {fileID: 955568360}
_groundCheckLength: 1.5
_layerMask: _layerMask:
serializedVersion: 2 serializedVersion: 2
m_Bits: 512 m_Bits: 576
hoverHight: 1.4 currentHoverHight: 0
_hoverStrenght: 2 _capsuleMesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0}
_hoverDampening: 10
--- !u!114 &275207160 --- !u!114 &275207160
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -435,21 +438,27 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
characterRigidbody: {fileID: 1551772756} characterRigidbody: {fileID: 1551772756}
moveSpeed: 1 moveForce: 1
airControlStrength: 0.1 moveCounterForce: 0.88
crouchSpeedDecrease: 2 crouchMoveForce: 0.7
sprintSpeedIncrease: 1.5 crouchMoveCounterForce: 0.6
ladderClimbingSpeed: 0 sprintMoveForce: 0
jumpPower: 0 sprintMoveCounterForce: 0
crouchHeight: 0 ladderClimbingForce: 0
desieredHoverHight: 1.2
crouchHeight: 0.7
crouchSmoothing: 0 crouchSmoothing: 0
allowSprint: 0
jumpForce: 3
groundCheckLength: 1.1
hoverStrenght: 0.43
hoverDampening: 5
airControlForce: 0
airControlCounterForce: 0
lookVerticalSpeed: 300 lookVerticalSpeed: 300
lookHorizontalSpeed: 300 lookHorizontalSpeed: 300
aimVerticalSpeed: 0 aimVerticalSpeed: 0
aimHorizontalSpeed: 0 aimHorizontalSpeed: 0
stepSmoothing: 0
stepHeight: 0
allowSprint: 0
--- !u!114 &275207161 --- !u!114 &275207161
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -498,7 +507,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 68e69a066cfcd3b45b91db0b5825eea3, type: 3} m_Script: {fileID: 11500000, guid: 68e69a066cfcd3b45b91db0b5825eea3, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: 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 --- !u!1 &351313843
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -852,13 +866,13 @@ GameObject:
- component: {fileID: 525099634} - component: {fileID: 525099634}
- component: {fileID: 525099637} - component: {fileID: 525099637}
- component: {fileID: 525099636} - component: {fileID: 525099636}
m_Layer: 0 m_Layer: 3
m_Name: Cube m_Name: Cube
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
m_StaticEditorFlags: 0 m_StaticEditorFlags: 0
m_IsActive: 1 m_IsActive: 0
--- !u!4 &525099634 --- !u!4 &525099634
Transform: Transform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -867,8 +881,8 @@ Transform:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 525099633} m_GameObject: {fileID: 525099633}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.479, z: 0} m_LocalPosition: {x: 0, y: 0.681, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 0.8, y: 0.8, z: 0.8}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 1203630888} m_Father: {fileID: 1203630888}
@ -937,7 +951,7 @@ GameObject:
- component: {fileID: 555114078} - component: {fileID: 555114078}
- component: {fileID: 555114077} - component: {fileID: 555114077}
- component: {fileID: 555114076} - component: {fileID: 555114076}
m_Layer: 0 m_Layer: 6
m_Name: Cube m_Name: Cube
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
@ -952,7 +966,7 @@ Rigidbody:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 555114075} m_GameObject: {fileID: 555114075}
serializedVersion: 2 serializedVersion: 2
m_Mass: 1 m_Mass: 10
m_Drag: 0 m_Drag: 0
m_AngularDrag: 0.05 m_AngularDrag: 0.05
m_UseGravity: 1 m_UseGravity: 1
@ -1615,7 +1629,7 @@ GameObject:
- component: {fileID: 883269171} - component: {fileID: 883269171}
- component: {fileID: 883269174} - component: {fileID: 883269174}
- component: {fileID: 883269173} - component: {fileID: 883269173}
m_Layer: 0 m_Layer: 3
m_Name: Capsule m_Name: Capsule
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
@ -1631,7 +1645,7 @@ Transform:
m_GameObject: {fileID: 883269170} m_GameObject: {fileID: 883269170}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} 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_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 1203630888} m_Father: {fileID: 1203630888}
@ -1732,7 +1746,7 @@ GameObject:
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 955568360} - component: {fileID: 955568360}
m_Layer: 0 m_Layer: 3
m_Name: GroundCheck m_Name: GroundCheck
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
@ -2463,7 +2477,7 @@ GameObject:
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 1203630888} - component: {fileID: 1203630888}
m_Layer: 0 m_Layer: 3
m_Name: PlayerModel m_Name: PlayerModel
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
@ -2595,7 +2609,7 @@ GameObject:
m_Component: m_Component:
- component: {fileID: 1224580544} - component: {fileID: 1224580544}
- component: {fileID: 1224580545} - component: {fileID: 1224580545}
m_Layer: 7 m_Layer: 3
m_Name: EnviormentCollider m_Name: EnviormentCollider
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
@ -2627,10 +2641,10 @@ CapsuleCollider:
m_Material: {fileID: 13400000, guid: c67f223e1c1ff6d44956ef766851951c, type: 2} m_Material: {fileID: 13400000, guid: c67f223e1c1ff6d44956ef766851951c, type: 2}
m_IsTrigger: 0 m_IsTrigger: 0
m_Enabled: 1 m_Enabled: 1
m_Radius: 0.5 m_Radius: 0.4
m_Height: 1.6 m_Height: 1.6
m_Direction: 1 m_Direction: 1
m_Center: {x: 0, y: 0.1, z: 0} m_Center: {x: 0, y: 0.2, z: 0}
--- !u!1 &1244159270 --- !u!1 &1244159270
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -3085,9 +3099,10 @@ GameObject:
- component: {fileID: 1551772752} - component: {fileID: 1551772752}
- component: {fileID: 1551772758} - component: {fileID: 1551772758}
- component: {fileID: 1551772756} - component: {fileID: 1551772756}
m_Layer: 0 - component: {fileID: 1551772762}
m_Layer: 3
m_Name: Player_Ghost m_Name: Player_Ghost
m_TagString: Untagged m_TagString: Player
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
m_StaticEditorFlags: 0 m_StaticEditorFlags: 0
@ -3183,6 +3198,32 @@ MonoBehaviour:
playerInputReceiver: {fileID: 1551772752} playerInputReceiver: {fileID: 1551772752}
characterHover: {fileID: 275207159} characterHover: {fileID: 275207159}
characterStateChanger: {fileID: 275207161} 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 --- !u!1 &1591108313
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -3419,7 +3460,7 @@ GameObject:
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 1764865396} - component: {fileID: 1764865396}
m_Layer: 0 m_Layer: 3
m_Name: Colliders m_Name: Colliders
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
@ -4217,7 +4258,7 @@ GameObject:
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 2100773756} - component: {fileID: 2100773756}
m_Layer: 0 m_Layer: 3
m_Name: PCPlayerBody m_Name: PCPlayerBody
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}

View file

@ -6,30 +6,36 @@ namespace TTTSC.Player.Character.Controller
{ {
public class CharacterHover : MonoBehaviour public class CharacterHover : MonoBehaviour
{ {
[SerializeField]
float _capsuleCastHight, _capsuleCastRadius;
Vector3 _downVector;
[SerializeField] [SerializeField]
private CharacterReffrenceHub characterReffrenceHub; private CharacterReffrenceHub characterReffrenceHub;
private CharacterMovementConfig _characterMovementConfig; private CharacterMovementConfig _characterMovementConfig;
private CharacterStateMachine _characterStateMachine; private CharacterStateMachine _characterStateMachine;
[SerializeField] [SerializeField]
private Transform _groundCheckOrigins; private Transform _groundCheckOrigin;
[SerializeField]
float _groundCheckLength;
[SerializeField] [SerializeField]
LayerMask _layerMask; LayerMask _layerMask;
public float hoverHight;
public float hoverForce { get; private set; }
public float currentHoverHight;
RaycastHit _hoverRayHit;
[SerializeField] [SerializeField]
float _hoverStrenght, _hoverDampening; Mesh _capsuleMesh;
public float hoverForces { get; private set; }
RaycastHit _hoverRayHits; bool _rayStatus;
bool _rayStatuses;
private void OnDrawGizmos() private void OnDrawGizmos()
{ {
Gizmos.DrawLine(_groundCheckOrigins.transform.position, _groundCheckOrigins.transform.position + Vector3.down * _groundCheckLength); _characterMovementConfig = characterReffrenceHub.characterMovementConfig;
switch (_rayStatuses) switch (_rayStatus)
{ {
case true: case true:
Gizmos.color = Color.green; Gizmos.color = Color.green;
@ -38,6 +44,16 @@ namespace TTTSC.Player.Character.Controller
Gizmos.color = Color.red; Gizmos.color = Color.red;
break; 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() private void Awake()
@ -49,36 +65,35 @@ namespace TTTSC.Player.Character.Controller
// Update is called once per frame // Update is called once per frame
void FixedUpdate() void FixedUpdate()
{ {
Vector3 downVector = transform.TransformDirection(Vector3.down); _downVector = transform.TransformDirection(Vector3.down);
Vector3 characterVelocity = _characterMovementConfig.characterRigidbody.velocity; 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 (_rayStatus)
switch (_rayStatuses)
{ {
case true: case true:
Vector3 otherObjectVelocity = Vector3.zero; Vector3 otherObjectVelocity = Vector3.zero;
_characterStateMachine.characterState = CharacterStateMachine.CharacterStates.Grounded; _characterStateMachine.characterState = CharacterStateMachine.CharacterStates.Grounded;
Rigidbody otherRigidbody = _hoverRayHits.rigidbody; Rigidbody otherRigidbody = _hoverRayHit.rigidbody;
if (otherRigidbody != null) if (otherRigidbody != null)
{ {
otherObjectVelocity = otherRigidbody.velocity; otherObjectVelocity = otherRigidbody.velocity;
} }
float characterDirectionalVelocity = Vector3.Dot(downVector, characterVelocity); float characterDirectionalVelocity = Vector3.Dot(_downVector, characterVelocity);
float otherObjectDirectionalVelocity = Vector3.Dot(downVector, otherObjectVelocity); float otherObjectDirectionalVelocity = Vector3.Dot(_downVector, otherObjectVelocity);
float realVelocity = characterDirectionalVelocity - otherObjectDirectionalVelocity; 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); //Debug.Log("ray number " + ray + " found ground " + characterHightDiffrence);
@ -88,7 +103,7 @@ namespace TTTSC.Player.Character.Controller
case false: case false:
_characterStateMachine.characterState = CharacterStateMachine.CharacterStates.InAir; _characterStateMachine.characterState = CharacterStateMachine.CharacterStates.InAir;
hoverForces = 0; hoverForce = 0;
//Debug.Log("ray number " + ray + " did not found ground"); //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 CharacterHover _characterHover;
private PlayerInputReceiver _playerInputReceiver; private PlayerInputReceiver _playerInputReceiver;
private Rigidbody _characterRigidbody; private Rigidbody _characterRigidbody;
[SerializeField]
private float _inAirCounterForce, _moveCounterForce;
[SerializeField]
private bool _autoB_Hop;
[SerializeField] [SerializeField]
private ForceModes _hoverForceMode, _moveForceMode; private ForceModes _hoverForceMode, _moveForceMode;
[SerializeField] [SerializeField]
private float _characterDrag; private float _characterDrag;
private float _jumpStageValue;
private bool _jumpInputHeld;
private bool _performingMoveInput; private bool _performingMoveInput;
private Vector3 _moveDirection; private Vector3 _moveDirection;
@ -32,7 +41,10 @@ namespace TTTSC.Player.Character.Controller.Alive
_characterMovementConfig = _ReffrenceHub.characterMovementConfig; _characterMovementConfig = _ReffrenceHub.characterMovementConfig;
_characterHover = _ReffrenceHub.characterHover; _characterHover = _ReffrenceHub.characterHover;
_playerInputReceiver = _ReffrenceHub.playerInputReceiver; _playerInputReceiver = _ReffrenceHub.playerInputReceiver;
_playerInputReceiver.MoveInputEvent += MoveInput; _playerInputReceiver.MoveInputEvent += MoveInput;
_playerInputReceiver.JumpInputEvent += JumpInput;
} }
void Start() void Start()
@ -48,6 +60,13 @@ namespace TTTSC.Player.Character.Controller.Alive
_moveDirection = new Vector2(moveDirection.x, moveDirection.y); _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 #endregion
enum ForceModes enum ForceModes
@ -61,6 +80,7 @@ namespace TTTSC.Player.Character.Controller.Alive
private void FixedUpdate() private void FixedUpdate()
{ {
Vector3 downVector = transform.TransformDirection(Vector3.down); Vector3 downVector = transform.TransformDirection(Vector3.down);
Drag(); Drag();
@ -68,20 +88,29 @@ namespace TTTSC.Player.Character.Controller.Alive
switch (_characterStateMachine.characterState) switch (_characterStateMachine.characterState)
{ {
case CharacterStateMachine.CharacterStates.Grounded: case CharacterStateMachine.CharacterStates.Grounded:
_characterDrag = 10; if (_characterStateMachine.movementStates == CharacterStateMachine.MovementStates.Idle)
{
_characterDrag = _characterMovementConfig.idleDrag;
}
else
{
_characterDrag = _characterMovementConfig.moveDrag;
}
Move(); Move();
Jump();
break; break;
case CharacterStateMachine.CharacterStates.InAir: case CharacterStateMachine.CharacterStates.InAir:
_characterDrag = 0; _characterDrag = _characterMovementConfig.inAirDrag;
InAirMove(); InAirMove();
break; break;
} }
_characterRigidbody.AddForce(_characterHover.hoverForces * downVector, ForceMode.VelocityChange); _characterRigidbody.AddForce(_characterHover.hoverForce * downVector, ForceMode.VelocityChange);
} }
@ -121,13 +150,17 @@ namespace TTTSC.Player.Character.Controller.Alive
{ {
Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward; Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward;
Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.airControlStrength; Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.airControlForce;
Vector3 counterForce = -movement.normalized * _inAirCounterForce;
if (_characterStateMachine.movementStates == CharacterStateMachine.MovementStates.Walking) if (_characterStateMachine.movementStates == CharacterStateMachine.MovementStates.Walking)
{ {
_characterRigidbody.AddForce(normalizedMovement, ForceMode.Impulse); _characterRigidbody.AddForce(normalizedMovement, ForceMode.VelocityChange);
_characterRigidbody.AddForce(counterForce, ForceMode.VelocityChange);
} }
} }
@ -135,33 +168,73 @@ namespace TTTSC.Player.Character.Controller.Alive
private void Jump() 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() private void Walking()
{ {
Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward; 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() private void Crouching()
{ {
//bool switched;
Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward; Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward;
Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.moveSpeed / _characterMovementConfig.crouchSpeedDecrease; Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.crouchMoveForce;
_characterRigidbody.AddForce(normalizedMovement, ForceMode.Impulse); 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() private void Sprinting()
{ {
Vector3 movement = _moveDirection.x * Time.deltaTime * transform.right + _moveDirection.y * Time.deltaTime * transform.forward; 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;
_characterRigidbody.AddForce(normalizedMovement, ForceMode.Impulse); Vector3 counterForce = -movement.normalized *_characterMovementConfig.sprintMoveCounterForce;
_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 class CharacterMovementConfig : MonoBehaviour
{ {
public Rigidbody characterRigidbody; // Rigidbody that will be used for moving character around 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 [Header("On Ground")]
public float crouchSpeedDecrease; // This value controlls how much slower are you while crouching (equasion: walkSpeed / crouchSpeedDecrease) public float moveForce; // This value controlls at what speed your character walks
public float sprintSpeedIncrease; // This value controlls how much faster are you while sprinting (equasion: walkSpeed * sprintSpeedIncrease) public float moveCounterForce; // This value controlls at what speed your character walks
public float ladderClimbingSpeed; // This value controlls how fast dose the character climb ladders public float crouchMoveForce; // This value controlls how much slower are you while crouching (equasion: walkSpeed / crouchSpeedDecrease)
public float jumpPower; // This value controlls character's jump height 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 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 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 lookVerticalSpeed; // This value controlls vertical looking speed
public float lookHorizontalSpeed; // This value controlls horizontal 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 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 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 PlayerInputReceiver _playerInputReceiver;
private CharacterStateMachine _characterStateMachine; private CharacterStateMachine _characterStateMachine;
private bool _walkIsPerforming, _crouchIsPerforming, _sprintIsPerforming; private bool _walkIsPerforming, _crouchIsHeld, _sprintIsPerforming;
private void Awake() private void Awake()
{ {
@ -29,36 +29,32 @@ namespace TTTSC.Player.Character.Controller
private void Walk(Vector2 direction, bool performing) private void Walk(Vector2 direction, bool performing)
{ {
_walkIsPerforming = performing; _walkIsPerforming = performing;
} }
private void Crouch(bool performing) private void Crouch(bool performing, float stageValue)
{ {
_crouchIsPerforming = performing; _crouchIsHeld = performing;
if (!_sprintIsPerforming)
_characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Crouching;
} }
private void Sprint(bool performing) private void Sprint(bool held, float stageValue)
{ {
_sprintIsPerforming = performing; _sprintIsPerforming = held;
} }
private void Update() private void Update()
{ {
if (_walkIsPerforming && !_crouchIsPerforming && !_sprintIsPerforming) if (_crouchIsHeld && !_sprintIsPerforming)
_characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Crouching;
if (_walkIsPerforming && !_crouchIsHeld && !_sprintIsPerforming)
_characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Walking; _characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Walking;
if (_sprintIsPerforming && !_crouchIsPerforming && _walkIsPerforming) if (_sprintIsPerforming && !_crouchIsHeld && _walkIsPerforming)
_characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Sprinting; _characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Sprinting;
if (!_walkIsPerforming && !_crouchIsPerforming && !_sprintIsPerforming) if (!_walkIsPerforming && !_crouchIsHeld && !_sprintIsPerforming)
{ {
_characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Idle; _characterStateMachine.movementStates = CharacterStateMachine.MovementStates.Idle;
} }

View file

@ -9,6 +9,23 @@ namespace TTTSC.Player.Character.Controller
[SerializeField] [SerializeField]
private CharacterReffrenceHub _reffrenceHub; 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 CharacterHover _characterHover;
private CharacterStateMachine _characterStateMachine; private CharacterStateMachine _characterStateMachine;
@ -17,6 +34,7 @@ namespace TTTSC.Player.Character.Controller
void Start() void Start()
{ {
_characterHover = GetComponent<CharacterHover>(); _characterHover = GetComponent<CharacterHover>();
_characterMovementConfig = GetComponent<CharacterMovementConfig>();
_characterStateMachine = GetComponent<CharacterStateMachine>(); _characterStateMachine = GetComponent<CharacterStateMachine>();
} }
@ -36,12 +54,19 @@ namespace TTTSC.Player.Character.Controller
private void CharacterCrouch() private void CharacterCrouch()
{ {
_characterHover.hoverHight = 1f; _characterHover.currentHoverHight = _characterMovementConfig.crouchHeight;
_characterEnviormentCollider.height = _desieredCrouchedColliderHight;
_characterEnviormentCollider.center = _desieredCrouchedColliderPosition;
} }
private void CharacterDefault() 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"", ""id"": ""edb5e334-0aab-4f72-8872-53382954c983"",
""expectedControlType"": ""Button"", ""expectedControlType"": ""Button"",
""processors"": """", ""processors"": """",
""interactions"": """", ""interactions"": ""Hold(duration=0.2)"",
""initialStateCheck"": false ""initialStateCheck"": false
}, },
{ {

View file

@ -8,8 +8,10 @@ namespace TTTSC.Player.Character.Controller
{ {
private float _lookX, _lookY; private float _lookX, _lookY;
bool _sprintIsHeld, _crouchIsHeld, _jumpIsHeld;
float _sprintStageValue, _crouchStageValue, _jumpStageValue;
public event Action<Vector2, bool> MoveInputEvent, LookInputEvent; 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; public PlayerInputSender playerInputEvents;
@ -37,6 +39,8 @@ namespace TTTSC.Player.Character.Controller
playerInputEvents.Controlls.Crouch.performed -= CrouchInputReceiver; playerInputEvents.Controlls.Crouch.performed -= CrouchInputReceiver;
} }
#region FloatBool function
bool FloatBool(float a, string calculationOperator, float b) bool FloatBool(float a, string calculationOperator, float b)
{ {
bool result = false; bool result = false;
@ -118,6 +122,28 @@ namespace TTTSC.Player.Character.Controller
} }
return result; 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) private void LookXInputReceiver(InputAction.CallbackContext ctx)
{ {
@ -132,6 +158,7 @@ namespace TTTSC.Player.Character.Controller
float value = ctx.ReadValue<float>(); float value = ctx.ReadValue<float>();
_lookY = value; _lookY = value;
Look(FloatBool(value, "!=", 0)); Look(FloatBool(value, "!=", 0));
} }
@ -155,19 +182,28 @@ namespace TTTSC.Player.Character.Controller
{ {
float value = ctx.ReadValue<float>(); float value = ctx.ReadValue<float>();
SprintInputEvent?.Invoke(FloatBool(value, "==", 1)); _sprintIsHeld = FloatBool(value, "==", 1);
} }
private void CrouchInputReceiver(InputAction.CallbackContext ctx) private void CrouchInputReceiver(InputAction.CallbackContext ctx)
{ {
float value = ctx.ReadValue<float>(); float value = ctx.ReadValue<float>();
CrouchInputEvent?.Invoke(FloatBool(value, "==", 1)); _crouchIsHeld = FloatBool(value, "==", 1);
} }
private void JumpInputReceiver(InputAction.CallbackContext ctx) 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 --- !u!78 &1
TagManager: TagManager:
serializedVersion: 2 serializedVersion: 2
tags: [] tags:
- Ladder
layers: layers:
- Default - Default
- TransparentFX - TransparentFX
- Ignore Raycast - Ignore Raycast
- - Player
- Water - Water
- UI - UI
- - Object
- - CharEnvironmentCollider
- - CharObjectCollider
- - Enviorment
- - Ladder
- - Stairs
- -
- -
- -