为什么我的控制器漂移与睡眠?



我一直在制作这个控制器,我在一个小行星上行走。我用的是四元数。睡一觉,当我在星球上的某个点时,控制器就会慢慢漂移,绕着Y轴旋转。我的想法是,它持有一个基于我的起始位置的值,所以当我移动到不同的点时,Slerp函数试图将我旋转到那个位置?我试着把脚本弄得乱七八糟,将不同的部分移动到他们自己的自定义方法中,以查明问题,但我在这一点上有点迷路。任何帮助将不胜感激!

我认为问题将是在底部的某个地方两个方法NewRotation,或RunWalkStand。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] private LayerMask _groundMask;
[SerializeField] private Transform _groundCheck;
[SerializeField] private Transform cam;

public float jumpCooldown = 1f;
public float groundCheckRadius = 0.3f;
private float speed = 8;
private float runSpeed = 2;
private float turnSpeed = 800f;
private float jumpForce = 500f;
private Rigidbody rb;
private Vector3 direction;
private GravityBody _gravityBody;
private Animator playerAnimator;
private GameObject planetRecall;
void Start()
{
_gravityBody = transform.GetComponent<GravityBody>();
playerAnimator = GetComponent<Animator>();
planetRecall = GameObject.FindGameObjectWithTag("Planet Recall");
}
void Update()
{
bool isCloseToGround = Physics.CheckSphere(_groundCheck.position, groundCheckRadius, _groundMask);
NewRotation();
if (Input.GetKeyDown(KeyCode.Space) && isCloseToGround)
{
Jump();
}
}

void FixedUpdate()
{
RunWalkStand();
}
private void OnCollisionEnter(Collision collision) 
{
if(collision.gameObject == planetRecall)
{
playerAnimator.SetBool("Grounded", true);
}
}
private void Jump()
{
rb.AddForce(-_gravityBody.GravityDirection * jumpForce, ForceMode.Impulse);
playerAnimator.SetTrigger("Fly_trig");
playerAnimator.SetBool("Grounded", false);
}
private void NewRotation()
{
rb = transform.GetComponent<Rigidbody>();
Vector3 mouseRotationY = new Vector3(0f, Input.GetAxisRaw("Mouse X"), 0f);
Quaternion rightDirection = Quaternion.Euler(0f,  mouseRotationY.y * (turnSpeed * Time.deltaTime), 0f).normalized;
Quaternion newRotation = Quaternion.Slerp(rb.rotation, rb.rotation * rightDirection, Time.deltaTime * 1000f);
rb.MoveRotation(newRotation);
//Move Side to Side
Vector3 sideToSide = transform.right * Input.GetAxisRaw("Horizontal");
rb.MovePosition(rb.position + sideToSide * (speed * Time.deltaTime));
}
private void RunWalkStand()
{
direction = new Vector3(0f, 0f, Input.GetAxisRaw("Vertical")).normalized;
Vector3 forwardDirection = transform.forward * direction.z;
bool isRunning = direction.magnitude > 0.1f;

//Walking
if (isRunning && !Input.GetKey(KeyCode.LeftShift))
{
rb.MovePosition(rb.position + forwardDirection * (speed * Time.deltaTime));
playerAnimator.SetFloat("Speed_f", 0.5f);
}
//Running
else if(isRunning && Input.GetKey(KeyCode.LeftShift))
{
rb.MovePosition(rb.position + forwardDirection * (speed * runSpeed * Time.deltaTime));
playerAnimator.SetFloat("Speed_f", 1f);
}
//Standing
else if(isRunning == false)
{
playerAnimator.SetFloat("Speed_f", 0f);
}
}
}

这可能是因为slerp不是直线线,所以当你接近端点时,它的速度较小,也许可以尝试Quaternion.RotateTowards.

I " most "解决了这个问题,这是一个意想不到的解决方案。漂移是通过在检查器中冻结玩家的旋转来解决的(我仍然不知道是什么原因导致玩家旋转),但是这会导致额外的抖动。我发现了两个问题。

  1. 如果我在层次结构中选择了任何游戏对象,然后玩游戏,游戏是紧张的,但如果我点击它,游戏运行得更顺畅(不是完全更好,但更顺畅)。
  2. 我正在为行星使用重力脚本,将重力应用于玩家的刚体,我相信同时作用于RB的多种事物会导致抖动。我想要大大简化项目,但把不同的方法从脚本到不同的更新方法有助于很好的一点取决于组合(不像fixeduupdate和相机在LateUpdate中的物理运动那么简单)。

最新更新