在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
一开始尝试直接使用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
相关文章推荐
- 使用Unity3D的50个技巧:Unity3D最佳实践
- 在Unity中使用Lua脚本:语言层和游戏逻辑粘合层处理
- Unity3d-Camera
- (2)unity入门,登陆页面GUI,上
- unity3d5.0 SurvivalShooter(二) 动画状态机的添加
- unity3d 5.0 SurvivalShooter(一) 角色移动
- 将texturepacker生成的png和xml资源反向生成小图供unity使用
- Unity3D研究院transform.parent = parent坐标就乱了
- 自己写的UnitY实用小工具或脚本——文本管理器
- Unity3D研究院之通过C#使用Advanced CSharp Messenger(五十)
- Unity 接入ShareSDK Android&iOS 微信分享
- Unity 天空盒SkyBxo
- 孙陪你,了解它的权力--Kinect结合的发展Unity3D游戏应用开发
- 在unity中点击三维物体,显示它的名字
- Unity3D如何集成ShareSDK
- Unity为物体添加物理碰撞效果
- unity3d 4.X音频格式
- unity3D的FingerGestures插件
- 深入理解IOC模式及Unity框架
- 深入理解Unity脚本的执行顺序