#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 включится и поможет.