새 UI에 입력 API를 사용하지 마십시오. UI 이벤트에 가입하거나 이벤트에 따라 인터페이스를 구현합니다.
1 :
이
는 새로운 UI 구성 요소에 이벤트를 감지 할 수있는 적절한 방법입니다.
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
구성 요소 :
당신은 버튼 클릭에 등록 이벤트를 사용
당신이 다음 예를 들어 방법 1. 사용하는 버튼에 버튼을 클릭 이외의 무언가를 감지하는 경우
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
기능을 사용하십시오.
. InputField
구성 요소 :
당신은 제출 InputField에 등록하려면 등록 이벤트를 사용
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.
.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)
{
}
NONE UI OBJECTS :이
가
이
이 카메라에 PhysicsRaycaster
추가 6 .FOR 3D 개체 (메쉬 렌더러/어떤 3D 충돌 장치)가 다음 어떤을 사용 방법 1의 이벤트 중.
아래 코드는 Camera
에 자동으로 PhysicsRaycaster
을 추가합니다.
이 카메라에 Physics2DRaycaster
추가
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 .FOR 2D 개체 (스프 렌더/어떤 2D 인 LHC는) 다음 방법 1에서 이벤트 중 하나를 사용하십시오.
아래 코드는 Camera
메인에 Physics2DRaycaster
을 자동으로 추가합니다.
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
}
안녕하세요 @ 프로그래머. 터치처럼 입력 API를 사용하지 않으면 모바일 사용이 터치 된 이후로 모바일에 어떻게 들어가게 될까요? 감사합니다. –
UI API는 모바일과 데스크톱 모두에서 작동합니다. 그것은 그것의 좋은면이고 이것은 전혀 문제가되지 않습니다. 잠시 후 다른 3D (Mesh Renderer/Collider)와 2D (Sprite/2D Collider)를 포함하도록 업데이트하겠습니다. – Programmer
public void OnPointerClick (PointerEventData eventData) 이것은 모바일 터치입니까? 내가 그것을 사용하고 있기 때문에 나는 그것을 깨닫지 못한다. 하하 .. –