本人第一篇博客,请大家多多包涵
在NGUI中,在UIROOT下的物体,只要有碰撞体那么你就可以给它用上NGUI的事件处理,只用在物体的任意一个脚本上加上以下事件函数中的一个或多个函数就可以了
void OnHover(bool isOver)//当鼠标进入某个碰撞器时触发此时isOver为true 离开某个碰撞器时触发此时isOver为false.在触摸设备上不会有作用.
{
_uilable.text = isOver ? "isOver" : "not Over";
Debug.Log(_uilable.text);
}
void OnPress(bool isDown)//当鼠标或者触摸到碰撞器此函数被调用此时isDown为true,当鼠标抬起时此函数被调用,此时isDown为false.
{ //注意:在鼠标抬起后 OnHover函数会被再调用一次
//此函数和Onclick的区别就是 在按钮上按下鼠标后,hold住并移除碰撞区松开,OnPress还是会被调用,但是Onclick不会被调用
_uilable.text = isDown ? "isPress" : "not Press";
Debug.Log(_uilable.text);
}
void OnSelect(bool selected)//有点类似于鼠标焦点,如果当前没有选中这个物体,在这个物体上按下鼠标则触发此时selected为true
//如果被选中后再点击,将不会再次触发此函数,直到失去焦点后
{
_uilable.text = selected ? "is selected" : "not selected";
Debug.Log(_uilable.text);
}
void OnClick()//和OnSelect的产生条件相同,当点击或触摸碰撞器并且没有发生拖拽时候触发.
{
_uilable.text = "On Click";
Debug.Log(_uilable.text);
}
void OnDrag(Vector2 delta)//当移动鼠标或者触摸按下时候位移超过特定阀值时触发 delta为上一帧拖动的距离.
{
_uilable.text = "On Drag";
Debug.Log("drag:" + delta.ToString());
}
void OnDrop(GameObject drag)//把物体A往物体B上拖后,物体B上的此函数被调用,而drag参数的值就是物体A
{
_uilable.text = "On Drop";
Debug.Log("drop "+ drag.name);
}
void OnInput(string text)//当一个OnSelect发生后在同一个碰撞器上触发输入.一般只有UIInput用它.
{
}
void OnTooltip(bool show)//当鼠标悬停超过tooltipDelay时间后触发该命令,show为true 鼠标离开碰撞范围后触发 show为false.触摸设备上不会有作用.
{
_uilable.text = show ? "is show" : "not show";
Debug.Log(_uilable.text);
}
怎么样是不是很方便
void OnHover(bool isOver)//当鼠标进入某个碰撞器时触发此时isOver为true 离开某个碰撞器时触发此时isOver为false.在触摸设备上不会有作用.
{
_uilable.text = isOver ? "isOver" : "not Over";
Debug.Log(_uilable.text);
}
void OnPress(bool isDown)//当鼠标或者触摸到碰撞器此函数被调用此时isDown为true,当鼠标抬起时此函数被调用,此时isDown为false.
{ //注意:在鼠标抬起后 OnHover函数会被再调用一次
//此函数和Onclick的区别就是 在按钮上按下鼠标后,hold住并移除碰撞区松开,OnPress还是会被调用,但是Onclick不会被调用
_uilable.text = isDown ? "isPress" : "not Press";
Debug.Log(_uilable.text);
}
void OnSelect(bool selected)//有点类似于鼠标焦点,如果当前没有选中这个物体,在这个物体上按下鼠标则触发此时selected为true
//如果被选中后再点击,将不会再次触发此函数,直到失去焦点后
{
_uilable.text = selected ? "is selected" : "not selected";
Debug.Log(_uilable.text);
}
void OnClick()//和OnSelect的产生条件相同,当点击或触摸碰撞器并且没有发生拖拽时候触发.
{
_uilable.text = "On Click";
Debug.Log(_uilable.text);
}
void OnDrag(Vector2 delta)//当移动鼠标或者触摸按下时候位移超过特定阀值时触发 delta为上一帧拖动的距离.
{
_uilable.text = "On Drag";
Debug.Log("drag:" + delta.ToString());
}
void OnDrop(GameObject drag)//把物体A往物体B上拖后,物体B上的此函数被调用,而drag参数的值就是物体A
{
_uilable.text = "On Drop";
Debug.Log("drop "+ drag.name);
}
void OnInput(string text)//当一个OnSelect发生后在同一个碰撞器上触发输入.一般只有UIInput用它.
{
}
void OnTooltip(bool show)//当鼠标悬停超过tooltipDelay时间后触发该命令,show为true 鼠标离开碰撞范围后触发 show为false.触摸设备上不会有作用.
{
_uilable.text = show ? "is show" : "not show";
Debug.Log(_uilable.text);
}
那么这些事件函数是在哪被调用的呢?
答案是在UICamera上,请看代码
if ((justPressed || !isPressed) && mHover != null && highlightChanged)
{
currentScheme = ControlScheme.Mouse;
if (mTooltip != null) ShowTooltip(false);
Notify(mHover, "OnHover", false);
mHover = null;
}
当然这只是UICamera上的ProcessMouse中的一小段代码,但是在这大家可以看到,NGui是通过Notify函数调用的这些事件函数,聪明的你一定想到了吧,没错Notify中使用的正是SendMessage函数
static public void Notify (GameObject go, string funcName, object obj)
{
if (mNotifying) return;
mNotifying = true;
if (NGUITools.GetActive(go))
{
go.SendMessage(funcName, obj, SendMessageOptions.DontRequireReceiver);
if (genericEventHandler != null && genericEventHandler != go)
{
genericEventHandler.SendMessage(funcName, obj, SendMessageOptions.DontRequireReceiver);
}
}
mNotifying = false;
}
好了,暂时写到这,水平有限,欢迎指正。希望能对你有所帮助,有时间再去看看NGUI是怎样判断这些事件何时该触发的