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:
parent
7ca474aba1
commit
d9f869fbd4
13 changed files with 414 additions and 114 deletions
|
|
@ -38,7 +38,7 @@
|
|||
"id": "edb5e334-0aab-4f72-8872-53382954c983",
|
||||
"expectedControlType": "Button",
|
||||
"processors": "",
|
||||
"interactions": "",
|
||||
"interactions": "Hold(duration=0.2)",
|
||||
"initialStateCheck": false
|
||||
},
|
||||
{
|
||||
|
|
|
|||
80
Assets/RotationAnalogTracker.cs
Normal file
80
Assets/RotationAnalogTracker.cs
Normal 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);
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
11
Assets/RotationAnalogTracker.cs.meta
Normal file
11
Assets/RotationAnalogTracker.cs.meta
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 8182877c8e1aff543b5bd05e5a5c7c8f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
Mesh _capsuleMesh;
|
||||
|
||||
RaycastHit _hoverRayHits;
|
||||
|
||||
bool _rayStatuses;
|
||||
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");
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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 normalizedMovement = movement.normalized * _characterMovementConfig.airControlStrength;
|
||||
Vector3 normalizedMovement = movement.normalized * _characterMovementConfig.airControlForce;
|
||||
|
||||
Vector3 counterForce = -movement.normalized * _inAirCounterForce;
|
||||
|
||||
|
||||
|
||||
|
||||
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()
|
||||
{
|
||||
|
||||
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;
|
||||
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()
|
||||
{
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
},
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
-
|
||||
-
|
||||
-
|
||||
|
|
|
|||
Loading…
Reference in a new issue