就在我按下 'w' 将角色向前移动时,它会传送到地面上。我没有使用角色控制器。我猜这与被禁赛的球员有关。我对这一切都很陌生,任何帮助将不胜感激。谢谢
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private CharacterController controller;
private Vector3 playerVelocity;
private bool groundedPlayer;
private float playerSpeed = 4.0f;
private float jumpHeight = 1.0f;
private float gravityValue = -9.81f;
// Start is called before the first frame update
private void Start()
{
controller = gameObject.AddComponent<CharacterController>();
}
// Update is called once per frame
void FixedUpdate()
{
groundedPlayer = controller.isGrounded;
if (groundedPlayer && playerVelocity.y < 0 )
{
playerVelocity.y = 0f;
}
Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
controller.Move(move * Time.deltaTime * playerSpeed);
if (move != Vector3.zero)
{
gameObject.transform.forward = move;
}
//Changes the height position of the player..
if (Input.GetButtonDown("Jump") && groundedPlayer)
{
playerVelocity.y += Mathf.Sqrt(jumpHeight * -3.0f * gravityValue);
}
playerVelocity.y += gravityValue * Time.deltaTime;
controller.Move(playerVelocity * Time.deltaTime);
}
}
答案 0 :(得分:0)
您的代码中有几个潜在的错误。但是,很难根据给定的信息确定问题的根源。你能提供场景截图和你角色的检查员吗?
首先,你写了
<块引用>我没有使用角色控制器。
尽管清楚地使用了 CharacterController。我猜这是一个错字。 请确保 CharacterController 的碰撞器和地面碰撞器的配置正确。这是问题的最可能来源。
关于您的脚本:您正在应用 gravityValue
,即使您已经接地并且您将 Time.deltaTime
乘以两次。
编辑:再看一遍,我看到您在运行时使用 AddComponent
添加了 CharacterController。这使得问题存在的可能性更大,因为您的 CharacterController 的碰撞器没有正确配置。只需通过检查器将 CharacterController 添加到您的角色,配置它,然后在您的脚本中使用序列化引用,您可以在检查器中分配该引用。像这样:
[SerializeField] private CharacterController controller;
如果您出于某种原因不想序列化 CharacterController,您也可以简单地使用 GetComponent
而不是 AddComponent
。