Ви не використовуєте API введення для нового інтерфейсу. Ви підписуєтесь на події інтерфейсу користувача або реалізуєте інтерфейс залежно від події.
Це правильні способи виявлення подій у нових компонентах інтерфейсу користувача:
1 . Image
, RawImage
І Text
компоненти:
Впровадити необхідний інтерфейс і замінити його функцію. У наведеному нижче прикладі реалізовані найбільш використовувані події.
using UnityEngine.EventSystems;
public class ClickDetector : MonoBehaviour, IPointerDownHandler, IPointerClickHandler,
IPointerUpHandler, IPointerExitHandler, IPointerEnterHandler,
IBeginDragHandler, IDragHandler, IEndDragHandler
{
public void OnBeginDrag(PointerEventData eventData)
{
Debug.Log("Drag Begin");
}
public void OnDrag(PointerEventData eventData)
{
Debug.Log("Dragging");
}
public void OnEndDrag(PointerEventData eventData)
{
Debug.Log("Drag Ended");
}
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Mouse Down: " + eventData.pointerCurrentRaycast.gameObject.name);
}
public void OnPointerEnter(PointerEventData eventData)
{
Debug.Log("Mouse Enter");
}
public void OnPointerExit(PointerEventData eventData)
{
Debug.Log("Mouse Exit");
}
public void OnPointerUp(PointerEventData eventData)
{
Debug.Log("Mouse Up");
}
}
2 . Button
Компонент:
Ви використовуєте події для реєстрації для натискання кнопки:
public class ButtonClickDetector : MonoBehaviour
{
public Button button1;
public Button button2;
public Button button3;
void OnEnable()
{
button1.onClick.AddListener(() => buttonCallBack(button1));
button2.onClick.AddListener(() => buttonCallBack(button2));
button3.onClick.AddListener(() => buttonCallBack(button3));
}
private void buttonCallBack(Button buttonPressed)
{
if (buttonPressed == button1)
{
Debug.Log("Clicked: " + button1.name);
}
if (buttonPressed == button2)
{
Debug.Log("Clicked: " + button2.name);
}
if (buttonPressed == button3)
{
Debug.Log("Clicked: " + button3.name);
}
}
void OnDisable()
{
button1.onClick.RemoveAllListeners();
button2.onClick.RemoveAllListeners();
button3.onClick.RemoveAllListeners();
}
}
Якщо ви виявляєте щось інше, ніж Button Клацніть на Button, тоді скористайтеся способом 1. Наприклад, Button down, а не Button Click, use IPointerDownHandler
and its OnPointerDown
function from method 1.
3 . InputField
Компонент:
Ви використовуєте події для реєстрації для реєстрації для подання InputField:
public InputField inputField;
void OnEnable()
{
inputField.onEndEdit.AddListener(delegate { inputEndEdit(); });
inputField.onValueChanged.AddListener(delegate { inputValueChanged(); });
}
private void inputEndEdit()
{
Debug.Log("Input Submitted");
}
private void inputValueChanged()
{
Debug.Log("Input Changed");
}
void OnDisable()
{
inputField.onEndEdit.RemoveAllListeners();
inputField.onValueChanged.RemoveAllListeners();
}
4 . Slider
Компонент:
Щоб визначити, коли значення повзунка змінюється під час перетягування:
public Slider slider;
void OnEnable()
{
slider.onValueChanged.AddListener(delegate { sliderCallBack(slider.value); });
}
void sliderCallBack(float value)
{
Debug.Log("Slider Changed: " + value);
}
void OnDisable()
{
slider.onValueChanged.RemoveListener(delegate { sliderCallBack(slider.value); });
}
Для інших подій використовуйте метод 1 .
5 . Dropdown
Компонент
public Dropdown dropdown;
void OnEnable()
{
dropdown.onValueChanged.AddListener(delegate { callBack(); });
dropdown.onValueChanged.AddListener(callBackWithParameter);
}
void OnDisable()
{
dropdown.onValueChanged.RemoveAllListeners();
}
void callBack()
{
}
void callBackWithParameter(int value)
{
}
ОБ’ЄКТИ, ЩО НЕ ПІДКЛАДУЮТЬСЯ:
6 .Для 3D-об’єкта (візуалізатор сітки / будь-який 3D-коллайдер)
Додайте PhysicsRaycaster
до камери, а потім використовуйте будь-яку з подій із способу 1 .
Код нижче буде автоматично доданий PhysicsRaycaster
до основного Camera
.
public class MeshDetector : MonoBehaviour, IPointerDownHandler
{
void Start()
{
addPhysicsRaycaster();
}
void addPhysicsRaycaster()
{
PhysicsRaycaster physicsRaycaster = GameObject.FindObjectOfType<PhysicsRaycaster>();
if (physicsRaycaster == null)
{
Camera.main.gameObject.AddComponent<PhysicsRaycaster>();
}
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
}
}
7 .Для 2D-об’єкта (Sprite Renderer / будь-який 2D Collider)
Додати Physics2DRaycaster
до камери, а потім використовуйте будь-яку з подій із способу 1 .
Код нижче буде автоматично доданий Physics2DRaycaster
до основного Camera
.
public class SpriteDetector : MonoBehaviour, IPointerDownHandler
{
void Start()
{
addPhysics2DRaycaster();
}
void addPhysics2DRaycaster()
{
Physics2DRaycaster physicsRaycaster = GameObject.FindObjectOfType<Physics2DRaycaster>();
if (physicsRaycaster == null)
{
Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
}
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
}
}
Усунення несправностей системи EventSystem:
Жодних клацань на користувацькому інтерфейсі, 2D-об'єктах (Sprite Renderer / будь-який 2D Collider) та 3D-об'єктах (Mesh Renderer / будь-який 3D Collider):
A Перевірте, чи маєте ви систему EventSystem. Без EventSystem він взагалі не може виявляти кліки. Якщо у вас його немає, створіть її самі.
Перейдіть до GameObject ---> UI ---> Система подій . Це створить EventSystem, якщо вона ще не існує. Якщо воно вже існує, Unity просто проігнорує його.
Б. Компонент інтерфейсу користувача або GameObject з компонентом інтерфейсу користувача повинен знаходитись підCanvas
. Це означає, що Canvas
must повинен бути батьківським компонентом інтерфейсу користувача. Без цього EventSystem не працюватиме, а клацання не виявлятимуться.
Це стосується лише об’єктів інтерфейсу користувача. Це не стосується 2D (Sprite Renderer / будь-якого 2D Collider) або 3D-об'єктів (Mesh Renderer / будь-якого 3D Collider).
C. Якщо це 3D-об'єкт, PhysicsRaycaster
він не прикріплений до камери. Переконайтеся, що PhysicsRaycaster
прикріплено до камери. Дивіться No6 вище для отримання додаткової інформації.
D. Якщо це 2D-об'єкт, Physics2DRaycaster
він не прикріплений до камери. Переконайтеся, що Physics2DRaycaster
прикріплено до камери. Для отримання додаткової інформації див. No7 вище.
E .Якщо це об'єкт призначеного для користувача інтерфейсу ви хочете , щоб виявити кліки з функціями інтерфейсу , таких як OnBeginDrag
, OnPointerClick
, OnPointerEnter
та інші функції , згадані в # 1 , то скрипт з кодом виявлення повинні бути прикріплені до цього об'єкта призначеного для користувача інтерфейсу ви хочете , щоб виявити натиснути на кнопку.
F. Крім того, якщо це об’єкт інтерфейсу, який ви хочете виявити, клацання, переконайтеся, що перед ним немає жодного іншого об’єкта інтерфейсу. Якщо перед тим, за яким ви хочете виявити клацання, є інший інтерфейс, він буде блокувати цей клік.
Щоб перевірити, що це не проблема, відключіть усі об’єкти під полотном, крім того, який ви хочете виявити, клацніть, а потім перевірте, чи це працює.