在unity4.6之前使用UnityEvent

??

孙广东:2015-3-8/18:43  转载请注明出处:http://blog.csdn.net/u010019717

更全的内容请看我的游戏蛮牛地址:http://www.unitymanual.com/space-uid-18602.html

在unity4.6之后多了个这个东东

当然应该在UI中有应用了那么还有其他别的用处么?

我们来看看官方蛮牛对UnityEvents的介绍:
UnityEvents 是允许用户从编辑时驱动回调的方式来保存,运行时无需额外的编程和脚本配置。
UnityEvents 在很多事情上很有用:
?内容驱动的回调Content driven callbacks
?解耦系统Decoupling systems
?持续回调Persistent callbacks
?预配置的调用事件Preconfigured call events

UnityEvents 可以添加到任何的MonoBehaviour类中和被执行。

他类似.net标准的delegate委托,怎么知道的呢?1、看源代码呀,2、按如下图搜索:

点击进入:

                      

当UnityEvent添加到MonoBehaviour上,它出现在检查器,可以添加持续回调。

使用 UnityEvents
要配置一个回调在编辑器中有几个步骤:
1.请确保您的脚本导入/使用using UnityEngine.Events.
2.选择 + 图标以添加一个回调方法的槽
3.选择UnityEngine.Object您希望接收的回调 (您可以使用为这个对象选择器)
4.选择您希望调用的函数
5.您可以添加更多关于一个事件的回调

在Inspector 检查器中配置的UnityEvent时有两种类型的受支持的函数调用:
?Static静态。静态调用是预配置的调用,在 UI 中设置的预配置值。这意味着当调用回调时,使用已输入到 UI 的参数调用目标函数。
?Dynamic动态。使用代码,从发送的参数来调用动态调用,这绑定到 UnityEvent 正在调用的类型。UI 筛选回调,并只显示有效的 UnityEvent 的动态调用。

泛型 UnityEvents
默认情况下在Monobehaviour的UnityEvent将动态地绑定到 void 函数。这不必是这种情况的 UnityEvents 的动态调用支持绑定到带有达 4 参数的函数。要做到这一点,您需要定义一个自定义的UnityEvent类,支持多个参数。

这是很容易做到:

[Serializable]
public class StringEvent : UnityEvent <string> {}

这个实例添加到您的类中,而不是base UnityEvent ,它将允许回调来将动态绑定到字符串函数。这然后可以通过调用Invoke()函数使用一个string作为参数调用。

UnityEvents 可以用达 4 参数在其泛型定义中定义。

例子:


1、UnityEngine.Events Classes
UnityEventBase  类:
Namespace: UnityEngine.Events
描述:UnityEvents 的抽象基类。
此类为 UnityEvents 提供的基本功能。
UnityEvent  类:
Namespace: UnityEngine.Events/Inherits from: Events.UnityEventBase
描述:零参数持续回调可以被现场保存。
例子:

using UnityEngine;
using System.Collections;
using UnityEngine.Events;
public class Event0 : MonoBehaviour {
	public UnityEvent m_MyEvent;    // 注意这个一定要是public才能应用在Inspector上通过+-号操作
	// Use this for initialization
	void Start () {
		if (m_MyEvent == null)
			m_MyEvent = new UnityEvent ();

		m_MyEvent.AddListener (Ping);
	}

	// Update is called once per frame
	void Update () {
		if (Input.anyKeyDown && m_MyEvent != null)
		{
			m_MyEvent.Invoke ();
		}
	}
	public void Ping ()
	{
		Debug.Log ("Ping");
	}
}

UnityEvent<T0> 类:
Namespace: UnityEngine.Events/Inherits from: Events.UnityEventBase
描述:一个参数的 UnityEvent 版本。
如果您想要使用泛型的 UnityEvent 类型,您必须重写的类类型。
例子:

using UnityEngine;
using System.Collections;
using UnityEngine.Events;

public class MyIntEvent : UnityEvent<int> {}
public class Event1 : MonoBehaviour {

	public MyIntEvent m_MyEvent;
	// Use this for initialization
	void Start () {
		if (m_MyEvent == null)
			m_MyEvent = new MyIntEvent ();

		m_MyEvent.AddListener (Ping);
	}

	// Update is called once per frame
	void Update () {
		if (Input.anyKeyDown && m_MyEvent != null)
		{
			m_MyEvent.Invoke (5);
		}
	}
	void Ping ( int i)
	{
		Debug.Log ("Ping" + i);
	}
}

