为什么我的玩家模型在我向前移动时会立即传送到地面上?

时间:2020-12-21 02:42:46

标签: c# unity3d

就在我按下 '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);
    }
}






1 个答案:

答案 0 :(得分:0)

您的代码中有几个潜在的错误。但是,很难根据给定的信息确定问题的根源。你能提供场景截图和你角色的检查员吗?

首先,你写了

<块引用>

我没有使用角色控制器。

尽管清楚地使用了 CharacterController。我猜这是一个错字。 请确保 CharacterController 的碰撞器和地面碰撞器的配置正确。这是问题的最可能来源。

关于您的脚本:您正在应用 gravityValue,即使您已经接地并且您将 Time.deltaTime 乘以两次。

编辑:再看一遍,我看到您在运行时使用 AddComponent 添加了 CharacterController。这使得问题存在的可能性更大,因为您的 CharacterController 的碰撞器没有正确配置。只需通过检查器将 CharacterController 添加到您的角色,配置它,然后在您的脚本中使用序列化引用,您可以在检查器中分配该引用。像这样:

[SerializeField] private CharacterController controller;

如果您出于某种原因不想序列化 CharacterController,您也可以简单地使用 GetComponent 而不是 AddComponent