Unity Input.GetKeyDown (KeyCode.Space) không phát hiện phím Bấm
Tôi đang học Unity nhưng phím bấm của tôi không được phát hiện
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public Rigidbody myBody;
private float time = 0.0f;
private bool isMoving = false;
private bool isJumpPressed = false;
void Start(){
myBody = GetComponent<Rigidbody>();
}
void Update()
{
isJumpPressed = Input.GetKeyDown(KeyCode.Space);
Debug.Log(isJumpPressed);
}
void FixedUpdate(){
if(isJumpPressed){
myBody.velocity = new Vector3(0,10,0);
isMoving = true;
Debug.Log("jump");
}
if(isMoving){
time = time + Time.fixedDeltaTime;
if(time>10.0f)
{
//Debug.Log( Debug.Log(gameObject.transform.position.y + " : " + time));
time = 0.0f;
}
}
}
}
tại sao JumpPressed luôn sai. Tôi đang làm gì sai? Theo những gì tôi hiểu, điều này sẽ hoạt động nhưng tôi rõ ràng là thiếu một cái gì đó
CẬP NHẬT: Cảm ơn tất cả những người đã đề xuất ý tưởng. Tôi nhận được isJumpPressed trả về true khi tôi ngừng cố gắng phát hiện phím cách.
isJumpPressed = Input.GetKeyDown("a");
bất cứ ai có bất kỳ ý tưởng tại sao điều này sẽ hoạt động và không
isJumpPressed = Input.GetKeyDown(KeyCode.Space);
hoặc là
isJumpPressed = Input.GetKeyDown("space");
CẬP NHẬT 2: Rõ ràng đây là một lỗi trong Linux. Tôi đã đọc nó sẽ không xảy ra khi trò chơi chỉ được xây dựng trong trình chỉnh sửa. Tôi đã tìm thấy một cách giải quyết tạihttps://forum.unity.com/threads/space-not-working.946974/?_ga=2.25366461.1247665695.1598713842-86850982.1598713842#post-6188199
Nếu bất kỳ nhân viên Google nào gặp sự cố này, hãy tham khảo mã sau vì mã này đang hoạt động với tôi.
public class Player : MonoBehaviour
{
public Rigidbody myBody;
private float time = 0.0f;
private bool isMoving = false;
private bool isJumpPressed = false;
void Start(){
myBody = GetComponent<Rigidbody>();
}
void Update()
{
isJumpPressed = Input.GetKeyDown(SpacebarKey());
if(isJumpPressed)
{
Debug.Log(isJumpPressed);
}
}
void FixedUpdate(){
if(isJumpPressed){
myBody.velocity = new Vector3(0,10,0);
isMoving = true;
Debug.Log("jump");
}
if(isMoving){
time = time + Time.fixedDeltaTime;
if(time>10.0f)
{
//Debug.Log( Debug.Log(gameObject.transform.position.y + " : " + time));
time = 0.0f;
}
}
}
public static KeyCode SpacebarKey() {
if (Application.isEditor) return KeyCode.O;
else return KeyCode.Space;
}
}
Trả lời
Vấn đề là FixedUpdatevà Updatekhông được gọi là cái khác. Cập nhật được gọi một lần cho mỗi khung hình và FixedUpdate được gọi một lần cho mỗi bản cập nhật vật lý (mặc định là 50 bản cập nhật mỗi giây).
Vì vậy, điều sau có thể xảy ra:
Update is called -> GetKeyDown is true (this frame only) -> isJumpPressed = true
Update is called -> GetKeyDown is false -> isJumpPressed = false
FixedUpdate is called -> isJumpPressed is false
Đây là một ví dụ in "Cập nhật Jump" mỗi khi bạn nhấn dấu cách và "Cố định ngày nhảy" chỉ đôi khi bạn nhấn dấu cách. Đừng làm điều này:
bool isJumpPressed;
void Update()
{
isJumpPressed = Input.GetKeyDown(KeyCode.Space);
if (isJumpPressed)
{
Debug.Log("Update Jump");
}
}
private void FixedUpdate()
{
if (isJumpPressed)
{
Debug.Log("FixedUpdate Jump");
}
}
Làm điều này thay thế:
bool isJumpPressed;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
isJumpPressed = true;
Debug.Log("Update Jump");
}
}
private void FixedUpdate()
{
if (isJumpPressed)
{
Debug.Log("FixedUpdate Jump");
isJumpPressed = false;
}
}
Một vấn đề có thể xảy ra là dự án của bạn có thể đang sử dụng gói Hệ thống đầu vào mới . Nếu bạn đang sử dụng gói này, các chức năng Trình quản lý đầu vào cũ sẽ không hoạt động. Để kiểm tra điều này, hãy chuyển đến Edit > Project Settings... > Player > Other Settingsvà Active Input Handlingphải được đặt thành Input Manager (Old)(hoặc Bothcũng có thể hoạt động).
Nếu bạn thực sự muốn sử dụng gói Hệ thống đầu vào, bạn phải cài đặt gói này nếu bạn chưa có và bạn sẽ kiểm tra xem phím cách có được nhấn như vậy không:
using UnityEngine.InputSystem;
...
jumpPressed = Keyboard.current.space.wasPressedThisFrame;
Kiểm tra tài liệu tại đây: https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html
Trả về true trong khung mà người dùng bắt đầu nhấn phím được xác định bằng tên.
Bạn cần gọi chức năng này từ chức năng Cập nhật, vì trạng thái được đặt lại từng khung. Nó sẽ không trả về true cho đến khi người dùng thả phím và nhấn lại.
Sử dụng GetKeychức năng thay thế:https://docs.unity3d.com/ScriptReference/Input.GetKey.html
Trả về true trong khi người dùng giữ khóa được xác định bằng tên.