zoukankan      html  css  js  c++  java
  • Ngui 五种点击事件实现方式及在3d场景中点透的情况

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

    ngui作为unity界面插件之一中,无疑是最好用,使用最多的了从自学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界面层操作.
  • 相关阅读:
    ADO.NET 根据实体类自动生成添加修改语句仅限Oracle使用
    C# 实体对象作为参数统一去除空格
    jQuery 前端复选框 全选 反选 下拉菜单联动
    C# 后台服务器端 Get 请求函数封装
    服务器404错误页面
    vue 封装公用函数
    Vue 生命周期
    Oracle 查看表结构
    ubuntu源配置
    外观(Facade)模式
  • 原文地址:https://www.cnblogs.com/123ing/p/4118042.html
Copyright © 2011-2022 走看看