2012-07-06 9 views
8

Tôi rất mới đối với C#. Tôi đang tạo ra một thứ gì đó trong Unity để giúp tôi học C# và Unity tốt hơn.C# và Unity3D khi phím đang được nhấn

Tôi muốn biết lý do tại sao:

Input.GetKeyDown(KeyCode.UpArrow)) 

Chỉ bắn một lần khi được đặt bên trong:

void Update() 

Kể từ khi cập nhật là một vòng lặp, tại sao nó không bị sa thải trong khi tôi giữ phím xuống (trong trường hợp của tôi gây ra một quả cầu để di chuyển)?

Tôi đã quản lý để làm cho nó hoạt động bằng cách sử dụng hai bools được thay đổi khi phím được nhấn và nhả.

Đây là kịch bản đầy đủ của tôi mà tôi đang chơi với để di chuyển một quả cầu và mô phỏng khả năng tăng tốc/giảm tốc:

using UnityEngine; 
using System.Collections; 

public class sphereDriver : MonoBehaviour { 
int x ; 
bool upPressed = false ; 
bool downPressed = false ; 
void Start() 
{ 
    x = 0 ; 
} 

void Update() 
{ 
    if(x > 0) { 
     x -= 1 ; 
    } 
    if(x < 0) { 
     x += 1 ; 
    } 
    if(Input.GetKeyDown(KeyCode.UpArrow)) 
    { 
     upPressed = true ; 
    } 
    else if(Input.GetKeyUp(KeyCode.UpArrow)) 
    { 
     upPressed = false ; 
    } 

    if(upPressed == true) 
    { 
     x += 5 ; 
    } 

    if(Input.GetKeyDown(KeyCode.DownArrow)) 
    { 
     downPressed = true ; 
    } 
    else if(Input.GetKeyUp(KeyCode.DownArrow)) 
    { 
     downPressed = false ; 
    } 

    if(downPressed == true) 
    { 
     x -= 5 ; 
    } 

    transform.Translate(x * Time.deltaTime/10, 0, 0) ; 
} 

} 

Trả lời

6

Các documentation nói rằng đây là, hành vi dự kiến ​​thông thường.

Bạn có thể muốn sử dụng GetButton hoặc GetAxis để thay thế, vì những thứ đó cho biết "được nhấn" miễn là khóa được giữ lại (GetButton trả về true, GetAxis trả về 1).

+0

Cảm ơn! Vì hai chức năng đó là Unity cụ thể, liệu cách tôi đã làm nó ban đầu có phải là những gì hầu hết sẽ làm để đạt được những gì tôi muốn chỉ trong C#? – imperium2335

+0

Vâng, đây sẽ là một cách phổ biến để làm điều đó. – redtuna

5

Từ tài liệu trên Input.GetKeyDown.

Bạn cần gọi hàm này từ chức năng Cập nhật, vì trạng thái được đặt lại mỗi khung. Nó sẽ không trả lại đúng cho đến khi người dùng đã nhả phím và nhấn lại.

Phương pháp này hữu ích nhất để mở menu hoặc các sự kiện một lần khác. Chẳng hạn như hộp thoại tiếp tục.

Bạn có thể sử dụng các phương pháp như đã đề cập ở trên, tuy nhiên bạn có thể sử dụng Input.GetKey để đạt được mục tiêu của mình.

Trả về true khi người dùng giữ phím được xác định theo tên.