我在C#中制作了第一人称脚本,鼠标在单独的脚本中查找。但是,在我的移动脚本中,基本步行功能有效,但sprint功能不起作用。在对脚本进行更改后,导致效率相当低但最终完全相同的脚本,我得出的结论是,它根本没有检测或使用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);
}
}
}
答案 0 :(得分:1)
这只是一个布尔逻辑错误:&&
优先于||
。
此行有问题:
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);
}
答案 1 :(得分:0)
您应该在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);
}