在地形上移动时,有时我的角色会根据表面的角度滑动。如何阻止这个。如果地形平坦,则移动是完美的,没有问题,但当表面是圆形时,玩家会滑动
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;
}
}
}
尽量不要在这些表面上滑动
还加了摩擦力10000000还是一样
没关系,第一次使用 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;
}
}