下述内容不对c#语法做过多讲解,仅对已入门并有兴趣的同学做为学习和拓展的资料

大家在Unity制作的过程中一定都使用过UI功能,那么很多人也一定见过这个面板:

那么我们如何能在自己的脚本中添加上像OnClick这样的面板呢。

UnityEvent
Unity中内置了一个UnityEvent类作为事件处理的类,我们只要在脚本中声明出来,Unity便会自动添加到脚本面板上,这样便可以在脚本之外添加移除事件,非常方便。

脚本代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;//需要引用命名空间

public class SelfScript : MonoBehaviour {

public UnityEvent OnStartEvent;//声明公有变量
// Use this for initialization
void Start () {
OnStartEvent.Invoke();//执行添加的事件
}
/// <summary>
/// 要执行的事件
/// </summary>
public void OnStart()
{
print("-----OnStart Log");
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
脚本写好后挂载到物体上,设置好执行的事件,运行查看结果

事件传参
如果需要向方法内传入参数的话,直接写出来即可

public void OnStart(string str)
{
print("-----OnStart Log" + str);
}
1
2
3
4

结果:

其他任何类型的参数都可以这样传入,同样也可以传入Transform,Gameobject这样的对象。
这样的事件是不支持多参数的,最多只能传入一个参数。

多参数传入
事实上UnityEvent是支持多参数传入的,只不过必须通过脚本实现,一般情况下只会在制作一些易用的插件工具时会用到,
我用EasyTouch中的QuickSwipe来举例

在事件声明的地方有这样一段代码

[System.Serializable]
public class OnSwipeAction : UnityEvent<Gesture>{}

[SerializeField]
public OnSwipeAction onSwipeAction;

1
2
3
4
5
6
7
通过API可知泛型UnityEvent是一个抽象类,所以想要实现只能通过类继承的方式来实现并声明泛型事件
此脚本只传入了一个参数,我们可以通过泛型来写入多个参数:

[System.Serializable]//想显示在面板上必须序列化该类
public class ValueEvent : UnityEvent<int,string,GameObject,SelfScript> { }//泛型中写入参数类型
public ValueEvent eventByValue;
void Start () {
eventByValue.Invoke(5, " value ", gameObject, this);
}
public void OnValue(int i,string str,GameObject obj,SelfScript script)
{

Debug.Log( string.Format( "-----OnValue: int:{0}, string: {1}, ObjName: {2}, script.gameobject.name: {3}",i,str,obj.name,script.gameObject.name));
}
1
2
3
4
5
6
7
8
9
10
11
12
UnityEvent最多支持4个不同类型参数的传入。

运行:

下面放出完整代码,需要的同学可直接复制:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;//需要引用命名空间

public class SelfScript : MonoBehaviour {

public UnityEvent OnStartEvent;//声明公有变量

[System.Serializable]//想显示在面板上必须序列化该类
public class ValueEvent : UnityEvent<int,string,GameObject,SelfScript> { }
//[SerializeField]
public ValueEvent eventByValue;
// Use this for initialization
void Start () {
OnStartEvent.Invoke();//执行添加的事件
eventByValue.Invoke(5, " value ", gameObject, this);
}
/// <summary>
/// 要执行的事件
/// </summary>
public void OnStart(string str)
{
print("-----OnStart Log" + str);
}
public void OnValue(int i,string str,GameObject obj,SelfScript script)
{

print( string.Format( "-----OnValue: int:{0}, string: {1}, ObjName: {2}, script.gameobject.name: {3} ",i,str,obj.name,script.gameObject.name));
}
}

---------------------

Unity3D 在自定义脚本中实现Button组件上的OnClick面板的更多相关文章

  1. 在Struts2中使用Uploadify组件上传文件

    Uploadify是一个基于Jquery的文件上传组件,官网http://www.uploadify.com/可以在官网获得该组件,运行演示示例,下载帮助文档.     作为Web前端的增强技术,Jq ...

  2. VUE -- iview table 组件 中使用 upload组件 上传组件 on render 事件不会触发问题

    碰到的问题是: upload 组件在 on中写的监听事件不会被触发 在 props 中来监听:==>

  3. 关于Unity中UI中的Button节点以及它的Button组件

    Button是最常用的UI节点,包含的组件有 1.Image组件 显示Button的纹理,把Image贴图拖进Image组件中后,记得点击Set Native Size,显示贴图原始大小 2.Butt ...

  4. Unity脚本中各函数成员的生命周期

    在学习Unity时,掌握如何编写脚本是必须掌握的一项基本技能.但是关于Unity的游戏脚本中各函数的生命周期是怎样开始和结束的,它们的执行顺序是如何安排的?这一点我们要清楚的了解. 我们知道Unity ...

  5. Delphi for iOS开发指南(8):在iOS应用程序中使用Tab组件来显示分页

    Delphi for iOS开发指南(8):在iOS应用程序中使用Tab组件来显示分页 在FireMonkey iOS应用程序中的Tab Tab由FMX.TabControl.TTabControl定 ...

  6. xmake从入门到精通12:通过自定义脚本实现更灵活地配置

    xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验. 本文主要详细讲解下,如何通过添加自定义的脚本,在脚 ...

  7. 关于bat脚本中的命令状态码相关的%errorlevel%变量

    bat脚本中常用%errorlevel%表达上一条命令的返回值,即命令执行状态码.也称命令退出码 一般上一条命令的执行结果返回的值只有两种,0和非0 (如常见的1,2,4,5,9009等等),0一般会 ...

  8. JQuery中bind和unbind函数与onclick绑定事件区分

    JQuery中bind和unbind函数转载:   https://blog.csdn.net/liucheng417/article/details/51131982 页面代码: <body& ...

  9. vue 学习六 在组件上使用v-model

    其实这个部分应该是属于component,为什么把这玩意单独拿出来呢,原因是它这个东西比较涉及到了vue的事件,以及v-model指令的使用,还是比较综合的.所以就拿出来啦 父组件 <templ ...

随机推荐

  1. iOS 编程之使用Precompile Prefix Header

    一:为什么Xcode6没有自动创建Precompile Prefix Header 我们在写项目的时候,大部分宏定义,头文件导入都在Precompile Prefix Header文件里面.在Xcod ...

  2. Educational Codeforces Round 23

    A题 分析:注意两个点之间的倍数差,若为偶数则为YES,否则为NO #include "iostream" #include "cstdio" #include ...

  3. MYSQL数据库学习----查询

    查询语句是MYSQL数据库中用到的最多的语句. 查询语句分为几种 单表查询 集合函数查询 连接查询 子查询 合并查询 正则表达式查询 一:单表查询 SELECT 属性 FROM 表名 [WHERE 查 ...

  4. MySql数据库知识点

    关系型数据库管理系统简介 为什么使用数据库 1.降低存储数据的冗余度 2.更高的数据一致性 3.存储的数据可以共享 4.可以建立数据库所遵循的标准 5.便于维护数据完整性 6.能够实现数据的安全性 数 ...

  5. hibernate的基础学习--多对多关联

    多对多采用学生老师模型进行测试 学生配置文件: <?xml version="1.0" encoding="utf-8" ?> <!DOCTY ...

  6. python 模块和包的使用方法

    一.模块 1.import导入模块 import module1,mudule2... 2.from...import...导入模块 导入指定内容 from modname import name1[ ...

  7. tcpdump笔记

    最好的学习: man tcpdump ....... 一.TCPdump抓包命令  tcpdump是一个用于截取网络分组,并输出分组内容的工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为类 ...

  8. Cloudera Manager架构原理

    cloudera manager的核心是管理服务器,该服务器承载管理控制台的Web服务器和应用程序逻辑,并负责安装软件,配置,启动和停止服务,以及管理上的服务运行群集. Cloudera Manage ...

  9. 51Nod 1095 Anigram单词

    熟练使用map即可,不然用vector会超时 #include <iostream> #include <cstring> #include <string> #i ...

  10. macos php安装扩展sqlsrv连接sqlserver

    Install the PHP Drivers for SQL Serve sudo pecl install pdo_sqlsrv   sudo pecl install sqlsrv 微软官方文档 ...