如何阻止角色在地形上滑动(斜坡)

问题描述 投票:0回答:1

在地形上移动时,有时我的角色会根据表面的角度滑动。如何阻止这个。如果地形平坦,则移动是完美的,没有问题,但当表面是圆形时,玩家会滑动

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class Movement : MonoBehaviour
{
    public float maximumSpeed;
    public float rotationSpeed;

    private Animator animator;
    private CharacterController characterController;
    private bool isRunning = false;
    void Start()
    {
        animator = GetComponent<Animator>();
        characterController = GetComponent<CharacterController>();
    }

    void Update()
    {
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        Vector3 movementDirection = new Vector3(horizontalInput, 0f, verticalInput);
        float inputMagnitude = Mathf.Clamp01(movementDirection.magnitude);
        if (Input.GetButtonDown("Run"))
        {
            isRunning = !isRunning;
        }

        if (!isRunning)
        {
            inputMagnitude /= 1.5f;
        }
        animator.SetFloat("InputMagnitude", inputMagnitude, 0.05f, Time.deltaTime);
        float speed = inputMagnitude * maximumSpeed;
        movementDirection.Normalize();

        characterController.SimpleMove(movementDirection * maximumSpeed);

        if (movementDirection != Vector3.zero)
        {
            animator.SetBool("IsMoving", true);
            Quaternion toRotation = Quaternion.LookRotation(movementDirection, Vector3.up);
            transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime);
        }
        else
        {
            animator.SetBool("IsMoving", false);
        }
    }

    private void OnApplicationFocus(bool focus)
    {
        if (focus)
        {
            Cursor.lockState = CursorLockMode.Locked;
        }
        else
        {
            Cursor.lockState = CursorLockMode.None;
        }
    }
}

player settings

根据示例滑动到此处 terrain

地形](https://i.stack.imgur.com/KSD6k.jpg)

尽量不要在这些表面上滑动

还加了摩擦力10000000还是一样

friction

friction

unity-game-engine character sliding
1个回答
0
投票

没关系,第一次使用 Unity 的角色控制器,所以在这样的代码中增加了摩擦。移动速度虽然减慢了但是还好

using UnityEngine;

public class Movement : MonoBehaviour
{
    public float maximumSpeed;
    public float rotationSpeed;
    public float frictionFactor = 0.9f;

    private Animator animator;
    private CharacterController characterController;
    private bool isRunning = false;
    private Vector3 currentVelocity;

    void Start()
    {
        animator = GetComponent<Animator>();
        characterController = GetComponent<CharacterController>();
    }

    void Update()
    {
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        Vector3 movementDirection = new Vector3(horizontalInput, 0f, verticalInput);
        float inputMagnitude = Mathf.Clamp01(movementDirection.magnitude);

        if (Input.GetButtonDown("Run"))
        {
            isRunning = !isRunning;
        }

        if (!isRunning)
        {
            inputMagnitude /= 1.5f;
        }

        animator.SetFloat("InputMagnitude", inputMagnitude, 0.05f, Time.deltaTime);

        if (movementDirection != Vector3.zero)
        {

            currentVelocity = movementDirection * maximumSpeed;
            characterController.SimpleMove(currentVelocity);


            Quaternion toRotation = Quaternion.LookRotation(movementDirection, Vector3.up);
            transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime);


            animator.SetBool("IsMoving", true);
        }
        else
        {

            currentVelocity *= frictionFactor;
            characterController.SimpleMove(currentVelocity);


            animator.SetBool("IsMoving", false);
        }
    }

    private void OnApplicationFocus(bool focus)
    {
        Cursor.lockState = focus ? CursorLockMode.Locked : CursorLockMode.None;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.