ngui作为unity界面插件之一中,无疑是最好用,现在就来说下ngui 点击事件场景的五个实现的方法,使用最多的了从自学unity到现在界面一直使用它由于它的持续更新,我在此不得不说,确实很为开发者作想,为什么这么讲呢?

大概在去年吧  当时用的那个版本已经不记得了,反正就是有个需求,要实现“无限循环”拖动,使用过以前ngui的人就知道当时是没有这个功能的,后来被自己弄出来没几天,就发现新版本中就自带了这样的东西,也就是如今ngui列子中的 Endless Scroll Views,当时,记得好像还心里暗骂了“坑爹”。


好啦,可能稍微有些偏题了,现在进入正题:
ngui点击事件我在此分为5种不同写法来总结

一.OnClick

OnClick作为传统的单击事件,其实真心好用、直接

  1. using UnityEngine;

  2. using System.Collections;

  3. public class onclicktest : MonoBehaviour {

  4.     public void OnClick()

  5.     {

  6.         Debug.Log("你通过OnClick点击了我!");

  7.     }

  8. }

不管你是界面按钮 还是3d物体对象(需要加BoxCollider)都可用
可是,太麻烦,不好管理。

二.SendMessage
1.SendMessage是属于Ngui老版本的一种事件实现方式了,在此就简单说下了


Target:接收按钮消息的游戏对象。
Function Name:接收按钮消息的方法,拥有这个方法的脚本必须绑定在上面Target对象身上。
Trigger:触发的事件。
Include Children :是否让该对象的所有子对象也发送这个点击事件。
缺点:不直观,太多拖动操作,效率略低

三.通过UIButton属性面板附加事件
首先,在代码中写你要做的事情,
如:

  1. using UnityEngine;
  2. using System.Collections;



  3. public class ClickTest : MonoBehaviour 

  4. {

  5. //通过UIButton属性面板附加事件,该事件方法必须加public修饰

  6. public void btn_Click()

  7. {

  8. Debug.Log("你通过UIButton属性面板附加事件点击了我!");

  9. }

  10. }
然后,拖动绑该代码定到场景任意对象上
最后,选择你要点击的按钮,把刚才绑定代码的对象拖到,UIButton属性中的On Click中的Notify上,接着在Method中选择刚写的脚本里的方法就可以了

如图:

此方法个人感觉是SendMessage的升级版,比以前更加直观易懂,适用于刚接触Ngui的人学习使用。
缺点:效率略低,不可用于3d物体 如:Cube

四..Event Listener(推荐)
Event Listener选择要挂载的按钮,在Unity导航菜单栏中选择Component->NGUI->Internal ->Event Listener就可以了
代码写法有2种:

  1. using UnityEngine;

  2. using System.Collections;

  3. public class EventListerrnTest : MonoBehaviour {

  4. public Transform btn01;

  5. public Transform btn02;



  6. // Use this for initialization

  7. void Start()

  8. {

  9. //第一种

  10. UIEventListener.Get(btn01.gameObject).onClick = (x) =>

  11. {

  12. Debug.Log("你通过UIEventListener第一种点击了我!");

  13. };



  14. //第二种

  15. UIEventListener.Get(btn02.gameObject).onClick = _btnClicked;

  16. }

  17. //实现事件方法

  18. private void _btnClicked(GameObject _go)

  19. {

  20. Debug.Log("你通过UIEventListener第二种点击了我!");

  21. }

  22. }

五.EventDelegate(推荐)
代码更加简单
方便统一管理,可以单独创建一个事件管理脚本,直接操作管理
效率不错,不需要加载拖动其他额外的东西.

  1. using UnityEngine;

  2. using System.Collections;

  3. public class EventUITest : MonoBehaviour {



  4. public UIButton _btn; 



  5. private void Awake()

  6. {

  7. //必须为 UIButton  类型

  8. EventDelegate.Add (this._btn.onClick, this.BtnClicked);

  9. }



  10. private void BtnClicked()

  11. {

  12. Debug.Log("你通过EventDelegate点击了我!");

  13. }



  14. }


好啦,ngui五种点击事件处理方式总结到此结束,至于怎么用,那么大家自己取舍咯
若有不足,欢迎指正

=====================分割线================
另附加: 解决ngui在3d场景中 点透的情况
大家做游戏可能遇到 点击地面玩家行走,可是点击界面按钮的时候,事件触发不了,或者同时执行了玩家点地行走事件,
这些都属于点透的情况。
目前据自己经验有2种解决方案

1.在ngui事件代码中做一个判断
如:

  1. viod OnClick()

  2. {

  3. if(UICamera.hoveredObject != null)

  4. {

  5. ...

  6. }

  7. }

代表的意思是如果鼠标下面有NGUI物体就执行 

2.通过射线来检测

  1. private RaycastHit _hit=new RaycastHit();.

  2. if (UICamera.Raycast (Input.mousePosition, out _hit) == false) 

  3. {

  4. 。。。


代表的意思是判断在UI界面层操作.