Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как отключить взаимодействие клавиш 'W', 'S', 'A', 'D', 'Space' и т. д. с кнопками на Canvas? C#, Unity

pivel Ученик (136), на голосовании 7 месяцев назад
Занимаюсь проектом в Unity и возникла проблема, что при нажатии, например, пробела, нажимается выбранная кнопка на канвасе. Это происходит и с 'W', 'S', 'A', 'D' и со стрелочками (выбирается следующая или предыдущая кнопка). Я хочу отключить эту особенность, чтобы с кнопками можно было взаимодействовать только с помощью мыши. Я знаю способ с OnPointerDown, но проблема в том, что реализация событий кнопок происходит не на их скрипте, а на скрипте их канваса. Вот весь нужный код с канвас:
public class Tools : MonoBehaviour
{
public Classes classes;
public Button[] toolsBottons;
private void Start()
{
for (int i = 0; i < 5; i++)
toolsBottons[i].GetComponentInChildren<TextMeshProUGUI>().text = classes.playerController.keypad[i].ToString();
for (int i = 0; i < toolsBottons.Length; i++)
{
if (i == 0)
toolsBottons[i].onClick.AddListener(()=> {classes.playerController.Key(0);});
else if (i == 1)
toolsBottons[i].onClick.AddListener(()=> {classes.playerController.Key(1);});
else if (i == 2)
toolsBottons[i].onClick.AddListener(()=> {classes.playerController.Key(2);});
else if (i == 3)
toolsBottons[i].onClick.AddListener(()=> {classes.playerController.Key(3);});
else if (i == 4)
toolsBottons[i].onClick.AddListener(()=> {classes.playerController.Key(4);});
else if (i == 5)
toolsBottons[i].onClick.AddListener(ToMenu);
}
}
private void ToMenu()
{
gameObject.SetActive(false);
classes.menu.gameObject.SetActive(true);
}
}
Подскажите мне, может быть есть какое-то событие по отслеживанию нажатий всех кнопок с канваса или просто как-то можно отключить связь клавиатуры и кнопок (но не отключать вообще весь ввод с клавы, только связь с событиями кнопок) и что-то другое.
Голосование за лучший ответ
Narek Parazyan Ученик (103) 8 месяцев назад
Для отключения автоматического выделения и нажатия кнопок при использовании клавиш клавиатуры, вы можете использовать EventSystem в Unity. EventSystem управляет вводом и событиями в вашем приложении.

В вашем случае, чтобы отключить автоматическое выделение кнопок с клавиш клавиатуры, вы можете установить объект EventSystem.current.firstSelectedGameObject в null в момент запуска вашей программы или в методе Start.

Пример кода:

using UnityEngine;
using UnityEngine.UI;

public class Tools : MonoBehaviour
{
public Classes classes;
public Button[] toolsButtons;

private void Start()
{
// Убираем выделение кнопок при старте
UnityEngine.EventSystems.EventSystem.current.firstSelectedGameObject = null;

for (int i = 0; i < 5; i++)
{
toolsButtons[i].GetComponentInChildren<TextMeshProUGUI>().text = classes.playerController.keypad[i].ToString();
}

for (int i = 0; i < toolsButtons.Length; i++)
{
int index = i; // Захватываем переменную в замыкание, чтобы избежать проблем с замыканием
toolsButtons[i].onClick.AddListener(() => { classes.playerController.Key(index); });
}
}

private void ToMenu()
{
gameObject.SetActive(false);
classes.menu .gameObject.SetActive(true);
}
}
В данном коде EventSystem.current.firstSelectedGameObject = null; устанавливает текущий выбранный объект в null, что приведет к отсутствию выделения кнопок клавишами при старте приложения.
pivelУченик (136) 8 месяцев назад
https://youtu.be/ijN7zXtL-kI . В видео я показал что происходит, хотя так не должно быть, хоть я и вставил ваш код
Похожие вопросы