UnityEvent<T0,T1> 类 :
Namespace: UnityEngine.Events/Inherits from: Events.UnityEventBase
描述:两个参数的 UnityEvent 版本。
如果您想要使用泛型的 UnityEvent 类型,您必须重写的类类型。
例子:

using UnityEngine;
using System.Collections;
using UnityEngine.Events;

public class My2ArgEvent : UnityEvent<int, int> {}
public class Event2 : MonoBehaviour {
	public My2ArgEvent m_MyEvent;
	// Use this for initialization
	void Start () {
		if (m_MyEvent == null)
			m_MyEvent = new My2ArgEvent ();

		m_MyEvent.AddListener (Ping);
	}

	// Update is called once per frame
	void Update () {
		if (Input.anyKeyDown && m_MyEvent != null)
		{
			m_MyEvent.Invoke (5, 6);
		}
	}
	void Ping (int i0, int i1)
	{
		Debug.Log (i0 + i1);
	}
}

UnityEvent<T0,T1,T2> 类:
Namespace: UnityEngine.Events/Inherits from: Events.UnityEventBase
描述:3 个参数的 UnityEvent 版本。
如果您想要使用泛型的 UnityEvent 类型,您必须重写的类类型。
例子:

using UnityEngine;
using System.Collections;
using UnityEngine.Events;

public class My3ArgEvent : UnityEvent<int, int, int> {}
public class Event3 : MonoBehaviour
{
	public My3ArgEvent m_MyEvent;
	// Use this for initialization
	void Start () {
		if (m_MyEvent == null)
			m_MyEvent = new My3ArgEvent ();

		m_MyEvent.AddListener (Ping);
	}

	// Update is called once per frame
	void Update () {
		if (Input.anyKeyDown && m_MyEvent != null)
		{
			m_MyEvent.Invoke (5, 6, 7);
		}
	}
	void Ping (int i0,int i1,int i2)
	{
		Debug.Log (i0 + i1 + i2);
	}
}

UnityEvent<T0,T1,T2,T3> 类:
Namespace: UnityEngine.Events/Inherits from: Events.UnityEventBase
描述:4 个参数的 UnityEvent 版本。
如果您想要使用泛型的 UnityEvent 类型,您必须重写的类类型。
例子:

using System.Collections;
using UnityEngine.Events;

public class My4ArgEvent : UnityEvent<int, int, int, int> {}
public class Event4 : MonoBehaviour
{
	public My4ArgEvent m_MyEvent;
	// Use this for initialization
	void Start () {
		if (m_MyEvent == null)
			m_MyEvent = new My4ArgEvent ();

		m_MyEvent.AddListener (Ping);
	}

	// Update is called once per frame
	void Update () {
		if (Input.anyKeyDown && m_MyEvent != null)
		{
			m_MyEvent.Invoke (5, 6, 7, -5);
		}
	}
	void Ping (int i0,int i1,int i2,int i3)
	{
		Debug.Log (i0 + i1 + i2 + i3);
	}
}

2 Uni tyEngine.Events Enumerations
PersistentListenerMode
描述:侦听器的运作模式。
UnityEventCallState
描述:控制 UnityEvent 回调的范围。

知道了它的用法,那么回到标题吧,基本上现在的项目都还是在使用NGUI所以不会使用unity4.6版本。

但是又不想错过unity原生的好东西。 怎么办?那就得到源代码吧。

本人测试后是没有问题的!

下载地址如下:http://download.csdn.net/detail/u010019717/8483193

时间: 2024-12-13 08:39:26

在unity4.6之前使用UnityEvent的相关文章

(二十六)unity4.6学习Ugui中文文档-------UGUI的开源Tween工具轻量而强大

出处:http://blog.csdn.net/u010019717 很多Unity开发者对NGUI很了解,而且发展的真的很完善,从以前的SendMassage 升级到更高效的 事件系统,包括很好的Tween相关,还有很多周边工具. 但是随着Unity4.6.5.0的推出,unity更原生专业高效的UGUI问世, 虽然从完善上没有NGUI完善,但是必将是以后的发展方向. 而且现在NGUI在U5中无法运行. UGUI还没有自带Tween相关,官方的案例都是使用Animation这个确实不推荐.  

Unity4.6中修改RectTransform的宽度和高度

Unity4.6新的UI相对于NGUI是有点功能不完善,但是插件毕竟和原生的没得比,所以花了点时间学习心得UI系统,结果碰到了如题所述的问题 我想做一个ScrollView,使用Unity4.6的新UI 第一步:创建一个Canvas,之后在canvas下创建child子物体Scroll View,要注意创建的子物体要带有RectTransform这个属性之后在新建的空物体下再创建子物体Items 第二步:添加脚本,选中Scroll View,添加Mask组件和Scroll Rect组件,然后将I

