AndroidのTouch on CanvasでUIオブジェクトを検出する方法は?
たとえば、Image
、RawImage
、Buttons
、InputField
などの5つのオブジェクトを持つキャンバスがあります。
Button UIオブジェクトにタッチしたら、次に何かをします。クリックするたびに、各ボタンは異なるプロセスを実行します。
コードは次のようになります。
private void Update()
{
if (Input.touches.Length <= 0) return;
for (int i = 0; i < Input.touchCount; i++)
{
if (Button1.touch)
if (Input.GetTouch(i).phase == TouchPhase.Began)
login();
else if (Button2.touch && Input.GetTouch(i).phase == TouchPhase.Began)
LogOut();
}
}
それでどうやってやるの?
2番目:Gameobjectがタッチを検出する方法上記と同じですか?
新しいUIには入力APIを使用しません。 UIイベントをサブスクライブするか、イベントに応じてインターフェイスを実装します。
これらは、新しいUIコンポーネントでイベントを検出する適切な方法です。
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を使用します。たとえば、ボタンクリックではなくボタンダウンの場合は、メソッド1のIPointerDownHandler
とそのOnPointerDown
関数を使用します。
. 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); });
}
他のイベントについては、Method 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)
{
}
非UIオブジェクト:
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);
}
//Implement Other Events from Method 1
}
7。For 2D Object(Sprite Renderer/any 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);
}
//Implement Other Events from Method 1
}
UI、2Dオブジェクト(スプライトレンダラー/任意の2Dコライダー)、および3Dオブジェクト(メッシュレンダラー/任意の3Dコライダー)でクリックが検出されない:
A。EventSystemがあることを確認します。 EventSystemがなければ、クリックをまったく検出できません。お持ちでない場合は、自分で作成してください。
GameObject--->UI--->Event Systemに移動します。これにより、EventSystemがまだ存在しない場合に作成されます。既に存在する場合、Unityはそれを無視します。
B。UIコンポーネントまたはUIコンポーネントを含むGameObjectは、Canvas
の下になければなりません。これは、Canvas
がUIコンポーネントの親でなければならないことを意味します。これがないと、EventSystemは機能せず、クリックは検出されません。
これはUIオブジェクトにのみ適用されます。 does n't 2D(スプライトレンダラー/任意の2Dコライダー)または3Dオブジェクト(メッシュレンダラー/任意の3Dコライダー)に適用されます。
C。3Dオブジェクトの場合、PhysicsRaycaster
はカメラにアタッチされません。 PhysicsRaycaster
がカメラに接続されていることを確認してください。詳細については、上記の#6を参照してください。
D。これが2Dオブジェクトの場合、Physics2DRaycaster
はカメラに接続されません。 Physics2DRaycaster
がカメラに接続されていることを確認してください。詳細については、上記の#7を参照してください。
E。これがUIオブジェクトである場合、OnBeginDrag
、OnPointerClick
、OnPointerEnter
などのインターフェイス関数および#1次に検出コードを含むスクリプトをそのUIオブジェクトに添付する必要がありますクリックを検出する必要があります。
F。また、これがクリックを検出するUIオブジェクトである場合は、その前に他のUIオブジェクトがないことを確認してください。クリックを検出するUIの前に別のUIがある場合、そのクリックはブロックされます。
これが問題ではないことを確認するには、検出したいオブジェクト以外のすべてのオブジェクトをCanvasの下で無効にし、クリックが機能するかどうかを確認します。
OnMouseDownも使用できます。 OnMouseDownは、ユーザーがGUIElementまたはCollider上でマウスボタンを押したときに呼び出されます。このイベントは、ColliderまたはGUIElementのすべてのスクリプトに送信されます。
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement; // The new load level needs this
public class ExampleClass : MonoBehaviour
{
void OnMouseDown()
{
// Edit:
// Application.LoadLevel("SomeLevel");
// Application.LoadLevel() is depreciating but still works
SceneManager.LoadScene("SomeLevel"); // The new way to load levels
}
}
これらのEventTrigger
を既に持っているUI要素にEvents
コンポーネントを追加できます。特定のイベントでmethod/Function
を渡すだけです。