【问题标题】:Unity/C# Weird glitch in FPS controllerFPS 控制器中的 Unity/C# 奇怪故障
【发布时间】:2014-09-02 08:51:51
【问题描述】:

我有一个奇怪的故障,当我从角落走下来(我不按跳跃键)时,玩家会以非常快的速度摔倒。如果我跳,那么一切都会正常。 (它的 Quill18 FPS 控制器,我从那里学习,所以我不使用内置控制器)

using UnityEngine;
using System.Collections;    
[RequireComponent (typeof(CharacterController))]
public class FirstPersonController : MonoBehaviour
{

    public float movementSpeed = 5.0f;
    public float mouseSensitivity = 5.0f;
    public float jumpSpeed = 20.0f;

    float verticalRotation = 0;
    public float upDownRange = 60.0f;

    float verticalVelocity = 0;

    CharacterController characterController;

    // Use this for initialization
    void Start()
    {
//     Screen.lockCursor = true;
       characterController = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update() 
    {
       // Rotation

       float rotLeftRight = Input.GetAxis("Mouse X") * mouseSensitivity;
       transform.Rotate(0, rotLeftRight, 0);

       verticalRotation -= Input.GetAxis("Mouse Y") * mouseSensitivity;
       verticalRotation = Mathf.Clamp(verticalRotation, -upDownRange, upDownRange);
       Camera.main.transform.localRotation = Quaternion.Euler(verticalRotation, 0, 0);

       // Movement

       float forwardSpeed = Input.GetAxis("Vertical") * movementSpeed;
       float sideSpeed = Input.GetAxis("Horizontal") * movementSpeed;

       verticalVelocity += Physics.gravity.y * Time.deltaTime;

       if (characterController.isGrounded && Input.GetButton("Jump"))
       {
          verticalVelocity = jumpSpeed;
       }

       Vector3 speed = new Vector3(sideSpeed, verticalVelocity, forwardSpeed ;

       speed = transform.rotation * speed;

       characterController.Move(speed * Time.deltaTime);
    }
}

【问题讨论】:

  • 你确定这是你看到的异常吗?我的意思是,站立坠落比跳跃更快达到给定的向下速度,这就是运动学的工作原理。
  • 是的,如果我不跳,就从楼上下来,就像传送到地板一样。
  • 好的,所以我不是 Unity 开发人员,我不确定这一点,但问题可能是 y 位置是相对于当前角色下方的地面高度测量的?因此,当您离开窗台时,您的角色实际上会保持一个恒定的 y 位置,并且没有发生加速度,只是 y=0 的位置移动得更低了。
  • 这取决于你如何实现CharacterController 我想,特别是Move 方法。
  • 这是一个很好的猜测 Asad,替代方法可能是您的 y 速度/加速度非常高,但控制器代码阻止您从地面坠落。当您从壁架上走下来时,由于速度快,几乎是瞬间坠落。取决于你是否实现了终端速度以及坠落的距离(你应该能够看到一些中间帧,即如果坠落足够远,则不是完全瞬时的)。

标签: c# unity3d


【解决方案1】:

问题是你运行的每一帧都在这行:

verticalVelocity += Physics.gravity.y * Time.deltaTime;

因此,您每秒钟都在获得“动量”,并且在您跳跃之前它不会停止,因为您将 Y 速度“重置”为正常值。我以前遇到过这个问题,只需在未接地时添加 Y 速度即可解决此问题。您可以使用 Raycast 来检查您是否有地面,如果没有,则将 verticalVelocity 增加该数量。

【讨论】:

  • 感谢您的帮助,即使我是初学者,我可以要求将代码放入脚本中吗?如果你不需要很长时间。
  • 如果你是新手我建议不要索要代码,自己去拿东西感觉爽多了。不过,我可以告诉您的是,您可以使用 Raycast 来检查您是否在地面上,如果是,请不要添加 verticalVelocity,您需要的文档在这里 Raycast 。希望对你有帮助!
猜你喜欢
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 2020-08-03
相关资源
最近更新 更多