using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class Test : MonoBehaviour {
public XEventTriggerListener trigger;
private Vector3 screenPoint;
private Vector3 offset;
// Use this for initialization
void Start()
{
trigger.onBeginDragHandler.AddListener((eventData) =>
{
//Debug.Log("onBeginDragHandler");
screenPoint = Camera.main.WorldToScreenPoint(transform.position);
offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, screenPoint.z));
});
trigger.onDragHandler.AddListener((eventData) =>
{
Vector3 curScreenPoint = new Vector3(eventData.position.x, eventData.position.y, screenPoint.z);
Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
transform.position = curPosition;
});
trigger.onEndDragHandler.AddListener((eventData) =>
{
//Debug.Log("onEndDragHandler");
});
trigger.onPointerClickHandler.AddListener((eventData) =>
{
//Debug.Log("onPointerClickHandler");
});
}
// Update is called once per frame
private RaycastHit raycastHit;
private Ray customRay;
void Update()
{
if (Input.GetMouseButtonDown(0) || (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began))
{
\#if IPHONE || ANDROID
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
\#else
if (EventSystem.current.IsPointerOverGameObject() && EventSystem.current.currentSelectedGameObject != null)
\#endif
{
Debug.Log(EventSystem.current.currentSelectedGameObject);
}
else
{
//从摄像机发出一条射线,到点击的坐标
customRay = Camera.main.ScreenPointToRay(Input.mousePosition);
//显示一条射线,只有在scene视图中才能看到
Debug.DrawLine(customRay.origin, raycastHit.point, Color.red, 2);
//if (Physics.Raycast()
if (Physics.Raycast(customRay, out raycastHit, 1000, LayerMask.GetMask("3d")))
{
if (raycastHit.collider.gameObject != null)
{
Debug.Log("Click Object:" + raycastHit.collider);
}
}
else
{
Debug.Log("Click Null");
}
}
}
}
}
···c#
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class XEventTriggerListener : EventTrigger
{
public XPointerEvent onBeginDragHandler = new XPointerEvent();
public XPointerEvent onDragHandler = new XPointerEvent();
public XPointerEvent onEndDragHandler = new XPointerEvent();
public XPointerEvent onInitializePotentialDragHandler = new XPointerEvent();
public XPointerEvent onPointerClickHandler = new XPointerEvent();
public XPointerEvent onPointerDownHandler = new XPointerEvent();
public XPointerEvent onPointerEnterHandler = new XPointerEvent();
public XPointerEvent onPointerExitHandler = new XPointerEvent();
public XPointerEvent onPointerUpHandler = new XPointerEvent();
public override void OnBeginDrag(PointerEventData eventData)
{
//Debug.Log("OnBeginDrag ");
onBeginDragHandler.Invoke(eventData);
}
public override void OnDrag(PointerEventData eventData)
{
//Debug.Log("OnDrag ");
onDragHandler.Invoke(eventData);
}
public override void OnEndDrag(PointerEventData eventData)
{
//Debug.Log("OnEndDrag ");
onEndDragHandler.Invoke(eventData);
}
public override void OnInitializePotentialDrag(PointerEventData eventData)
{
//Debug.Log("OnInitializePotentialDrag ");
onInitializePotentialDragHandler.Invoke(eventData);
}
public override void OnPointerClick(PointerEventData eventData)
{
//Debug.Log("OnPointerClick ");
onPointerClickHandler.Invoke(eventData);
}
public override void OnPointerDown(PointerEventData eventData)
{
//Debug.Log("OnPointerDown ");
onPointerDownHandler.Invoke(eventData);
}
public override void OnPointerEnter(PointerEventData eventData)
{
//Debug.Log("OnPointerEnter ");
onPointerEnterHandler.Invoke(eventData);
}
public override void OnPointerExit(PointerEventData eventData)
{
//Debug.Log("OnPointerExit ");
onPointerExitHandler.Invoke(eventData);
}
public override void OnPointerUp(PointerEventData eventData)
{
//Debug.Log("OnPointerUp ");
onPointerUpHandler.Invoke(eventData);
}
[System.Serializable]
public class XPointerEvent : UnityEvent<PointerEventData>
{ }
}
“`