您的位置:首页 > 移动开发 > Unity3D

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

2015-07-16 22:53 513 查看
在做一些开场动画或者其它指定事件触发 一类功能时,需要在编辑环境下设置添加回调函数。

一开始尝试直接使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: