Ответ 1
Вы не используете 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()
{
//Register Button Events
button1.onClick.AddListener(() => buttonCallBack(button1));
button2.onClick.AddListener(() => buttonCallBack(button2));
button3.onClick.AddListener(() => buttonCallBack(button3));
}
private void buttonCallBack(Button buttonPressed)
{
if (buttonPressed == button1)
{
//Your code for button 1
Debug.Log("Clicked: " + button1.name);
}
if (buttonPressed == button2)
{
//Your code for button 2
Debug.Log("Clicked: " + button2.name);
}
if (buttonPressed == button3)
{
//Your code for button 3
Debug.Log("Clicked: " + button3.name);
}
}
void OnDisable()
{
//Un-Register Button Events
button1.onClick.RemoveAllListeners();
button2.onClick.RemoveAllListeners();
button3.onClick.RemoveAllListeners();
}
}
Если вы обнаруживаете что-то другое, кроме кнопки "Щелчок" на кнопке, используйте метод 1. Например, кнопка "вниз", а не "Щелчок кнопки", используйте IPointerDownHandler
и его функцию OnPointerDown
из метода 1.
3. Компонент InputField
:
Вы используете события для регистрации для входа в InputField submit:
public InputField inputField;
void OnEnable()
{
//Register InputField Events
inputField.onEndEdit.AddListener(delegate { inputEndEdit(); });
inputField.onValueChanged.AddListener(delegate { inputValueChanged(); });
}
//Called when Input is submitted
private void inputEndEdit()
{
Debug.Log("Input Submitted");
}
//Called when Input changes
private void inputValueChanged()
{
Debug.Log("Input Changed");
}
void OnDisable()
{
//Un-Register InputField Events
inputField.onEndEdit.RemoveAllListeners();
inputField.onValueChanged.RemoveAllListeners();
}
4. Компонент Slider
:
Чтобы определить, когда значение ползунка изменяется во время перетаскивания:
public Slider slider;
void OnEnable()
{
//Subscribe to the Slider Click event
slider.onValueChanged.AddListener(delegate { sliderCallBack(slider.value); });
}
//Will be called when Slider changes
void sliderCallBack(float value)
{
Debug.Log("Slider Changed: " + value);
}
void OnDisable()
{
//Un-Subscribe To Slider Event
slider.onValueChanged.RemoveListener(delegate { sliderCallBack(slider.value); });
}
Для других событий используйте метод 1.
5. Dropdown
компонент
public Dropdown dropdown;
void OnEnable()
{
//Register to onValueChanged Events
//Callback with parameter
dropdown.onValueChanged.AddListener(delegate { callBack(); });
//Callback without parameter
dropdown.onValueChanged.AddListener(callBackWithParameter);
}
void OnDisable()
{
//Un-Register from onValueChanged Events
dropdown.onValueChanged.RemoveAllListeners();
}
void callBack()
{
}
void callBackWithParameter(int value)
{
}
Некоммерческие объекты:
6. Для 3D-объекта (Mesh Renderer/любой 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);
}
//Implement Other Events from Method 1
}
7. Для 2D-объекта (Sprite Renderer/любой 2D-коллайдер)
Добавьте в Camera 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);
}
//Implement Other Events from Method 1
}
Устранение неполадок EventSystem:
Не обнаружено кликов в пользовательском интерфейсе, 2D-объектах (Sprite Renderer/любой 2D-коллайдер) и 3D-объектах (Mesh Renderer/любой 3D-коллайдер):
.Проверить, что у вас есть EventSystem. Без EventSystem он не может обнаруживать клики на всех. Если у вас его нет, создайте его самостоятельно.
Перейдите в GameObject ---> UI ---> Event System. Это создаст EventSystem, если она еще не существует. Если он уже существует, Unity просто проигнорирует его.
B. Компонент пользовательского интерфейса или GameObject с компонентом пользовательского интерфейса должен находиться под Canvas
. Это означает, что Canvas
должен быть родительским компонентом пользовательского интерфейса. Без этого EventSystem не будет функционировать, и клики не будут обнаружены.
Это относится только к объектам пользовательского интерфейса. Это не относится к 2D (Sprite Renderer/любой 2D-коллайдер) или 3D-объектам (Mesh Renderer/любой 3D-коллайдер).
C. Если это 3D-объект, PhysicsRaycaster
не подключен к камере. Удостоверьтесь, что PhysicsRaycaster
подключен к камере. См. # 6 выше для получения дополнительной информации.
D. Если это 2D-объект, Physics2DRaycaster
не подключена к камере. Убедитесь, что приложение Physics2DRaycaster
подключено к камере. См. № 7 выше для получения дополнительной информации.
E. Если это объект пользовательского интерфейса, который вы хотите обнаружить, с помощью функций интерфейса, таких как OnBeginDrag
, OnPointerClick
, OnPointerEnter
и других функций, упомянутых в # 1, тогда скрипт с кодом обнаружения должен быть прикреплен к этому объекту пользовательского интерфейса, который вы хотите обнаружить нажмите на.
F.Также, если это интерфейс объекта, который вы хотите, чтобы обнаружить клики, убедитесь, что ни один другой объект UI не находится перед ним. Если есть другой пользовательский интерфейс перед тем, который вы хотите обнаружить, нажмите, он будет блокировать этот клик.
Чтобы убедиться, что это не проблема, отключите каждый объект под Canvas, кроме того, который вы хотите обнаружить, нажмите, а затем посмотрите, работает ли его клик.