Как обрабатывать несколько ключевых входов в новой системе ввода Unity 1.0.0

#c# #unity3d #input #user-input

#c# #unity3d #ввод #пользовательский ввод

Вопрос:

Я пытаюсь изучить новую систему ввода Unity. В предыдущей системе ввода Unity,

 if (Input.GetKeyDown("f"))
    //do something when key 'f' is pressed
if (Input.GetKeyDown("g"))
    //do something when key 'g' is pressed
if (Input.GetKeyDown("h"))
    //do something when key 'h' is pressed
if (Input.GetKeyDown("j"))
    //do something when key 'j' is pressed
  

выполнял бы любые определенные действия по нажатию клавиш f, g, h, j .

В новой системе ввода Unity есть InputAction, с помощью которого я могу определять карты действий, действия и свойства. Затем я могу реализовать функции, как показано ниже, которые могут быть вызваны из PlayerInput в инспекторе объекта player.

 public void OnKey_F(InputAction.CallbackContext context)
{
    if (context.started)
        Debug.Log("Pressed F");
}
public void OnKey_G(InputAction.CallbackContext context)
{
    if (context.started)
        Debug.Log("Pressed G");
}
public void OnKey_H(InputAction.CallbackContext context)
{
    if (context.started)
        Debug.Log("Pressed H");
}
public void OnKey_J(InputAction.CallbackContext context)
{
    if (context.started)
        Debug.Log("Pressed J");
}
  

Правильно ли это выполнять ту же функцию, что и выше, в новой системе ввода Unity? Найденные мной руководства были в основном для WASD movement, с которым я уже разобрался, как это работает (2d вектор). Однако я не уверен в этом случае, для которого требуется несколько клавиш для нескольких функций.

Ответ №1:

Есть несколько способов добиться этого, поэтому я сожалею, что я все еще не на 100% разбираюсь в этой форме, но я подумал, что хотел бы поделиться простой реализацией, которая отлично работает у меня с несколькими нажатиями клавиш, которая полностью обходит большую часть работы инспектора.

Это начинается с выбора ресурса карты ввода игрока и подтверждения того, что кнопка «создать класс C #» активирована и применяется.

Затем в скрипте MonoBehavior мы создаем экземпляр этого класса и добавляем встроенные функции обратного вызова:

 PlayerInputClass Inputs;

void Awake(){
    Inputs = new PlayerInputClass();
    Inputs.Enable();

    // Examples. You can add as many as you want.

    // You can put the ContextCallback to use
    Inputs.Player.Move.performed  = ctx => Movement = ctx.ReadValue<Vector2>();

    // You can complete ignore it
    Inputs.Player.Roll.performed  = ctx => _RollInputFlag = true;

    // You can define a function to handle the press
    Inputs.Player.OtherAction.performed  = FunctionThatRuns();
}
  

Обычно я выбираю переключение флага, чтобы скрипт мог точно решить, когда отвечать и вернуть флаг.

Обратите внимание, что здесь Player указано имя карты действий, а имена после — это фактические имена действий. Это также приятно, потому что Intellisense включится и поможет.