Sprint不起作用

本文关键字:不起作用 Sprint | 更新日期: 2023-09-27 17:50:58

我在c#中制作了一个第一人称脚本,鼠标看起来在一个单独的脚本中。然而,在我的移动脚本中,基本的行走功能有效,但冲刺功能不起作用。在对脚本进行更改后,导致相当低效但最终相同的脚本,我得出的结论是,它根本没有检测或使用来自sprint键的任何输入,该输入已在编辑器中设置-尽管我可能是错误的。脚本是:

using UnityEngine;
using System.Collections;
public class PlayerMovement : MonoBehaviour {
public float speed = 3.0F;
public float jumpSpeed = 8.0F;
public float gravity = 20.0F;
public float runSpeed = 6f;
public float crouchSpeed = 3f;
Vector3 moveDirection;
void Update() {
    CharacterController controller = GetComponentInParent<CharacterController>();
    if (controller.isGrounded) {
            moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            moveDirection = transform.TransformDirection(moveDirection);
        if (Input.GetButton("Jump")){
            moveDirection.y = jumpSpeed;
        }

    }
    moveDirection.y -= gravity * Time.deltaTime;
    if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D) && Input.GetButton("Sprint")){
        controller.Move (moveDirection * runSpeed * Time.deltaTime);
    } 
    else if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)){
        controller.Move (moveDirection * speed * Time.deltaTime);
    }
}
}

Sprint不起作用

这只是一个布尔逻辑错误:&&优先于||

这行有问题:

if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D) && Input.GetButton("Sprint"))

应包含||条件:

if ((Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) && Input.GetButton("Sprint"))

无论如何,更好的方法是将这两部分分开:

if ((Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
{
    var realSpeed = Input.GetButton("Sprint") ? runSpeed : speed;
    controller.Move (moveDirection * realSpeed * Time.deltaTime);
}

您应该检查c#中的操作符优先级(https://msdn.microsoft.com/en-us/library/aa691323%28v=vs.71%29.aspx)

您遇到的问题是,如果按下W, S或A,代码将总是进入if语句的第一个条件。

要解决这个问题,可以在OR语句周围加上括号,像这样:

if ((Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) && Input.GetButton("Sprint")){
    controller.Move (moveDirection * runSpeed * Time.deltaTime);
} 
else if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)){
    controller.Move (moveDirection * speed * Time.deltaTime);
}