unity3d onediter eventtrigger editer菜单怎么写

如何在 Unity Editor 中绘制自定义菜单_百度知道7170人阅读
Unity3D的uGUI系统的将UI可能触发的事件分为12个类型,即EventTriggerType枚举的12个值。如下图所示:
先以PointerClick为例。这个是用于某点点击事件。其他事件都可以根据相同的办法调用。
之所以使用PointerClick为例。是因为在最后笔者会提到一个特殊的实现方式。而相比于其他事件类型,有且仅有Click事件存在特殊实现。
我们要实现事件主要有3种方式:
方式一:继承基础接口实现
步骤一:创建ClickObject脚本。继承MonoBehaviour和IPointerClickHandler。
步骤二:实现public void OnPointerClick(PointerEventData eventData)方法:
步骤三:创建一个名为Panel_IPointer的空对象。并且将ClickObject脚本附加到对象上。
步骤四:启动,并点击Panel_IPointer对象。在Console输出如下:
方式二:Unity3D编辑器操作设置实现
步骤一:创建一个C#脚本。在脚本中添加一个public方法。
步骤二:创建一个命名为Empty的UI对象,用于接收和响应点击事件。创建一个名为Panel的UI对象,用于触发点击事件。
步骤三:Panel对象添加EventTrigger组件,& Add New& -& 选择& PointerClick&。将Empty对象拖拽到触发者位置。然后点击&No Function&选择我们写在Test脚本中的OnTestClick事件。
步骤四:设置好这些之后。我们的事件触发就已经完成了。运行Unity3D。点击窗口中Panel对象。Console输出内容如下:
方式三:程序动态设置实现
我们在日常的开发中。可能需要动态的需要变更绑定的事件。那么我们如何才能使用C#代码控制绑定触发事件呢?
下面我们就介绍代码控制。ScriptControl.cs脚本
1 using System.Collections.G
2 using UnityE
3 using UnityEngine.E
4 using UnityEngine.EventS
6 public class ScriptControl : MonoBehaviour {
void Start ()
var trigger = transform.gameObject.GetComponent&EventTrigger&();
if (trigger == null)
trigger = transform.gameObject.AddComponent&EventTrigger&();
trigger.delegates = new List&EventTrigger.Entry&();
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerC
entry.callback = new EventTrigger.TriggerEvent();
UnityAction&BaseEventData& callback = new UnityAction&BaseEventData&(OnScriptControll);
entry.callback.AddListener(callback);
trigger.delegates.Add(entry);
void Update () {
public void OnScriptControll(BaseEventData arg0)
Debug.Log(&Test Click&);
点击事件的特殊实现方式:使用Button控件实现
针对Click事件还存在一种特殊方式:uGUI系统中官方提供了一种Button控件。Button封装了官方提供的一套OnClick事件。操作完全类似于方式二。便不详述了。
使用Button我们可以实现动态的变更鼠标绑定的点击事件。如下代码所示:
1 using UnityE
2 using System.C
3 using UnityEngine.UI;
5 public class BtnControl : MonoBehaviour {
// Use this for initialization
void Start ()
var button = transform.gameObject.GetComponent&Button&();
if (button != null)
button.onClick.RemoveAllListeners();
button.onClick.AddListener(TestClick);
public void TestClick()
Debug.Log(&Test Click. This is Type 4&);
// Update is called once per frame
void Update () {
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:86554次
排名:千里之外
转载:44篇
(1)(1)(2)(1)(1)(1)(1)(1)(3)(1)(2)(2)(2)(1)(1)(1)(1)(1)(1)(2)(4)(2)(1)(3)(4)(5)(5)(3)在做一些开场动画或者其它指定事件触发 一类功能时,需要在编辑环境下设置添加回调函数。一开始尝试直接使用delegate 来编写,测试发现没有效果,在搜索到Unity论坛有人提到 delegate 不能被序列化到Inspector 中使用,建议使用 UnityEvent 。UnityEvent ,其实在UGUI中经常用到,只是平时不知道是它。比如按钮的点击事件就是直接从 UGUI Button 的中搬运出来。先提供一个带有 UnityEvent 的类TimeEventPlugin.csusing UnityE
using UnityEngine.S
using UnityEngine.E
public class TimeEventPlugin : MonoBehaviour
[SerializeField]
public float m_DelayT
[SerializeField]
public TimeEventTrigger m_TimeEventTrigger=new TimeEventTrigger();
private float delayT
void Start()
delayTime = m_DelayT
Debug.Log(&TimeEventTrigger ID=&+m_TimeEventTrigger.ID);
delayTime -= Time.deltaT
if (delayTime &= 0)
delayTime = m_DelayT
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 UnityE
using System.C
using UnityE
[CustomEditor(typeof(TimeEventPlugin))]
public class TimeEventPluginEditor : Editor
SerializedProperty m_serializedTimeEventT
SerializedProperty m_serializedTimeE
TimeEventTrigger m_TimeEventT
void OnEnable()
m_serializedTimeEventTrigger = serializedObject.FindProperty(&m_TimeEventTrigger&);
public override void OnInspectorGUI ()
serializedObject.Update();
TimeEventPlugin plug = target as TimeEventP
plug.m_DelayTime=EditorGUILayout.FloatField(&m_DelayTime&, plug.m_DelayTime);
EditorGUILayout.PropertyField(m_serializedTimeEventTrigger,true);
serializedObject.ApplyModifiedProperties();
}最后编写一个常规脚本 Test.cs,提供一个回调函数注册到 TimeEventPlugin 中using UnityE
using System.C
public class Test : MonoBehaviour {
// Use this for initialization
void Start ()
public void TimeEnd()
Debug.Log(&TimeEnd&);
// Update is called once per frame
void Update () {
最后在中的效果如下呈现:例子下载:/s/1bnjmKdL
版权声明:本文转自http://blog.csdn.net/huutu 转载请带上 .cn1711人阅读
Unity5(4)
Unity编辑器允许你去添加像内置菜单一样外观和行为的自定义菜单。自定义菜单对于那些经常使用的功能提供一种能从编辑器直接访问的便捷方式。在这一课程中我将对每个描述的主题提供真实的使用示例,用于说明在unity中的菜单项是如何创建和使用的。
添加菜单项
为了要在顶层工具栏中创建一个新的菜单项,你必须去创建一个编辑器脚本(在项目Editor目录下的一个脚本)。此菜单项需要是一个静态的方法且必须使用MenuItem属性来标识。例如,去添加一个你的团队和公司经常使用的命令到“Tools”菜单。
下面的示例,在Tools菜单下添加了一个“Clear PlayerPrefs”选项:
using UnityE
using UnityE
public class MenuItems
[MenuItem("Tools/ClearPlayerPrefs")]
private static void NewMenuOption()
PlayerPrefs.DeleteAll();
这段代码创建了一个叫“Tools”的菜单,并在下面放置了一个叫“Clear PlayerPrefs”的菜单项。
当然我们也可以在一个现成的菜单项下面创建新的菜单项(例如:在“Windows”菜单下),也可以创建多级子菜单便于更好的组织菜单项目:
using UnityE
using UnityE
public class MenuItemsExample
[MenuItem("Window/New Option")]
private static void NewMenuOption()
[MenuItem("Tools/SubMenu/Option")]
private static void NewNestedOption()
上面的代码产生的结果如下:
为了使超级用户和喜欢使用键盘的用户工作的更快捷,我们可以为新的菜单项关联一个快捷键-使用快捷键的组合将自动的启动他们菜单项。
下面是被指定的键(它们也可以组合起来使用):
%-CTRL 在Windows / CMD在OSX
LEFT/RIGHT/UP/DOWN-光标键
HOME,END,PGUP,PDDN
字母键不是key-sequence的一部分,要让字母键被添加到key-sequence中必须在前面加上下划线(例如:_g对应于快捷键”G”)。
快捷键的组合被添加在菜单项的路径后面,并以一个空格分隔。如下显示的示例:
[MenuItem("Tools/New Option %#a")]
private static void NewMenuOption()
[MenuItem("Tools/Item %g")]
private static void NewNestedOption()
[MenuItem("Tools/Item2 _g")]
private static void NewOptionWithHotkey()
使用了快捷键的菜单项将显示用于启动它们的快捷键,示例如下:
注意:这里没有验证重复的快捷键,如果定义了多个相同的快捷键,那么也只有一个菜单项被调用。
显示,传递到MenuItem属性上的路径确定了新的菜单项将被放置在哪个顶层菜单下。Unity有些特殊的路径作用于上下文菜单(通过右键访问的菜单):
Assets -菜单项将被显示在“Assets”菜单下,同时也显示在右键单击项目视图时弹出的菜单中。
Asset/Create - 菜单项将被列出在,当你在项目视图中单了右键菜单里的“Create”子菜单中(当你创建了能够添加项目的新类型时,此功能是是非常有用的)。
CONTEXT/ComponentName - 菜单项将出现在给定组件的上下文菜单(右键单击显示的菜单)中。
下面显示了一些如何使用特殊路径的示例:
[MenuItem("Assets/Load Additive Scene")]
private static void LoadAdditiveScene()
var selected = Selection.activeO
EditorApplication.OpenSceneAdditive(AssetDatabase.GetAssetPath(selected));
[MenuItem("Assets/Create/Add Configuration")]
private static void AddConfig()
[MenuItem("CONTEXT/Rigidbody/New Option")]
private static void NewOpenForRigidBody()
上面代码片段产生的结果如下图:
有效性验证
有些菜单项仅在指定的情况下才可用,否则就应该被禁用。根据它的上下文添加一个验证方法来启用/禁用一个菜单项。
验证方法是一个静态的,并使用MenuItem属性标记的一个方法,且此属性传递true作为一个验证参数。
这个验证方法应该和菜单的命令方法有相同的路径,并且要有一个boolean的返回值,用以确认菜单是否被激活或者禁用。
例如,验证方法能够被用于在项目视图里一个纹理上的右键菜单:
[MenuItem("Assets/ProcessTexture")]
private static void DoSomethingWithTexture()
[MenuItem("Assets/ProcessTexture", true)]
private static bool NewMenuOptionValidation()
return Selection.activeObject.GetType() == typeof(Texture2D);
当在非任意纹理上单击右键时,此菜单项将会被显示成灰色:
控制菜单的优先顺序
优先级是个被赋值到菜单项一个数字(传递给MenuItemde的第3个参数),它控制了菜单的显示顺序。
菜单项也能够自动的分组,每50个一个组:
[MenuItem("NewMenu/Option1", false, 1)]
private static void NewMenuOption()
[MenuItem("NewMenu/Option2", false, 2)]
private static void NewMenuOption2()
[MenuItem("NewMenu/Option3", false, 3)]
private static void NewMenuOption3()
[MenuItem("NewMenu/Option4", false, 51)]
private static void NewMenuOption4()
[MenuItem("NewMenu/Option5", false, 52)]
private static void NewMenuOption5()
上面的代码示例显示如下的结构,菜单项被分为了两个组:
其他相关的类
下面列出了对于添加菜单项一些相关的类。
MenuCommand
当添加一个新的菜单项到Inspector中(使用 “CONTEXT/Component”),有时候获取一个真实组件的引用也是有必要的(例如:修改它的数据)。
这可以通过给新菜单项的静态方法添加一个MenuCommand参数。
[MenuItem("CONTEXT/RigidBody/New Option")]
private static void NewMenuOption(MenuCommand menuCommand)
var rigid = menuCommand.context as RigidB
ContextMenu
这个属性允许你去定义上下文菜单。它和使用MenuItem并以“CONTEXT/…”作为路径定义菜单项一样。
这个属性不同的是,你能给指定的组件定义默认的上下文菜单项,然而使用MeneItem只是为了扩展现有的组件菜单,比如引擎默认的组件。
示例-组件将显示一个用于清除数据的菜单项:
public class NameBehaviour : MonoBehaviour
public string N
[ContextMenu("Reset Name")]
private static void ResetName()
Name = string.E
ContextMenuItem
这个属性被添加到组件类的字段上,上面显示了ContextMenu属性在组件上下文菜单中添加了一个菜单项,然后ContextMenuItem属性将在字段的上下文菜单中添加一个菜单项。
由于这个属性被添加到了一个字段上没有方法,所有它接受两个参数:一个用于显示菜单项的名字,一个用于指定一个当菜单被选中时要调用的实例方法。
实例-添加一个随机初始化字段的方法:
public class NameBehaviour : MonoBehaviour
[ContextMenuItem("Randomize Name", "Randomize")]
public string N
private void Randomize()
Name = "Some Random Name";
上面代码的结果显示了当在字段上单击右键时弹出的菜单项:
AddComponentMenu
此属性允许你去放置脚本到“Component”菜单下的任意位置,而不只是在“Component-&Scripts”菜单下。你能使用它去更好的组织你的脚本。这个属性能够改善添加脚本的工作流程。重要提示:你需要重启才生效。
using UnityE
[AddComponentMenu("Transform/Follow Transform")]
public class FollowTransform : MonoBehaviour
GenericMenu
GenericMenu让你可以创建一个自定义的上下文菜单和下拉菜单,下面这个示例打开一个带有绿色区域的窗口,在绿色区域上单击右键将显示一个菜单,当触发了菜单中选中的项时将触发一个回调。
using UnityE
using UnityE
using System.C
public class GenericMenuExample : EditorWindow
[MenuItem("Example/Open Window")]
static void Init()
var window = GetWindow&GenericMenuExample&();
window.position = new Rect(50, 50, 250, 60);
window.Show();
void Callback(object obj)
Debug.Log("Selected: " + obj);
void OnGUI()
Event currentEvent = Event.
Rect contextRect = new Rect(10, 10, 100, 100);
EditorGUI.DrawRect(contextRect, Color.green);
if (currentEvent.type == EventType.ContextClick)
Vector2 mousePos = currentEvent.mouseP
if (contextRect.Contains(mousePos))
GenericMenu menu = new GenericMenu();
menu.AddItem(new GUIContent("MenuItem1"), false, Callback, "item 1");
menu.AddItem(new GUIContent("MenuItem2"), false, Callback, "item 2");
menu.AddSeparator("");
menu.AddItem(new GUIContent("SubMenu/MenuItem3"), false, Callback, "item 3");
menu.ShowAsContext();
currentEvent.Use();
这篇文章说展示的,在Unity编辑器中去扩展一个菜单项是非常简单的。
在编辑器中为常用功能建立菜单项。可以为规范团队开发并且能够节约很多时间。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:60650次
排名:千里之外
原创:21篇
转载:30篇
(1)(2)(1)(2)(3)(3)(1)(1)(6)(1)(1)(1)(1)(2)(2)(17)(10)Unity编辑器设置(Editorsettings)_翼狐网
Unity资源下载11
下载次数:196
下载次数:179
下载次数:161
下载次数:150
下载次数:147
下载次数:137
Unity热门视频教程
共有65379人学习了该教程
共有58435人学习了该教程
共有36818人学习了该教程
共有26413人学习了该教程
共有25764人学习了该教程
共有20399人学习了该教程
提供最专业、体验最好的在线教育培训服务,让学设计的你享受最权威与最便利的学习环境!
微信号:yihuwang2012
编辑器设置 ( Editor settings) & & & &属性属性:功能:版本控制 (Version Control)应该使用哪个版本控制系统。万维网安全仿真 (WWW Security Emulation)进行网络播放器测试时,编辑器可以“假设”游戏运行于该网址的网络播放器上。Ass资源序列化 (Asset Serialization)为帮助版本控制合并,Unity 能够存储文本格式的场景文件(请参阅文本场景格式页面了解更多详情)。如果没有执行合并,Unity 会以空间效率更高的二进制格式存储场景,或允许文本场景文件和二进制场景文件同时存在。
最多浏览的Unity教程
行业教程引导:
软件教程引导:}

我要回帖

更多关于 unity3d onediter 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信