Unity4.3 遮挡剔除:基本知识

http://blogs.unity3d.com/2013/12/02/occlusion-culling-in-unity-4-3-the-basics/ 这篇博文由Umbra Software的Jasin Bushnaief所写,旨在解释Unity4.3遮挡剔除的更新. Unity4.3包含了大量的改进.全新的子系统之一包括遮挡剔除.不但简化了界面,剔除运行本身也改写了,还添加了一些列的新功能. 在这个系列的三篇博文里,我将介绍Unity4.3的新遮挡剔除系统的使用方法.第一篇讲完成遮挡剔除

构建ASP.NET MVC5+EF6+EasyUI 1.5+Unity4.x注入的后台管理系统(1)-前言与目录(持续更新中...)

前言: 起初写这个框架的时候,可以说在当时来说并不是很流行的设计模式,那是在2012年,面向对象的编程大家都很熟悉, 但是“注入.控制反转(DI,IOC,依赖注入).AOP切面编程”新兴名词 很多人并不知道特别是从事.NET开发的人,至少在当时 是这么样的,但是在今天它们却是非常流行的技术指标,很多大牛也承认,这是主流的开发模式,你们可以从招聘网的技术岗位看出. 我从事过MVC2.0到5.0的相关开发工作,见证了MVC的成熟演变过程,就像本框架一样,设计模式未曾改变,但是代码一直在重 构.我也坚

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(51)-系统升级

系统很久没有更新内容了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+EF6+Unity4.x+Quartz 2.3 +easyui 1.4.3. 并以easyui 1.4.3的gray皮肤为基础,升级10个扁平化皮肤 皮肤查看地址 更新的主要目的:新的MVC5特性和更好的性能 记录一下升级过程. 1.除了web层,其他全部提取. 2.新建解决方案.以前命名空间为App.现在更名为Apps. 3.

做好Unity4.x开发项目规划

1. 是否要用lua 2. (对于需操作的游戏)客户端游戏如何做战斗验证 下面列举小坑吧.不建议都绕开,毕竟没有那么多时间做前期调研的. 对应版本Unity4.x 1. 客户端程序层面 总的来说C#超级给力的,不过别玩脱了 1) mono虚拟机gc Unity的mono虚拟机使用不分代的gc算法,临时对象积攒起来,导致重量级GC游戏频繁卡顿. Unity官方:认真review每帧20B以上,以及一次2K以上的GC Alloc的行为.传闻:Unity5会改进. 推荐阅读:Gamasutra: We

Unity4.6 UGUI 图片打包设置(小图打包成图集 SpritePacker)

在学习UGUI的过程中,一直使用小图也就是散图,一个按钮一个图片,一个图标一个图片,这样每一个图片都有一个Drawcall. 之前公司的游戏都是使用Unity4.3+NGUI,在NGUI中可以使用Texturepacker,先把小图片打包成一张大图,然后在NGUI中设置引用大图中的哪一块作为图片,这样能减少很多Drawcall. 但是在UGUI中没有办法使用Texturepacker了,也迷糊了几天. 之后一直在百度谷歌寻找,才发现原来Unity4.6中自带了图集打包工具SpritePacker

unity4.6 Beta版 UI控件之Button

最近需求,需要用到4.6版本uGui了,所以抽时间来学习学习,就UI控件在Unity工具里创建预设这块来说相比较于NGUI,我觉得是没有什么太大的区别的. 比如:Canvas--Camera . Text--Label.ImageMask-- Panel 等. 可能是目前4.6版本还不稳定,其UI控件下所挂载的组件脚本代码我们是没法直接点击脚本看到更别说在代码里直接调出修改了,这点就目前来说确实没有NGUI方便. 好了"方不方便"恐怕并不能直接影响每次unity版本的更新带给我们的惊喜

[Unity3D]Unity4新的动画系统Mecanim

Unity4.X中添加的新的动画系统取代了原来3.X的旧的动画系统,新动画系统Mecanim也是官方推荐的,使得我们写较少的代码来实现连续的动画效果. 效果图 Unity3.X中动画系统播放动画 使用播放play()或淡入淡出播放CrossFade() 例如: animation.Play("name"); animation.CrossFade("name"); 也可以做成队列动画,然后播放,例如: animation.PlayQueued("name&