UGUI-5.5.2f1
http://blog.youkuaiyun.com/u014086857/article/details/52128762
http://www.jianshu.com/p/ae332979a022
文章部分内容引用,参考自以上链接
1,事件系统
总结:事件系统所有的操作都是为鼠标与键盘 而存在。在这里鼠标的作用更像是摄像机,而Canvas下的物体可选择性的接受摄像机射线,并且相互之间可以遮挡。
1,一个场景中只能有一个EventSystem组件
2,3个主要的类EventSystem、StandaloneInputModule、TouchInputModule,后面两个组件都继承自BaseInputModule
3,BaseInputModule是一个基类模块,负责发送输入事件(点击、拖拽、选中等)到具体对象。EventSystem下的所有输入模块都必须继承自BaseInputModule组件。
4,BaseRaycaster也是一个基类,前面说的输入模块要检测到鼠标事件必须有射线投射组件才能确定目标对象。系统实现的射线投射类组件有PhysicsRaycaster, Physics2DRaycaster, GraphicRaycaster。这个模块也是可以自己继承BaseRaycaster实现个性化定制。
总的来说,EventSystem负责管理,BaseInputModule负责输入,BaseRaycaster负责确定目标对象,目标对象负责接收事件并处理,然后一个完整的事件系统就有了。
5,射线检测,肯定是从摄像机发起的,那么BaseRaycaster模块也一定和摄像机关系一定不简单。对于UI模块,在Canvas对象下我们可以看到GraphicRaycaster组件。如果Canvas的渲染模式是SceenSpace-Overlay,那么我们是看不到Camera组件的。所以应该是GraphicRaycaster会对UI不同的渲染模式做特殊处理。
非UI中:就需要自己在摄像机上绑定并且检测对象上要有Collider
6,屏幕的大小就是Canvas的大小,摄像机发出射线,Canvas接收。
public void OnEnable(){}//未知:active为真时,调用,一开始为真则一开始就调用一次。
IdropHandler在有Drag时,并且在改Drop物件区域内放置时触发。
IBeginDragHandler, IDragHandler, IendDragHandler:开始和结束都只调用一次,OnDrag()则是在运动时才调用。
最终效果:拖拽一张图片到另一张图片上,完成图片替换。
1,使用事件系统触发相应的操作,其中如果为非UI物体,则相应的要在摄像机上加上相应的射线检测组件。
代码如下:(代码比较随意)被拖拽的物体:
using UnityEngine.EventSystems;
using UnityEngine.UI;
这几个接口上面有
public class MyEventSys_Drag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
GameObject tmpObj;
public void OnBeginDrag(PointerEventData data)
{
Transform cv = GameObject.Find("Canvas").transform;
if (cv == null)
print("cv is null");
tmpObj = GameObject.Instantiate(gameObject);
tmpObj.name = "tmpImage";
tmpObj.transform.SetParent(cv);
这个GanvasGroup可使图片不遮挡鼠标事件
CanvasGroup cvG = tmpObj.AddComponent<CanvasGroup>();
cvG.blocksRaycasts = false;
}
public void OnDrag(PointerEventData data)
{
print("drag");
tmpObj.transform.position = data.position;
}
public void OnEndDrag(PointerEventData data)
{
print("drag end");
GameObject.Destroy(tmpObj);
}
}
接收的物体:
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class MyEventSys_Drop : MonoBehaviour, IDropHandler, IPointerEnterHandler, IPointerExitHandler
{
Image m_pSprit;
void Start() {
m_pSprit = transform.GetComponent<Image>();
}
public void OnPointerEnter(PointerEventData data)
{
print("point enter");
m_pSprit.color = Color.red;
}
public void OnPointerExit(PointerEventData data)
{
print("point exit");
m_pSprit.color = Color.white;
}
public void OnDrop(PointerEventData data)
{
print("drop");
if (data.pointerDrag == null)
print("pointerDrag is null");
m_pSprit.sprite = data.pointerDrag.GetComponent<Image>().sprite;
}
下了官网的一些例子,看到了就记一下:
1,Button按钮播放动画,只需要附加动画名字就行,非常方便。
2,如果碰到需要相应事件的情况,应该第一反应使用事件系统。
如:
public class EventClick : MonoBehaviour ,IPointerClickHandler
{
public System.Action<int> MyClick;
public int m_iClickValue;
void Start() {
MyClick = (int i) => { print("click ,value is "+i); };
}
public void OnPointerClick(PointerEventData eventData) {
if (MyClick != null)
MyClick(m_iClickValue);
}
}