Home > Software design >  Why is my character falling/leaning over on mouse click in unity?
Why is my character falling/leaning over on mouse click in unity?

Time:08-27

My character using CharacterController seems to be falling over! Is it the rotation that's the issue? I've been hitting my head against the wall for a few days trying to get this solved. any thoughts?

an small vid of what's happening: https://imgur.com/a/AyPvLtm

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(CharacterController))]

public class Player : MonoBehaviour
{
    [SerializeField] private float playerSpeed = 10f;
    [SerializeField] private float rotationSpeed = 8f;
    public float SpeedChangeRate = 10.0f;

    private Camera mainCamera;
    private Vector3 targetPosition;
    private CharacterController characterController;
    private Coroutine coroutine;
    private int groundLayer;

    private void Awake() {
        mainCamera = Camera.main;
        characterController = GetComponent<CharacterController>();
        groundLayer = LayerMask.NameToLayer("Ground");
    }
    void Update()
    {
        if (Mouse.current.leftButton.isPressed) Move();
    }
    private void Move() {
        Ray ray = mainCamera.ScreenPointToRay(Mouse.current.position.ReadValue());
        Physics.Raycast(ray: ray, hitInfo: out RaycastHit hit);
        if (hit.collider && hit.collider.gameObject.layer.CompareTo(groundLayer) == 0) {
            if (coroutine != null) StopCoroutine(coroutine);
            coroutine = StartCoroutine(PlayerMoveTowards(hit.point));
            targetPosition = hit.point;
        }
    }
    private IEnumerator PlayerMoveTowards(Vector3 target) {
        while (Vector3.Distance(transform.position, target) > 0.1f) {
            Vector3 destination = Vector3.MoveTowards(transform.position, target, playerSpeed * Time.deltaTime);

            Vector3 direction = target - transform.position;
            Vector3 movement = direction.normalized * playerSpeed * Time.deltaTime;
            characterController.Move(movement); 
            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direction.normalized), rotationSpeed * Time.deltaTime);

            yield return null;
        }
    }
}

CodePudding user response:

The reason is that at close distances, the difference between the main player's Target and Pivot point becomes very small and the height will be effective in determining the direction. Just set the direction Y to 0 to solve the problem.

Vector3 direction = target - transform.position;

direction.y = 0;

CodePudding user response:

Figured this out.

It was my capsule collider. I had it set to the X-Axis, causing the collider to be rotated 90 degrees.

So my character would move and then flip to the side. Updating the collider direct to be on the Y-Axis fixed the problem.

  • Related