Search Unity

Other Movement Problems

Discussion in 'Scripting' started by Potato3008, Nov 5, 2022.

  1. Potato3008

    Potato3008

    Joined:
    Nov 24, 2021
    Posts:
    5
    When ever I press W my player doesn't move straight, Instead it will moves left, right, or backwards. Also when ever I replay the project, the direction the player moves will be randomized. Same including the A S D.

    (My code)

    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using static scr_Models;
    5.  
    6. public class Scr_CharacterController : MonoBehaviour
    7. {
    8.     private CharacterController characterController;
    9.     private DefaultInput defaultInput;
    10.     private Vector2 input_Movement;
    11.     private Vector2 input_View;
    12.  
    13.     private Vector3 newCameraRotation;
    14.     private Vector3 newCharacterRotation;
    15.  
    16.     [Header("References")]
    17.     public Transform cameraHolder;
    18.     public Transform feetTransform;
    19.  
    20.     [Header("Settings")]
    21.     public PlayerSettingsModel playerSettings;
    22.     public float viewClampYMin = -70;
    23.     public float viewClampYMax = 80;
    24.     public LayerMask playerMask;
    25.  
    26.  
    27.     [Header("Gravity")]
    28.     public float gravityAmount;
    29.     public float gravityMin;
    30.     private float playerGravity;
    31.  
    32.     public Vector3 jumpingForce;
    33.     private Vector3 jumpingForceVelocity;
    34.  
    35.     [Header("Stance")]
    36.     public PlayerStance playerStance;
    37.     public float playerStanceSmoothing;
    38.     public CharacterStance playerStandStance;
    39.     public CharacterStance playerCrouchStance;
    40.     public CharacterStance playerProneStance;
    41.     private float stanceCheckErrorMargin = 0.05f;
    42.     private float cameraHeight;
    43.     private float cameraHeightVelocity;
    44.  
    45.     private Vector3 stanceCapsuleCenterVelocity;
    46.     private float stanceCapsuleHeightVelocity;
    47.  
    48.     private bool isSprinting;
    49.  
    50.     private void Awake()
    51.     {
    52.         defaultInput = new DefaultInput();
    53.  
    54.         defaultInput.Character.Movement.performed += e => input_Movement = e.ReadValue<Vector2>();
    55.         defaultInput.Character.View.performed += e => input_View = e.ReadValue<Vector2>();
    56.         defaultInput.Character.Jump.performed += e => Jump();
    57.         defaultInput.Character.Crouch.performed += e => Crouch();
    58.         defaultInput.Character.Prone.performed += e => Prone();
    59.         defaultInput.Character.Sprint.performed += e => ToggleSprint();
    60.         defaultInput.Character.SprintReleased.performed += e => StopSprint();
    61.  
    62.         defaultInput.Enable();
    63.  
    64.         newCameraRotation = cameraHolder.localRotation.eulerAngles;
    65.         newCharacterRotation = transform.localRotation.eulerAngles;
    66.  
    67.         characterController =  GetComponent<CharacterController>();
    68.  
    69.         cameraHeight = cameraHolder.localPosition.y;
    70.     }
    71.  
    72.  
    73.     private void Update()
    74.     {
    75.         CalculateView();
    76.         CalculateMovement();
    77.         CalculateJump();
    78.         CalculateStance();
    79.     }
    80.  
    81.  
    82.     private void CalculateView()
    83.     {
    84.         newCharacterRotation.y += playerSettings.ViewXSensitivity * (playerSettings.ViewXInverted ? -input_View.x : input_View.x) * Time.deltaTime;
    85.         transform.localRotation = Quaternion.Euler(newCharacterRotation);
    86.  
    87.         newCameraRotation.x += playerSettings.ViewYSensitivity * (playerSettings.ViewYInverted ? input_View.y : -input_View.y) * Time.deltaTime;
    88.         newCameraRotation.x = Mathf.Clamp(newCameraRotation.x, viewClampYMin, viewClampYMax);
    89.  
    90.         cameraHolder.localRotation = Quaternion.Euler(newCameraRotation);
    91.     }
    92.  
    93.  
    94.     private void CalculateMovement()
    95.     {
    96.         if (input_Movement.y <= 0.2f )
    97.         {
    98.             isSprinting = false;
    99.         }
    100.  
    101.         var verticalSpeed = playerSettings.WalkingForwardSpeed;
    102.         var horizontalSpeed = playerSettings.WalkingStrafeSpeed;
    103.  
    104.         if (isSprinting)
    105.         {
    106.             verticalSpeed = playerSettings.RunningForwardSpeed;
    107.             horizontalSpeed = playerSettings.RunningStrafeSpeed;
    108.         }
    109.  
    110.  
    111.         var newMovementSpeed = new Vector3(horizontalSpeed * input_Movement.x * Time.deltaTime, 0, verticalSpeed * input_Movement.y * Time.deltaTime);
    112.         newMovementSpeed = transform.TransformDirection(newMovementSpeed);
    113.  
    114.  
    115.         if (playerGravity > gravityMin)
    116.         {
    117.             playerGravity -= gravityAmount * Time.deltaTime;
    118.         }
    119.  
    120.         if (playerGravity < -0.1f && characterController.isGrounded)
    121.         {
    122.             playerGravity = -0.1f;
    123.         }
    124.  
    125.      
    126.         newMovementSpeed.y += playerGravity;
    127.         newMovementSpeed += jumpingForce * Time.deltaTime ;
    128.  
    129.         characterController.Move(newMovementSpeed);
    130.     }
    131.  
    132.     private void CalculateJump()
    133.     {
    134.         jumpingForce = Vector3.SmoothDamp(jumpingForce, Vector3.zero, ref jumpingForceVelocity, playerSettings.JumpingFalloff);
    135.     }
    136.  
    137.     private void CalculateStance()
    138.     {
    139.         var currentStance = playerStandStance;
    140.  
    141.         if (playerStance == PlayerStance.Crouch)
    142.         {
    143.             currentStance = playerCrouchStance;
    144.         }
    145.         else if (playerStance == PlayerStance.Prone)
    146.         {
    147.             currentStance = playerProneStance;
    148.         }
    149.  
    150.         cameraHeight = Mathf.SmoothDamp(cameraHolder.localPosition.y, currentStance.CameraHeight, ref cameraHeightVelocity, playerStanceSmoothing);
    151.         cameraHolder.localPosition = new Vector3(cameraHolder.localPosition.x, cameraHeight, cameraHolder.localPosition.z);
    152.  
    153.         characterController.height = Mathf.SmoothDamp(characterController.height, currentStance.StanceCollider.height, ref stanceCapsuleHeightVelocity, playerStanceSmoothing);
    154.         characterController.center = Vector3.SmoothDamp(characterController.center, currentStance.StanceCollider.center, ref stanceCapsuleCenterVelocity, playerStanceSmoothing);
    155.  
    156.     }
    157.  
    158.     private void Jump()
    159.     {
    160.         if (!characterController.isGrounded || playerStance == PlayerStance.Prone)
    161.         {
    162.             return;
    163.         }
    164.  
    165.         if (playerStance == PlayerStance.Crouch)
    166.         {
    167.             playerStance = PlayerStance.Stand;
    168.             return;
    169.         }
    170.  
    171.         // Jump
    172.         jumpingForce = Vector3.up * playerSettings.JumpingHeight;
    173.         playerGravity = 0;
    174.     }
    175.     private void Crouch()
    176.     {
    177.         if (playerStance == PlayerStance.Crouch)
    178.         {
    179.             if (StanceCheck(playerStandStance.StanceCollider.height))
    180.             {
    181.                 return;
    182.             }
    183.  
    184.  
    185.             playerStance = PlayerStance.Stand;
    186.             return;
    187.         }
    188.  
    189.             if (StanceCheck(playerCrouchStance.StanceCollider.height))
    190.             {
    191.                 return;
    192.             }
    193.  
    194.         playerStance = PlayerStance.Crouch;
    195.     }
    196.  
    197.  
    198.     private void Prone()
    199.     {
    200.         playerStance = PlayerStance.Prone;
    201.     }
    202.  
    203.     private bool StanceCheck(float stanceCheckheight)
    204.     {
    205.         var start = new Vector3(feetTransform.position.x, feetTransform.position.y + characterController.radius + stanceCheckErrorMargin, feetTransform.position.z);
    206.         var end = new Vector3(feetTransform.position.x, feetTransform.position.y - characterController.radius - stanceCheckErrorMargin + stanceCheckheight, feetTransform.position.z);
    207.         return Physics.CheckCapsule(start, end, characterController.radius, playerMask);
    208.     }
    209.  
    210.     private void ToggleSprint()
    211.     {
    212.         if (input_Movement.y <= 0.2f )
    213.         {
    214.             isSprinting = false;
    215.             return;
    216.         }
    217.  
    218.         isSprinting = !isSprinting;
    219.     }
    220.  
    221.     private void StopSprint()
    222.     {
    223.         isSprinting = false;
    224.     }
    225.  
    226. }
     
    Last edited: Nov 5, 2022
  2. MelvMay

    MelvMay

    Unity Technologies

    Joined:
    May 24, 2013
    Posts:
    11,459
    Your post is not related to the Editor so you're posting in the wrong forum. For scripting questions, you need to use the Scripting forum. Also, please use code-tags and not plain-text when posting code. You can edit your post above to use this.

    I'll move your post.