diff --git a/Assets/Prefabs/Player/DebugPlayerPrefab.prefab b/Assets/Prefabs/Player/DebugPlayerPrefab.prefab index 31c580f..8ff0def 100644 --- a/Assets/Prefabs/Player/DebugPlayerPrefab.prefab +++ b/Assets/Prefabs/Player/DebugPlayerPrefab.prefab @@ -216,7 +216,7 @@ GameObject: - component: {fileID: 1818923263116056088} m_Layer: 3 m_Name: PlayerModel - m_TagString: Untagged + m_TagString: Player m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 @@ -297,6 +297,23 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: addc2e37ff81c1b4989ec34b6150b4f7, type: 3} m_Name: m_EditorClassIdentifier: + maxVel: 25 + minVel: 2 + curVel: 0 + acc: 0.1 + jumpPow: 500 + jumpNum: 2 + traction: 3 + kickPow: 150 + recovTime: 3 + playerGrav: 35 + hasBlink: 0 + hasGlider: 0 + hasGrapple: 0 + hasWallrun: 0 + hasNitro: 0 + hasDash: 0 + playerPoints: 15 --- !u!114 &7097691538269713306 MonoBehaviour: m_ObjectHideFlags: 0 @@ -311,7 +328,6 @@ MonoBehaviour: m_EditorClassIdentifier: networkItemList: [] pStats: {fileID: 0} - invMan: {fileID: 0} --- !u!54 &7058615058147771192 Rigidbody: m_ObjectHideFlags: 0 @@ -422,6 +438,7 @@ MonoBehaviour: m_EditorClassIdentifier: pStats: {fileID: 0} vel: {x: 0, y: 0, z: 0} + curJumpNum: 0 isGrounded: 0 groundCheckDistance: 0.05 cam: {fileID: 4654986889578046791} @@ -469,6 +486,7 @@ MonoBehaviour: moveDirection: {x: 0, y: 0, z: 0} dashDistance: 10 dashStoppingSpeed: 0.1 + dashItem: {fileID: 0} --- !u!114 &1818923263116056088 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Scenes/Demos/MovementScene.unity b/Assets/Scenes/Demos/MovementScene.unity index d915af7..2a01702 100644 --- a/Assets/Scenes/Demos/MovementScene.unity +++ b/Assets/Scenes/Demos/MovementScene.unity @@ -929,6 +929,148 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1181153597 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1181153602} + - component: {fileID: 1181153601} + - component: {fileID: 1181153600} + - component: {fileID: 1181153599} + - component: {fileID: 1181153598} + - component: {fileID: 1181153604} + - component: {fileID: 1181153603} + m_Layer: 0 + m_Name: Bumper + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1181153598 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1181153597} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 204dc1e4ca638924caabaa45df29d9d1, type: 3} + m_Name: + m_EditorClassIdentifier: + bumpPower: 20 +--- !u!136 &1181153599 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1181153597} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.49 + m_Height: 0.1 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &1181153600 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1181153597} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1181153601 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1181153597} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1181153602 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1181153597} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.5, y: 1, z: 41.95} + m_LocalScale: {x: 5, y: 1, z: 5} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!136 &1181153603 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1181153597} + m_Material: {fileID: 0} + m_IsTrigger: 1 + m_Enabled: 1 + m_Radius: 0.58 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!54 &1181153604 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1181153597} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 0 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!1001 &1212970163 PrefabInstance: m_ObjectHideFlags: 0 @@ -940,6 +1082,10 @@ PrefabInstance: propertyPath: wallMaxDistance value: 0.8 objectReference: {fileID: 0} + - target: {fileID: 2782774462923692506, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} - target: {fileID: 3607330906377400225, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} propertyPath: m_TagString value: Player @@ -948,6 +1094,22 @@ PrefabInstance: propertyPath: m_Name value: DebugPlayerPrefab objectReference: {fileID: 0} + - target: {fileID: 5784126162129930074, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} + propertyPath: dashItem + value: + objectReference: {fileID: 11400000, guid: 4399d7276b3edf446ac51c5145539a5e, type: 2} + - target: {fileID: 6743056025486776975, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} + propertyPath: fallMultiplier + value: 1.5 + objectReference: {fileID: 0} + - target: {fileID: 6743056025486776975, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} + propertyPath: lowJumpMultiplier + value: 0.3 + objectReference: {fileID: 0} + - target: {fileID: 6743056025486776975, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} + propertyPath: groundCheckHitbox.m_Bits + value: 8 + objectReference: {fileID: 0} - target: {fileID: 6926740475113451123, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} propertyPath: m_RootOrder value: 4 @@ -958,7 +1120,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6926740475113451123, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} propertyPath: m_LocalPosition.y - value: 7.4 + value: 57.5 objectReference: {fileID: 0} - target: {fileID: 6926740475113451123, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} propertyPath: m_LocalPosition.z @@ -992,13 +1154,33 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 8100520363622627413, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} + propertyPath: acc + value: 0.01 + objectReference: {fileID: 0} + - target: {fileID: 8100520363622627413, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} + propertyPath: maxVel + value: 40 + objectReference: {fileID: 0} + - target: {fileID: 8100520363622627413, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} + propertyPath: minVel + value: 15 + objectReference: {fileID: 0} + - target: {fileID: 8100520363622627413, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} + propertyPath: jumpPow + value: 60 + objectReference: {fileID: 0} - target: {fileID: 8100520363622627413, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} propertyPath: kickPow value: 150 objectReference: {fileID: 0} - target: {fileID: 8100520363622627413, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} propertyPath: hasWallrun - value: 1 + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8100520363622627413, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} + propertyPath: playerGrav + value: 200 objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 362ca97b75c291a47ab81d628a81f440, type: 3} @@ -1192,6 +1374,101 @@ Transform: m_Father: {fileID: 1493944131} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1405946429 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1405946433} + - component: {fileID: 1405946432} + - component: {fileID: 1405946431} + - component: {fileID: 1405946430} + m_Layer: 0 + m_Name: Sphere + m_TagString: HookPoint + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!135 &1405946430 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1405946429} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1405946431 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1405946429} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1405946432 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1405946429} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1405946433 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1405946429} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.5, y: 14.2, z: 10.3} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1493944130 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/KingAbilities/Bumper.cs b/Assets/Scripts/KingAbilities/Bumper.cs index bdffca0..d6916ab 100644 --- a/Assets/Scripts/KingAbilities/Bumper.cs +++ b/Assets/Scripts/KingAbilities/Bumper.cs @@ -4,16 +4,17 @@ using UnityEngine; public class Bumper : MonoBehaviour { + public float bumpPower = 30; + // Is called whenever something collides with the bumper - void OnTriggerEnter(Collider other) { - Debug.Log("Bump!"); - if (other.tag == "Player") {//Checks if the other object is the player - Debug.Log("doing thing"); - float DirBumpX = other.GetComponent().vel.x * -1;//Inverts the Player Velocity x - float DirBumpZ = other.GetComponent().vel.z * -1;//Inverts the Player Velocity y - Vector3 DirBump = new Vector3(DirBumpX, .01f, DirBumpZ);//Creates a direction to launch the player + void OnTriggerEnter(Collider objectHit) { + if (objectHit.tag == "Player") {//Checks if the other object is the player + dPlayerMovement playerMovement = objectHit.GetComponent(); + float DirBumpX = playerMovement.vel.x * -1;//Inverts the Player Velocity x + float DirBumpZ = playerMovement.vel.z * -1;//Inverts the Player Velocity y + Vector3 DirBump = new Vector3(DirBumpX, .1f, DirBumpZ);//Creates a direction to launch the player DirBump = Vector3.Normalize(DirBump);//Normalizes the vector to be used as a bump direction - other.GetComponent().GetHit(DirBump, 50); //Launches tthe player directly away from the bumper + playerMovement.GetHit(DirBump, bumpPower); //Launches tthe player directly away from the bumper } } } diff --git a/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dDash.cs b/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dDash.cs index a645ffc..43f45f4 100644 --- a/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dDash.cs +++ b/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dDash.cs @@ -16,13 +16,19 @@ public class dDash : NetworkBehaviour{ float dashSpeed = 12; CharacterController characterController; + dPlayerMovement pMove; void Start(){ characterController = this.gameObject.GetComponent(); + pMove = GetComponent(); } //UPDATE CHECK FOR MOVEMENT ONLY WHEN DASHING void FixedUpdate(){ + if(pMove.pStats.HasDash) Dash(); + } + + void Dash(){ //if (!IsLocalPlayer) { return; } if(characterController.enabled == true){ if (Input.GetKeyDown(KeyCode.E) && isOnCoolDown == false) diff --git a/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dGrapplingHook.cs b/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dGrapplingHook.cs index daecd19..1591fd8 100644 --- a/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dGrapplingHook.cs +++ b/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dGrapplingHook.cs @@ -84,9 +84,9 @@ public class dGrapplingHook : NetworkBehaviour if (Vector3.Distance(gameObject.transform.position, hookPoint.transform.position) > ropeLength) { //Impact Based - playerMovement.AddImpact((hookPoint.transform.position - gameObject.transform.position), pStats.PlayerGrav); + //playerMovement.AddImpact((hookPoint.transform.position - gameObject.transform.position), pStats.PlayerGrav*2); //Character controller move? - //movementController.Move((hookPoint.transform.position - gameObject.transform.position).normalized * ropeLength*Time.deltaTime); + movementController.Move((hookPoint.transform.position - gameObject.transform.position).normalized * ropeLength * 10 *Time.deltaTime); //Lerp? or another smoother way? Better physics? Wait until refinement to deal with } } diff --git a/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dWallRun.cs b/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dWallRun.cs index 3c849cd..766cc58 100644 --- a/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dWallRun.cs +++ b/Assets/Scripts/PlayerScripts/DebugPlayer/DebugItems/dWallRun.cs @@ -112,13 +112,11 @@ public class dWallRun : NetworkBehaviour { elapsedTimeSinceWallDetatch = 0; elapsedTimeSinceWallAttach += Time.deltaTime; - playerMovementController.AddPlayerVelocity((Vector3.down * wallGravityDownForce * Time.deltaTime)); } else { elapsedTimeSinceWallAttach = 0; elapsedTimeSinceWallDetatch += Time.deltaTime; - playerMovementController.AddPlayerVelocity((Vector3.down * playerMovementController.pStats.PlayerGrav * Time.deltaTime)); } } diff --git a/Assets/Scripts/PlayerScripts/DebugPlayer/dPlayerMovement.cs b/Assets/Scripts/PlayerScripts/DebugPlayer/dPlayerMovement.cs index c1c9e04..4139f0c 100644 --- a/Assets/Scripts/PlayerScripts/DebugPlayer/dPlayerMovement.cs +++ b/Assets/Scripts/PlayerScripts/DebugPlayer/dPlayerMovement.cs @@ -18,6 +18,7 @@ public class dPlayerMovement : NetworkBehaviour private Vector3 moveZ; private Vector3 moveX; private Vector3 driftVel; + private Vector3 lerpY; //Player prefab private GameObject parentObj; @@ -26,12 +27,19 @@ public class dPlayerMovement : NetworkBehaviour private CharacterController moveController; //Jump value - public int curJumpNum; - private bool jumpPressed; + public int curJumpNum; // current Jumps used + private bool jumpHeld; // Is jump being held + float coyJumpTimer = 0.1f; // Default Coyote Jump time + float curCoyJumpTimer; // current Coyote Jump time + public float lowJumpMultiplier; // Short jump multiplier + public float fallMultiplier; // High Jump Multiplier + private float g = 0; // the y velocity + + //Glide Values bool tempSet = false; float tempTraction = 0.0f; - //Jump physics + //Impact physics private float mass = 5.0F; // defines the character mass private Vector3 impact = Vector3.zero; private float distToGround; @@ -49,7 +57,6 @@ public class dPlayerMovement : NetworkBehaviour private RaycastHit groundHit; //Camera Variables - private LayerMask ignoreP; private Vector3 camRotation; public Camera cam; @@ -87,21 +94,24 @@ public class dPlayerMovement : NetworkBehaviour void Awake() { - //Initialize Components - moveController = GetComponent(); - rB = GetComponent(); - capCol = GetComponent(); - pStats = GetComponent(); + //Initialize Player Components + moveController = GetComponent(); // Character Controller + rB = GetComponent(); //Rigid Body + capCol = GetComponent(); // Capsule Collider + capCol.enabled = false; parentObj = transform.parent.gameObject; animator = GetComponent(); - capCol.enabled = false; - //Wallrun - wallRun = gameObject.GetComponent(); + //Initialize Scripts + pStats = GetComponent(); // PlayerStats + wallRun = GetComponent(); //Wallrun + blink = GetComponent(); //Blink - blink = gameObject.GetComponent(); + //Get parents up direction + up = GetComponentInParent().up; - up = this.gameObject.GetComponentInParent().up; + //Coyote Timer Initialization + curCoyJumpTimer = coyJumpTimer; } void Start() @@ -126,58 +136,34 @@ public class dPlayerMovement : NetworkBehaviour // Otherwise we let the server handle moving us //if (!IsLocalPlayer) { return; } - //Controls for camera - if(cam.enabled){ - Rotation(); - } + if(cam.enabled) Rotation(); else Debug.Log("Cam Disabled"); - //Allow Movement when moveController is enabled if(moveController.enabled == true){ - //input controls for movement InputController(); - //if suffiecient impact magnitude is applied then move player + //if suffiecient impact magnitude is applied then move player if (impact.magnitude > 0.2F) moveController.Move(impact * Time.deltaTime); // consumes the impact energy each cycle: impact = Vector3.Lerp(impact, Vector3.zero, 5*Time.deltaTime); } - else{ - if (RagdollTimer() == 0){ - + //If Character controller is disabled use rigidbody calculations + else{ + //if ragdoll timer is over disable ragdolling + if (RagdollTimer() == 0){ firstHit = false; DisableRagdoll(); } //Gravity without moveController - vel.y -= pStats.PlayerGrav * Time.deltaTime; - rB.AddForce(new Vector3(0,vel.y,0)); - - //Debug.LogWarning("MoveController is either Disabled or wasn't retrieved correctly"); + g -= pStats.PlayerGrav * Time.deltaTime; + rB.AddForce(new Vector3(0,g,0)); } - - //TEMP FOR TESTING RAGDOLL - //Right Click to ragdoll the player - // if (Input.GetMouseButton(1) && heldDown == false){ - // getHit(new Vector3(vel.x, 0, vel.z), 30); - // heldDown = true; - // } - // if(!Input.GetMouseButton(1)){ - // heldDown = false; - // } - - if(pStats.HasBlink == true){ - blink.BlinkMove(); - } - - //TEMP FOR TESTING - //Checks if player should respawn - //Respawn(); } @@ -190,7 +176,6 @@ public class dPlayerMovement : NetworkBehaviour GroundCheck(); //Keyboard inputs - //Checks if movement keys have been pressed and calculates correct vector moveX = transform.right * Input.GetAxis("Horizontal") * Time.deltaTime * PlayerSpeed(); moveZ = transform.forward * Input.GetAxis("Vertical") * Time.deltaTime * PlayerSpeed(); @@ -198,15 +183,14 @@ public class dPlayerMovement : NetworkBehaviour //Adds vectors based on movement keys and other conditions to check what the //player vector should be under the circumstances vel = moveX + moveZ; + Vector3 moveXZ = new Vector3(vel.x, 0, vel.z); + driftVel = Vector3.Lerp(driftVel, moveXZ, pStats.Traction * Time.deltaTime); - //Gravity - Gravity(); - - driftVel = Vector3.Lerp(driftVel, vel, pStats.Traction * Time.deltaTime); - - //Moving outside basic wasd - //Jump Function + //Gravity and Jump calculations + UpdateGravity(); Jump(); + Vector3 moveY = new Vector3(0,g,0); + //Slide Function Slide(); @@ -225,7 +209,7 @@ public class dPlayerMovement : NetworkBehaviour } //Move Player - moveController.Move(driftVel); + moveController.Move(driftVel + (moveY * Time.deltaTime)); } @@ -264,9 +248,9 @@ public class dPlayerMovement : NetworkBehaviour //Apply Impact for when force needs to be applied without ragdolling public void AddImpact(Vector3 dir, float force) { - //if (!IsLocalPlayer) { return; } + //Normalize direction multiply by force and add it to the impact dir.Normalize(); if (dir.y < 0) dir.y = -dir.y; // reflect down force on the ground impact += dir.normalized * force / mass; @@ -278,82 +262,102 @@ public class dPlayerMovement : NetworkBehaviour private void Jump() { //If space/south gamepad button is pressed apply an upwards force to the player - if (Input.GetAxis("Jump") != 0 && !jumpPressed && curJumpNum + 1 < pStats.JumpNum && !isSliding) + if (Input.GetAxis("Jump") != 0 && !jumpHeld && curJumpNum < pStats.JumpNum && !isSliding) { if(wallRun.IsWallRunning()){ - AddImpact((wallRun.GetWallJumpDirection()), pStats.JumpPow * 1.3f); - AddImpact(transform.up, pStats.JumpPow); + AddImpact((wallRun.GetWallJumpDirection()), pStats.JumpPow * 20f); + g = pStats.JumpPow; } + else{ - AddImpact(transform.up, pStats.JumpPow); + g = pStats.JumpPow; } curJumpNum++; - jumpPressed = true; + jumpHeld = true; } + //Last time Jumped lastTimeJumped = Time.time; - //If grounded no jumps have been used - if(isGrounded){ - curJumpNum = 0; - } + //If grounded no jumps have been used and coyote Timer is refreshed + if(isGrounded && g == 0){ + curCoyJumpTimer = coyJumpTimer; + curJumpNum = 0; + } + //else start the coyote timer + else curCoyJumpTimer -= Time.deltaTime; + + //if jump is being held coyote timer is zero + if(jumpHeld) curCoyJumpTimer = 0; //If space/south face gamepad button isn't being pressed then jump is false - if (Input.GetAxis("Jump") == 0) jumpPressed = false; + if (Input.GetAxis("Jump") == 0){ + jumpHeld = false; + } } - - - //PlayerScript + //Get and update PlayerValues for other scripts + //Get jumpHeld public bool GetJumpPressed(){ - return jumpPressed; + return jumpHeld; } + //Get player cam public Camera GetPlayerCamera() { return cam; } + //Update Player Velocity public void AddPlayerVelocity(Vector3 additiveVelocity) { vel += additiveVelocity; } + //Set Player Velocity public void SetPlayerVelocity(Vector3 newVelocity) { vel = newVelocity; } + //Reduce player Jump + public void decrementCurrentJumpNumber() + { + curJumpNum--; + } - //Camera and Player Rotation + + //Camera and player rotation private void Rotation() { - //if input is received from Mouse X - if (Input.GetAxis("Mouse X") != 0) - { - transform.parent.Rotate(Vector3.up * sensitivity * Time.deltaTime * Input.GetAxis("Mouse X")); - } - //if input is received from right analog stick (horizontal) - else if (Input.GetAxis("HorizontalCam") != 0) - { - transform.parent.Rotate(Vector3.up * sensitivity * Time.deltaTime * Input.GetAxis("HorizontalCam")); - } + //If moveController is enabled allow Camera control + if(moveController.enabled){ + //if input is received from Mouse X + if (Input.GetAxis("Mouse X") != 0){ + transform.parent.Rotate(Vector3.up * sensitivity * Time.deltaTime * Input.GetAxis("Mouse X")); + } - //if input is if input is received from Mouse Y - if (Input.GetAxis("Mouse Y") != 0) - { - camRotation.x -= Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime; - camRotation.x = Mathf.Clamp(camRotation.x, minAngle, maxAngle); - cam.transform.localEulerAngles = camRotation; - } - //if input is received from right analog stick (vertical) - else if (Input.GetAxis("VerticalTurn") != 0) - { - camRotation.x -= Input.GetAxis("VerticalTurn") * sensitivity * Time.deltaTime; - camRotation.x = Mathf.Clamp(camRotation.x, minAngle, maxAngle); - cam.transform.localEulerAngles = camRotation; + //if input is received from right analog stick (horizontal) + else if(Input.GetAxis("HorizontalCam") != 0){ + transform.parent.Rotate(Vector3.up * sensitivity * Time.deltaTime * Input.GetAxis("HorizontalCam")); + } + + //if input is if input is received from Mouse Y + if (Input.GetAxis("Mouse Y") != 0) + { + camRotation.x -= Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime; + camRotation.x = Mathf.Clamp(camRotation.x, minAngle, maxAngle); + cam.transform.localEulerAngles = camRotation; + } + + //if input is received from right analog stick (vertical) + else if (Input.GetAxis("VerticalTurn") != 0){ + camRotation.x -= Input.GetAxis("VerticalTurn") * sensitivity * Time.deltaTime; + camRotation.x = Mathf.Clamp(camRotation.x, minAngle, maxAngle); + cam.transform.localEulerAngles = camRotation; + } } } @@ -363,7 +367,7 @@ public class dPlayerMovement : NetworkBehaviour //Respawns player if they fall below a certain point private void Respawn() { - if (transform.position.y < -1) + if (transform.position.y < -5) { transform.position = new Vector3(1f, 3f, 1f); } @@ -371,35 +375,71 @@ public class dPlayerMovement : NetworkBehaviour - //Gravity Function for adjusting y-vel due to wallrun/glide/etc - private void Gravity(){ + //Gravity Function for adjusting y-vel due to wallrun/glide/etc + private void UpdateGravity(){ //Gliding - if(jumpPressed && pStats.HasGlider){ - - vel.y -= (pStats.PlayerGrav-18) * Time.deltaTime; + if(pStats.HasGlider && g < 0 && jumpHeld){ + //Gravity with glider + GravityCalculation(10); + + //Set temp values to put traction back to normal if(tempSet == false){ tempTraction = pStats.Traction; pStats.Traction = 1.0f; tempSet = true; } } - else if(!jumpPressed && pStats.HasGlider){ + //Wallrunning + else if (pStats.HasWallrun) { + //Run wall run script + wallRun.WallRunRoutine(); + + //if wallrunning apply different gravity + if(wallRun.IsWallRunning()){ + GravityCalculation(4); + } + + //Normal gravity if not wallrunning + else{ + GravityCalculation(pStats.PlayerGrav); + } + } + + else{ + + //if temporary values have been set restore them back to the normal values if(tempSet == true){ pStats.Traction = tempTraction; tempSet = false; } - //Normal Gravity - vel.y -= pStats.PlayerGrav * Time.deltaTime; + //Normal gravity + GravityCalculation(pStats.PlayerGrav); + } + } + + //Uses Given gravity to apply a downwards force while allowing coyote Jump and short hops + private void GravityCalculation(float grav){ + //apply slight upwards force for jump smoothing when g < 0 + if(g < 0){ + g += grav * (fallMultiplier - 1) * Time.deltaTime; } - //Wallrunning - else if (pStats.HasWallrun) { wallRun.WallRunRoutine(); } //adjusted later if we are wallrunning + //apply smaller upwards force if jump is released early when jumping creating a short jump + else if (g > 0 && !Input.GetButton("Jump")){ + g += grav * (lowJumpMultiplier - 1) * Time.deltaTime; + } + //apply gravity if not grounded and coyote timer is less than 0 + if(isGrounded == false && curCoyJumpTimer <= 0){ + g -= grav * Time.deltaTime; + } + + //else don't apply gravity else{ - vel.y -= pStats.PlayerGrav * Time.deltaTime; + g = 0; } } @@ -409,10 +449,12 @@ public class dPlayerMovement : NetworkBehaviour { // Make sure that the ground check distance while already in air is very small, to prevent suddenly snapping to ground float chosenGroundCheckDistance = isGrounded ? (moveController.skinWidth + groundCheckDistance) : groundCheckDistanceInAir; + // reset values before the ground check isGrounded = false; groundRay = new Ray(moveController.transform.position, Vector3.down); - if (Physics.Raycast(groundRay, out groundHit, moveController.height + groundCheckDistance)) //&& Time.time >= lastTimeJumped + jumpGroundingPreventionTime) // only try to detect ground if it's been a short amount of time since last jump; otherwise we may snap to the ground instantly after we try jumping + + if (Physics.Raycast(groundRay, out groundHit, moveController.height + groundCheckDistance) && !jumpHeld ) //&& Time.time >= lastTimeJumped + jumpGroundingPreventionTime) // only try to detect ground if it's been a short amount of time since last jump; otherwise we may snap to the ground instantly after we try jumping { // Only consider this a valid ground hit if the ground normal goes in the same direction as the character up if (Vector3.Dot(groundHit.normal, transform.up) > 0f) @@ -484,6 +526,7 @@ public class dPlayerMovement : NetworkBehaviour pStats.Traction = 0.01f; } + transform.Rotate(Vector3.forward * -sensitivity * Time.deltaTime * Input.GetAxis("Mouse X")); pStats.Traction += .004f; } else{ @@ -491,20 +534,40 @@ public class dPlayerMovement : NetworkBehaviour } //NOTE: potentialy change this to only allow player back up if there is nothing above them if (qDown == false && isSliding == true) { - //if nothing is above the object, stop slidding + //if nothing is above the object, stop sliding if (Physics.Raycast(this.gameObject.transform.position, up, out ray, 5f) == false) { - this.gameObject.transform.eulerAngles = new Vector3(this.transform.eulerAngles.x + 90, this.transform.eulerAngles.y, this.transform.eulerAngles.z); + this.gameObject.transform.localEulerAngles = new Vector3(0, 0, 0); isSliding = false; moveController.height = 2.0f; pStats.Traction = originalTraction; - } else{ Debug.Log("Object above you"); - + } } } + public void CancelMomentum() + { + pStats.CurVel = 0; + vel = Vector3.zero; + moveX = Vector3.zero; + moveZ = Vector3.zero; + moveController.enabled = false; + } + + private IEnumerator RespawnTimer() + { + float duration = 2f; + float normalizedTime = 0; + while (normalizedTime <= 1f) + { + normalizedTime += Time.deltaTime / duration; + yield return null; + } + moveController.enabled = true; + } + } diff --git a/Assets/Scripts/PlayerScripts/PlayerItems/ItemScripts/GrapplingHook.cs b/Assets/Scripts/PlayerScripts/PlayerItems/ItemScripts/GrapplingHook.cs index f8302e8..7282046 100644 --- a/Assets/Scripts/PlayerScripts/PlayerItems/ItemScripts/GrapplingHook.cs +++ b/Assets/Scripts/PlayerScripts/PlayerItems/ItemScripts/GrapplingHook.cs @@ -32,7 +32,7 @@ public class GrapplingHook : NetworkBehaviour // Update is called once per frame void Update() { - //if (!IsLocalPlayer) { return; } + if (!IsLocalPlayer) { return; } if (Input.GetKeyDown(KeyCode.E) || Input.GetKeyDown(KeyCode.JoystickButton2)) //If grapple button is hit { diff --git a/Assets/Scripts/PlayerScripts/PlayerItems/ItemScripts/WallRun.cs b/Assets/Scripts/PlayerScripts/PlayerItems/ItemScripts/WallRun.cs index 0a1efe4..f248191 100644 --- a/Assets/Scripts/PlayerScripts/PlayerItems/ItemScripts/WallRun.cs +++ b/Assets/Scripts/PlayerScripts/PlayerItems/ItemScripts/WallRun.cs @@ -112,13 +112,11 @@ public class WallRun : NetworkBehaviour { elapsedTimeSinceWallDetatch = 0; elapsedTimeSinceWallAttach += Time.deltaTime; - playerMovementController.AddPlayerVelocity((Vector3.down * wallGravityDownForce * Time.deltaTime)); } else { elapsedTimeSinceWallAttach = 0; elapsedTimeSinceWallDetatch += Time.deltaTime; - playerMovementController.AddPlayerVelocity((Vector3.down * playerMovementController.pStats.PlayerGrav * Time.deltaTime)); } } diff --git a/Assets/Scripts/PlayerScripts/PlayerItems/Resources/ItemObjects/Springs.asset b/Assets/Scripts/PlayerScripts/PlayerItems/Resources/ItemObjects/Springs.asset index e5a2f2e..bce437b 100644 --- a/Assets/Scripts/PlayerScripts/PlayerItems/Resources/ItemObjects/Springs.asset +++ b/Assets/Scripts/PlayerScripts/PlayerItems/Resources/ItemObjects/Springs.asset @@ -19,7 +19,7 @@ MonoBehaviour: minVelM: 0 curVelM: 0 accM: 0 - jumpPowM: 100 + jumpPowM: 10 jumpNumM: 0 tractionM: 0 kickPowM: 0 diff --git a/Assets/Scripts/PlayerScripts/PlayerItems/Resources/ItemObjects/TripleJump.asset b/Assets/Scripts/PlayerScripts/PlayerItems/Resources/ItemObjects/TripleJump.asset index 8c90d61..8adde35 100644 --- a/Assets/Scripts/PlayerScripts/PlayerItems/Resources/ItemObjects/TripleJump.asset +++ b/Assets/Scripts/PlayerScripts/PlayerItems/Resources/ItemObjects/TripleJump.asset @@ -19,7 +19,7 @@ MonoBehaviour: minVelM: 0 curVelM: 0 accM: 0 - jumpPowM: -50 + jumpPowM: -5 jumpNumM: 1 tractionM: 0 kickPowM: 0 diff --git a/Assets/Scripts/PlayerScripts/PlayerMovement.cs b/Assets/Scripts/PlayerScripts/PlayerMovement.cs index 03189ee..74bb5ae 100644 --- a/Assets/Scripts/PlayerScripts/PlayerMovement.cs +++ b/Assets/Scripts/PlayerScripts/PlayerMovement.cs @@ -18,6 +18,7 @@ public class PlayerMovement : NetworkBehaviour private Vector3 moveZ; private Vector3 moveX; private Vector3 driftVel; + private Vector3 lerpY; //Player prefab private GameObject parentObj; @@ -26,16 +27,24 @@ public class PlayerMovement : NetworkBehaviour private CharacterController moveController; //Jump value - public int curJumpNum; - private bool jumpPressed; + public int curJumpNum; // current Jumps used + private bool jumpHeld; // Is jump being held + float coyJumpTimer = 0.2f; // Default Coyote Jump time + float curCoyJumpTimer; // current Coyote Jump time + public float lowJumpMultiplier; // Short jump multiplier + public float fallMultiplier; // High Jump Multiplier + private float g = 0; // the y velocity + + //Glide Values bool tempSet = false; float tempTraction = 0.0f; - //Jump physics + //Impact physics private float mass = 5.0F; // defines the character mass private Vector3 impact = Vector3.zero; private float distToGround; + //Wallrunning private WallRun wallRun; @@ -49,7 +58,6 @@ public class PlayerMovement : NetworkBehaviour private RaycastHit groundHit; //Camera Variables - private LayerMask ignoreP; private Vector3 camRotation; public Camera cam; @@ -78,25 +86,32 @@ public class PlayerMovement : NetworkBehaviour private Vector3 up; private bool qDown; - //Kick Variables + //Blink + private Blink blink; void Awake() { - //Initialize Components - moveController = GetComponent(); - rB = GetComponent(); - capCol = GetComponent(); - pStats = GetComponent(); - parentObj = transform.parent.gameObject; - - - + //Initialize Player Components + moveController = GetComponent(); // Character Controller + rB = GetComponent(); //Rigid Body + capCol = GetComponent(); // Capsule Collider capCol.enabled = false; - //Wallrun - wallRun = gameObject.GetComponent(); - up = this.gameObject.GetComponentInParent().up; + parentObj = transform.parent.gameObject; + + //Initialize Scripts + pStats = GetComponent(); // PlayerStats + wallRun = GetComponent(); //Wallrun + blink = GetComponent(); //Blink + + //Get parents up direction + up = GetComponentInParent().up; + + //Coyote Timer Initialization + curCoyJumpTimer = coyJumpTimer; } + + void Start() { distToGround = GetComponent().bounds.extents.y; @@ -111,6 +126,8 @@ public class PlayerMovement : NetworkBehaviour Cursor.lockState = CursorLockMode.Locked; } + + // Update is called once per frame void FixedUpdate() { @@ -118,46 +135,42 @@ public class PlayerMovement : NetworkBehaviour // Otherwise we let the server handle moving us if (!IsLocalPlayer) { return; } - //Controls for camera - if(cam.enabled){ - Rotation(); - } + if(cam.enabled) Rotation(); else Debug.Log("Cam Disabled"); - //Allow Movement when moveController is enabled if(moveController.enabled == true){ - //input controls for movement InputController(); - //if suffiecient impact magnitude is applied then move player + //if suffiecient impact magnitude is applied then move player if (impact.magnitude > 0.2F) moveController.Move(impact * Time.deltaTime); // consumes the impact energy each cycle: impact = Vector3.Lerp(impact, Vector3.zero, 5*Time.deltaTime); } - else{ - if (RagdollTimer() == 0){ - + //If Character controller is disabled use rigidbody calculations + else{ + //if ragdoll timer is over disable ragdolling + if (RagdollTimer() == 0){ firstHit = false; DisableRagdoll(); } //Gravity without moveController - vel.y -= pStats.PlayerGrav * Time.deltaTime; - rB.AddForce(new Vector3(0,vel.y,0)); - - //Debug.LogWarning("MoveController is either Disabled or wasn't retrieved correctly"); + g -= pStats.PlayerGrav * Time.deltaTime; + rB.AddForce(new Vector3(0,g,0)); } //TEMP FOR TESTING //Checks if player should respawn - Respawn(); + //Respawn(); } + + //Reads inputs and moves player private void InputController() { @@ -165,7 +178,6 @@ public class PlayerMovement : NetworkBehaviour GroundCheck(); //Keyboard inputs - //Checks if movement keys have been pressed and calculates correct vector moveX = transform.right * Input.GetAxis("Horizontal") * Time.deltaTime * PlayerSpeed(); moveZ = transform.forward * Input.GetAxis("Vertical") * Time.deltaTime * PlayerSpeed(); @@ -173,23 +185,23 @@ public class PlayerMovement : NetworkBehaviour //Adds vectors based on movement keys and other conditions to check what the //player vector should be under the circumstances vel = moveX + moveZ; + Vector3 moveXZ = new Vector3(vel.x, 0, vel.z); + driftVel = Vector3.Lerp(driftVel, moveXZ, pStats.Traction * Time.deltaTime); - //Gravity - Gravity(); - - //Adds persisting momentum to player - driftVel = Vector3.Lerp(driftVel, vel, pStats.Traction * Time.deltaTime); - - //Moving outside basic wasd - //Jump Function + //Gravity and Jump calculations + UpdateGravity(); Jump(); + Vector3 moveY = new Vector3(0,g,0); + //Slide Function Slide(); - + //Move Player - moveController.Move(driftVel); + moveController.Move(driftVel + (moveY * Time.deltaTime)); } + + //Calculates speed current player needs to be going public float PlayerSpeed() { @@ -199,18 +211,21 @@ public class PlayerMovement : NetworkBehaviour pStats.CurVel = 0.0f; return pStats.CurVel; } + //If current speed is below min when pressed set to minimum speed else if (pStats.CurVel < pStats.MinVel) { pStats.CurVel = pStats.MinVel; return pStats.MinVel; } + // while the speed is below max speed slowly increase it else if ((pStats.CurVel >= pStats.MinVel) && (pStats.CurVel < pStats.MaxVel)) { pStats.CurVel += pStats.Acc; return pStats.CurVel; } + //If the players speed is above or equal to max speed set speed to max else { @@ -226,6 +241,7 @@ public class PlayerMovement : NetworkBehaviour { if (!IsLocalPlayer) { return; } + //Normalize direction multiply by force and add it to the impact dir.Normalize(); if (dir.y < 0) dir.y = -dir.y; // reflect down force on the ground impact += dir.normalized * force / mass; @@ -236,73 +252,86 @@ public class PlayerMovement : NetworkBehaviour //Jump Function private void Jump() { - //If space is pressed apply an upwards force to the player - if ((Input.GetAxis("Jump") != 0) && !jumpPressed && curJumpNum + 1 < pStats.JumpNum && !isSliding) + //If space/south gamepad button is pressed apply an upwards force to the player + if (Input.GetAxis("Jump") != 0 && !jumpHeld && curJumpNum < pStats.JumpNum && !isSliding) { if(wallRun.IsWallRunning()){ - AddImpact((wallRun.GetWallJumpDirection()), pStats.JumpPow * 1.3f); - AddImpact(transform.up, pStats.JumpPow); + AddImpact((wallRun.GetWallJumpDirection()), pStats.JumpPow * 20f); + g = pStats.JumpPow; } + else{ - AddImpact(transform.up, pStats.JumpPow); + g = pStats.JumpPow; } + curJumpNum++; - jumpPressed = true; + jumpHeld = true; } + //Last time Jumped lastTimeJumped = Time.time; - //If grounded no jumps have been used + //If grounded no jumps have been used and coyote Timer is refreshed if(isGrounded){ - curJumpNum = 0; - } + curCoyJumpTimer = coyJumpTimer; + curJumpNum = 0; + } + //else start the coyote timer + else curCoyJumpTimer -= Time.deltaTime; - //If space isn't being pressed then jump is false - if (Input.GetAxis("Jump") == 0) jumpPressed = false; + //if jump is being held coyote timer is zero + if(jumpHeld) curCoyJumpTimer = 0; + + //If space/south face gamepad button isn't being pressed then jump is false + if (Input.GetAxis("Jump") == 0){ + jumpHeld = false; + } } - //PlayerScript + //Get and update PlayerValues for other scripts + //Get jumpHeld public bool GetJumpPressed(){ - return jumpPressed; + return jumpHeld; } + //Get player cam public Camera GetPlayerCamera() { return cam; } + //Update Player Velocity public void AddPlayerVelocity(Vector3 additiveVelocity) { vel += additiveVelocity; } + //Set Player Velocity public void SetPlayerVelocity(Vector3 newVelocity) { vel = newVelocity; } - - - //Camera and Player Rotation + //Reduce player Jump public void decrementCurrentJumpNumber() { curJumpNum--; } - //Camera + + + //Camera and player rotation private void Rotation() { - Vector3 lastCamPos = new Vector3(0,0,0); - Vector3 rotOffset = transform.localEulerAngles; + //If moveController is enabled allow Camera control if(moveController.enabled){ - - //if input is received from Mouse X if (Input.GetAxis("Mouse X") != 0){ transform.parent.Rotate(Vector3.up * sensitivity * Time.deltaTime * Input.GetAxis("Mouse X")); } + //if input is received from right analog stick (horizontal) else if(Input.GetAxis("HorizontalCam") != 0){ transform.parent.Rotate(Vector3.up * sensitivity * Time.deltaTime * Input.GetAxis("HorizontalCam")); @@ -315,6 +344,7 @@ public class PlayerMovement : NetworkBehaviour camRotation.x = Mathf.Clamp(camRotation.x, minAngle, maxAngle); cam.transform.localEulerAngles = camRotation; } + //if input is received from right analog stick (vertical) else if (Input.GetAxis("VerticalTurn") != 0){ camRotation.x -= Input.GetAxis("VerticalTurn") * sensitivity * Time.deltaTime; @@ -330,7 +360,7 @@ public class PlayerMovement : NetworkBehaviour //Respawns player if they fall below a certain point private void Respawn() { - if (transform.position.y < -1) + if (transform.position.y < -5) { transform.position = new Vector3(1f, 3f, 1f); } @@ -338,35 +368,71 @@ public class PlayerMovement : NetworkBehaviour - //Gravity Function for adjusting y-vel due to wallrun/glide/etc - private void Gravity(){ + //Gravity Function for adjusting y-vel due to wallrun/glide/etc + private void UpdateGravity(){ //Gliding - if(jumpPressed && pStats.HasGlider){ - - vel.y -= (pStats.PlayerGrav-18) * Time.deltaTime; + if(pStats.HasGlider && g < 0 && jumpHeld){ + //Gravity with glider + GravityCalculation(10); + + //Set temp values to put traction back to normal if(tempSet == false){ tempTraction = pStats.Traction; pStats.Traction = 1.0f; tempSet = true; } } - else if(!jumpPressed && pStats.HasGlider){ + //Wallrunning + else if (pStats.HasWallrun) { + //Run wall run script + wallRun.WallRunRoutine(); + + //if wallrunning apply different gravity + if(wallRun.IsWallRunning()){ + GravityCalculation(4); + } + + //Normal gravity if not wallrunning + else{ + GravityCalculation(pStats.PlayerGrav); + } + } + + else{ + + //if temporary values have been set restore them back to the normal values if(tempSet == true){ pStats.Traction = tempTraction; tempSet = false; } - //Normal Gravity - vel.y -= pStats.PlayerGrav * Time.deltaTime; + //Normal gravity + GravityCalculation(pStats.PlayerGrav); + } + } + + //Uses Given gravity to apply a downwards force while allowing coyote Jump and short hops + private void GravityCalculation(float grav){ + //apply slight upwards force for jump smoothing when g < 0 + if(g < 0){ + g += grav * (fallMultiplier - 1) * Time.deltaTime; } - //Wallrunning - else if (pStats.HasWallrun) { wallRun.WallRunRoutine(); } //adjusted later if we are wallrunning + //apply smaller upwards force if jump is released early when jumping creating a short jump + else if (g > 0 && !Input.GetButton("Jump")){ + g += grav * (lowJumpMultiplier - 1) * Time.deltaTime; + } + //apply gravity if not grounded and coyote timer is less than 0 + if(isGrounded == false && curCoyJumpTimer <= 0){ + g -= grav * Time.deltaTime; + } + + //else don't apply gravity else{ - vel.y -= pStats.PlayerGrav * Time.deltaTime; + g = 0; } } @@ -376,10 +442,12 @@ public class PlayerMovement : NetworkBehaviour { // Make sure that the ground check distance while already in air is very small, to prevent suddenly snapping to ground float chosenGroundCheckDistance = isGrounded ? (moveController.skinWidth + groundCheckDistance) : groundCheckDistanceInAir; + // reset values before the ground check isGrounded = false; groundRay = new Ray(moveController.transform.position, Vector3.down); - if (Physics.Raycast(groundRay, out groundHit, moveController.height + groundCheckDistance)) //&& Time.time >= lastTimeJumped + jumpGroundingPreventionTime) // only try to detect ground if it's been a short amount of time since last jump; otherwise we may snap to the ground instantly after we try jumping + + if (Physics.Raycast(groundRay, out groundHit, moveController.height + groundCheckDistance) && !jumpHeld ) //&& Time.time >= lastTimeJumped + jumpGroundingPreventionTime) // only try to detect ground if it's been a short amount of time since last jump; otherwise we may snap to the ground instantly after we try jumping { // Only consider this a valid ground hit if the ground normal goes in the same direction as the character up if (Vector3.Dot(groundHit.normal, transform.up) > 0f) @@ -440,7 +508,8 @@ public class PlayerMovement : NetworkBehaviour //Slide Function private void Slide(){ - if (Input.GetKey(KeyCode.JoystickButton1) || Input.GetKey(KeyCode.Q)){ + //if the q button or the east face button on gamepad is held down + if (Input.GetKey(KeyCode.JoystickButton1) || Input.GetKey(KeyCode.Q)) { qDown = true; if (isSliding == false){ originalTraction = pStats.Traction; @@ -450,6 +519,7 @@ public class PlayerMovement : NetworkBehaviour pStats.Traction = 0.01f; } + transform.Rotate(Vector3.forward * -sensitivity * Time.deltaTime * Input.GetAxis("Mouse X")); pStats.Traction += .004f; } else{ @@ -457,18 +527,17 @@ public class PlayerMovement : NetworkBehaviour } //NOTE: potentialy change this to only allow player back up if there is nothing above them if (qDown == false && isSliding == true) { - //if nothing is above the object, stop slidding + //if nothing is above the object, stop sliding if (Physics.Raycast(this.gameObject.transform.position, up, out ray, 5f) == false) { - this.gameObject.transform.eulerAngles = new Vector3(this.transform.eulerAngles.x + 90, this.transform.eulerAngles.y, this.transform.eulerAngles.z); + this.gameObject.transform.localEulerAngles = new Vector3(0, 0, 0); isSliding = false; moveController.height = 2.0f; pStats.Traction = originalTraction; - } else{ Debug.Log("Object above you"); - + } } } diff --git a/Assets/Scripts/PlayerScripts/PlayerStats.cs b/Assets/Scripts/PlayerScripts/PlayerStats.cs index fdcd55a..8d81d79 100644 --- a/Assets/Scripts/PlayerScripts/PlayerStats.cs +++ b/Assets/Scripts/PlayerScripts/PlayerStats.cs @@ -6,14 +6,14 @@ using UnityEngine.Assertions; public class PlayerStats : MonoBehaviour { //Maximum possible player speed - [SerializeField] private float maxVel = 25.0f; + [SerializeField] private float maxVel = 30.0f; public float MaxVel{ get{ return maxVel; } set{ maxVel = value; } } //Minimum possible player speed - [SerializeField] private float minVel = 2.0f; + [SerializeField] private float minVel = 5.0f; public float MinVel{ get{ return minVel; } set{ minVel = value; } @@ -34,7 +34,7 @@ public class PlayerStats : MonoBehaviour } //Player Jump power - [SerializeField] private float jumpPow = 300.0f; + [SerializeField] private float jumpPow = 63.0f; public float JumpPow{ get{ return jumpPow; } set{ jumpPow = value; } @@ -69,7 +69,7 @@ public class PlayerStats : MonoBehaviour } //Gravity Affecting the player - [SerializeField] private float playerGrav = 20.0f; + [SerializeField] private float playerGrav = 200.0f; public float PlayerGrav{ get{ return playerGrav; } set{ playerGrav = value; } diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index d286f08..33b4baa 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -12,6 +12,7 @@ TagManager: - Weather - destroyable - RunnerHUD + - GroundCheck layers: - Default - TransparentFX