博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ngui 五种点击事件实现方式及在3d场景中点透的情况
阅读量:6263 次
发布时间:2019-06-22

本文共 2823 字,大约阅读时间需要 9 分钟。

http://www.unity蛮牛.com/thread-22018-1-1.html

ngui作为界面插件之一中,无疑是最好用,使用最多的了从自学unity到现在界面一直使用它

由于它的持续更新,我在此不得不说,确实很为开发者作想,为什么这么讲呢?
大概在去年吧  当时用的那个版本已经不记得了,
反正就是有个需求,要实现“无限循环”拖动,使用过以前ngui的人就知道当时是没有这个功能的,
后来被自己弄出来没几天,就发现新版本中就自带了这样的东西,
也就是如今ngui列子中的 Endless Scroll Views,
当时,记得好像还心里暗骂了“坑爹”。
好啦,可能稍微有些偏题了,现在进入正题:
ngui点击事件我在此分为5种不同写法来总结
一.OnClick
OnClick作为传统的单击事件,其实真心好用,
直接

[C#] 
纯文本查看 复制代码
using UnityEngine; using System.Collections; public class onclicktest : MonoBehaviour {
    public void OnClick()     {
        Debug.Log("你通过OnClick点击了我!");     } }

不管你是界面按钮 还是3d物体对象(需要加BoxCollider)都可用
可是,太麻烦,不好管理。
二.SendMessage
1.SendMessage是属于Ngui老版本的一种事件实现方式了,在此就简单说下了
<ignore_js_op> 

Target:接收按钮消息的游戏对象。

Function Name:接收按钮消息的方法,拥有这个方法的脚本必须绑定在上面Target对象身上。

Trigger:触发的事件。

Include Children :是否让该对象的所有子对象也发送这个点击事件。

缺点:不直观,太多拖动操作,效率略低

三.通过UIButton属性面板附加事件

首先,在代码中写你要做的事情,

 

[C#] 纯文本查看 复制代码
using UnityEngine;

 

using System.Collections;

public class ClickTest : MonoBehaviour
{
//通过UIButton属性面板附加事件,该事件方法必须加public修饰
public void btn_Click()
{
Debug.Log("你通过UIButton属性面板附加事件点击了我!");
}
}

然后,拖动绑该代码定到场景任意对象上,

 

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

如图:

此方法个人感觉是SendMessage的升级版,比以前更加直观易懂,适用于刚接触Ngui的人学习使用。

 

缺点:效率略低,不可用于3d物体 如:Cube

 

四..Event Listener(推荐)

Event Listener选择要挂载的按钮,在Unity导航菜单栏中选择Component->NGUI->Internal ->Event Listener就可以了

代码写法有2种:

 

本帖隐藏的内容

[C#] 
纯文本查看 复制代码
using UnityEngine; using System.Collections; public class EventListerrnTest : MonoBehaviour {
public Transform btn01; public Transform btn02; // Use this for initialization void Start() {
//第一种 UIEventListener.Get(btn01.gameObject).onClick = (x) => {
Debug.Log("你通过UIEventListener第一种点击了我!"); }; //第二种 UIEventListener.Get(btn02.gameObject).onClick = _btnClicked; } //实现事件方法 private void _btnClicked(GameObject _go) {
Debug.Log("你通过UIEventListener第二种点击了我!"); } }
方便统一管理,效率不错。

 

 

五.EventDelegate(推荐)

代码更加简单

方便统一管理,可以单独创建一个事件管理脚本,直接操作管理

效率不错,不需要加载拖动其他额外的东西.

 

本帖隐藏的内容

[C#] 
纯文本查看 复制代码
using UnityEngine; using System.Collections; public class EventUITest : MonoBehaviour {
public UIButton _btn; private void Awake() {
//必须为 UIButton  类型 EventDelegate.Add (this._btn.onClick, this.BtnClicked); } private void BtnClicked() {
Debug.Log("你通过EventDelegate点击了我!"); } }
代码写好后,拖动绑该代码定到场景任意对象上,同时赋对应button上去就可以了

 

 

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

若有不足,欢迎指正

 

=====================分割线================

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

本帖隐藏的内容

1.在ngui事件代码中做一个判断
如:
[C#] 
纯文本查看 复制代码
viod OnClick() {
if(UICamera.hoveredObject != null) {
... } }
代表的意思是如果鼠标下面有NGUI物体就执行 
2.通过射线来检测
[C#] 
纯文本查看 复制代码
private RaycastHit _hit=new RaycastHit();. if (UICamera.Raycast (Input.mousePosition, out _hit) == false) {
。。。 }
代表的意思是判断在UI界面层操作.

转载地址:http://hfzpa.baihongyu.com/

你可能感兴趣的文章
NFS在redhat中的一些简易应用
查看>>
mysqlbinlog查看编码问题
查看>>
进程通信(VC_Win32)
查看>>
MVP福利--利用Azure虚拟机玩Windows Server 2012
查看>>
Mac中将delete键定义为删除键
查看>>
python 函数关键参数
查看>>
ubuntu一键安装lamp
查看>>
漫谈 Clustering (1): k-means
查看>>
SQL Server 查询性能优化——索引与SARG(三)
查看>>
Oracle EBS:打开工作日历查看
查看>>
浅谈字节序(Byte Order)及其相关操作
查看>>
OSG闪存
查看>>
C#迭代器
查看>>
[Android] Change_xml.sh
查看>>
POJ-1925 Spiderman 动态规划
查看>>
实战BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer ....
查看>>
Linux编程基础——线程概述
查看>>
Hive内部表外部表转化分析
查看>>
【转】使用Xcode和Instruments调试解决iOS内存泄露
查看>>
CDE: Automatically create portable Linux applications
查看>>