在Inspector 中 设置添加回调函数 - Unity3d编辑器扩展

在做一些开场动画或者其它指定事件触发 一类功能时,需要在编辑环境下设置添加回调函数。

一开始尝试直接使用delegate 来编写,测试发现没有效果,在谷歌搜索到Unity论坛有人提到 delegate 不能被序列化到Inspector 中使用,建议使用 UnityEvent 。

UnityEvent ,其实在UGUI中经常用到,只是平时不知道是它。

比如按钮的点击事件就是

直接从 UGUI Button 的源代码中搬运出来。

先提供一个带有 UnityEvent 的类

TimeEventPlugin.cs

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

public class TimeEventPlugin : MonoBehaviour
{
    [SerializeField]
	public float m_DelayTime;

	[SerializeField]
	public TimeEventTrigger m_TimeEventTrigger=new TimeEventTrigger();

    private float delayTime;

    void Start()
    {
        delayTime = m_DelayTime;

		Debug.Log("TimeEventTrigger ID="+m_TimeEventTrigger.ID);
    }

    void Update()
    {

        delayTime -= Time.deltaTime;
		if (delayTime <= 0)
        {
            delayTime = m_DelayTime;
			m_TimeEventTrigger.m_TimeEvent.Invoke();
        }
    }

}

[Serializable]
public class TimeEventTrigger
{
	public int ID;

	[Serializable]
	public class  TimeEvent:UnityEvent{}

	[SerializeField]
	public TimeEvent m_TimeEvent=new TimeEvent();
}

然后编写它 对应的 Editor 类 TimeEventPluginEditor,放在 Editor 目录

using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(TimeEventPlugin))]
public class TimeEventPluginEditor : Editor
{
	SerializedProperty m_serializedTimeEventTrigger;

    SerializedProperty m_serializedTimeEvent;

	TimeEventTrigger m_TimeEventTrigger;

	void OnEnable()
	{
		m_serializedTimeEventTrigger = serializedObject.FindProperty("m_TimeEventTrigger");
	}

	public override void OnInspectorGUI ()
	{
		serializedObject.Update();

		TimeEventPlugin plug = target as TimeEventPlugin;
		plug.m_DelayTime=EditorGUILayout.FloatField("m_DelayTime", plug.m_DelayTime);

		EditorGUILayout.PropertyField(m_serializedTimeEventTrigger,true);

		serializedObject.ApplyModifiedProperties();
	}
}

最后编写一个常规脚本 Test.cs,提供一个回调函数注册到 TimeEventPlugin 中

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

	// Use this for initialization
	void Start ()
    {
	}

    public void TimeEnd()
    {
        Debug.Log("TimeEnd");
    }

	// Update is called once per frame
	void Update () {

	}
}

最后在编辑器中的效果如下呈现:

例子下载:

http://pan.baidu.com/s/1bnjmKdL

版权声明:本文转自http://blog.csdn.net/huutu 转载请带上 http://www.thisisgame.com.cn

时间: 2024-12-20 20:43:33

在Inspector 中 设置添加回调函数 - Unity3d编辑器扩展的相关文章

百度地图 在加载过程中,根据回调函数结果中第一个点设置为中心点

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.4"></script&g

AngularJS自定义标签添加回调函数eval()

function helloworld(name){ console.log("hello!!!!!"+name) } var name="zhangsan"; eval("helloworld(name)"); 代码粘贴到谷歌的控制台可以看到 hello!!!!! zhangsan 可以使用这个功能----返回用户选择的某行数据. <smcs-search-input-table table-uniqueflag="b"

原生js的正负值处理以及添加回调函数

今天还是来说昨天的小例子,昨天实现的效果就是点击按钮"向前"即往前相反则往后,那么需要细化的几个问题就是:代码可以简化以及可以用一个变量来控制方向直接来看js: <script> //兼容不同浏览器获取行间样式 function getStyle ( obj, attr ) { return obj.currentStyle?obj.currentStyle[attr] : getComputedStyle( obj )[attr]; } window.onload=fun

Unity3D编辑器扩展(四)——扩展自己的组件

前面已经写了三篇: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 今天写第四篇,扩展自己的自定义组件. 通常我们使用继承自 Editor 的自定义编辑器类,来扩展自己的组件的检视面板和编辑器,并配合 CustomEditor 特性语法,附加该编辑器到一个自定义组件. 首先我们先定义一个组件 Player: 1 using UnityEngine; 2 3 public class Pl

R语言笔记 R中设置图形参数--函数par()详解

R有着非常强大的绘图功能,我们可以利用简单的几行代码绘制出各种图形来,但是有时候默认的图形设置没法满足我们的需要,甚至会碰到各种各样的小问题:如坐标轴或者标题出界了,或者图例说明的大小或者位置遮挡住了图形,甚至有时候默认的颜色也不能满足我们的需求.如何进行调整呢?这就用到了"强大"的函数par().我们可以通过设定函数par()的各个参数来调整我们的图形,这篇博文就是对函数par()的各个参数进行一下总结. 函数par()的使用格式如下: par(..., no.readonly =

vue中this在回调函数中的使用

this在各类回调中使用: 如果是普通函数是没法使用的 所以需要先将this.变量赋值给新的变量,然后才能在回调函数中使用 例如: refund: function (id) { if (!this.url.refund) { this.$message.error("请设置url.refund属性!") return } var that = this; this.$confirm({ title: "确认退款", content: "是否要进行退款?&

Java/Android中的函数调用&amp;回调函数&amp;自定义回调函数

在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都是那一篇"C中的回调函数.....指针.....java....",一点看不出来是自己的思路,估计都是哪哪哪抄来的!(呵呵,要么就是吐槽对了,要么就是我水平太烂读不懂还妄加评论)还有一些很不错的文章,我会在最后参考中加上链接,大家可以看看. 那么来开始我们的正题--什么是回调函数? 我们一

Cocos2d-x 3.x中新的回调函数归纳

由于引入了C++ 11特性,cocos2d-x 3.x中许多实现方案,相对于以前的cocos2d-x 2.x,都有了很大的改进,当然性能上也得到一定的提升. 本文关注的是回调函数从2.x到3.x的变化. cocos2d-x 2.x时代的回调函数 2.X时代主要使用CCCallFunc.CCCallFuncN和CCCallFuncND等几种方式实现. CCCallFunc.CCCallFuncN和CCCallFuncND都用来创建带有回调函数的动作,区别主要在于回调函数是否带有参数. 2.x时代实

关于Unity中委托与回调函数的应用

1.首先我们需要构造一个用于传输数据并承载回调函数的类 比如:(根据需要自定义构造) 1 using UnityEngine; 2 using System.Collections; 3 4 //回调函数 5 public delegate void WarningResult(); 6 public class WarningModel : MonoBehaviour 7 { 8 //回调函数 9 public WarningResult result; 10 //警告文本 11 public