【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3129|回复: 1

[Unity插件开发] Unity3D自定义编辑器窗口(1---2---3)

[复制链接]
发表于 2013-12-6 12:04:49 | 显示全部楼层 |阅读模式
本帖最后由 夜行的猫仔 于 2014-2-8 16:22 编辑

Unity3D自定义编辑器窗口(1)

由于最近在做新的游戏,不想仅仅依靠Unity自带的功能了~~确实它提供的功能太少了~~~因此开始扩展自定义的一些面板,这块以前没接触过,一边做一边做笔记,希望对大家有帮助。

首先在手册上查了一下,所有的Untiy窗体都可以通过脚本去创建,但是这些脚本必须放在Editor目录下,我模仿NGUI插件创建了工作目录:

QQ图片20131206115811.jpg


1.给菜单栏增加自定义菜单项

对于不同的扩展功能,Unity也提供了不同的几个类供开发者扩展,首先做个最简单的,先在Unity的菜单栏上增加一个新的菜单选项,代码如下:

PuzGametTools .cs

  1. using UnityEngine;
  2. using UnityEditor;
  3. public class PuzGametTools : EditorWindow
  4. {        
  5.         [MenuItem ("Puz Gamet Tools/window")]
  6. }
复制代码
这个脚本放在Editor目录下,不用捆绑GameObject 上Unity就会自动执行,运行程序,菜单栏上就看到了一个新的菜单项:

QQ图片20131206115811.jpg

2.为菜单项增加执行函数功能

查Unity手册可以看到调用MenuItem 后添加一个执行函数,脚本就会自动在点了MenuItem 增加的菜单项后执行这个函数:如我们修改代码如下:

  1. using UnityEngine;
  2. using UnityEditor;
  3. public class PuzGametTools : EditorWindow
  4. {        
  5.         [MenuItem ("Puz Gamet Tools/window")]
  6.         static void DoSomething () {
  7.         Debug.Log ("Doing Something...");
  8.         }

  9. }
复制代码
在代码中增加了个static 函数DoSomething ();我们在菜单上选择了Puz Gamet Tools-->window这个按钮就会执行DoSomething ()函数。如果我们对MenuItem 下面写了多个函数,脚本只会执行距离MenuItem 最近的那个函数。
3.为菜单项增加快捷键MenuItem 还可以为创建的菜单增加快捷键,只需要在MenuItem 添加菜单的时候,在菜单名字的后面增加 %+快捷键值就可以了:
  1. using UnityEngine;
  2. using UnityEditor;
  3. public class PuzGametTools : EditorWindow
  4. {        
  5.         [MenuItem ("Puz Gamet Tools/Do Something")]
  6.         static void DoSomething () {
  7.                 Debug.Log ("Doing Something...");
  8.         }
  9.         [MenuItem ("Puz Gamet Tools/Hot Key %g")]
  10.         static void HotKey () {
  11.                Debug.Log ("Doing something with a Shortcut Key...");
  12.         }
  13. }
复制代码
4.为菜单项增加执行命令
下面一个例子是通过菜单命令获取到选中的物体的名字
  1. [MenuItem ("Puz Gamet Tools/SelectedName")]
  2.         static void LogSelectedTransformName ()
  3.         {
  4.                 Debug.Log ("Selected Transform is on " + Selection.activeTransform.gameObject.name + ".");
  5.         }
复制代码
5.为菜单项增加逻辑性
下面的例子是表示的是如果没有在场景中选中任何一个GameObject的时候,上面写得函数Selected Name这个菜单命令就显示灰色(不可用状态),当选中某一个GameObject的时候这个菜单就可用了。
  1. [MenuItem ("Puz Gamet Tools/SelectedName", true)]
  2.         static bool ValidateLogSelectedTransformName () {
  3.                 // Return false if no transform is selected.
  4.                 return Selection.activeTransform != null;
  5.         }
复制代码
QQ图片20131206115811.jpg
6.菜单支持中文~
可以给菜单中增加中文的命令,这对国内的用户实在是太实用啦~~
  1. [MenuItem ("Puz Gamet Tools/随便做点什么")]
  2. static void DoSomething () {
  3.                 Debug.Log ("Doing Something...");
  4.         }
复制代码
 楼主| 发表于 2014-2-8 16:21:31 | 显示全部楼层

Unity3D自定义编辑器窗口(2)

1.创建新的面板窗体接下来制作操作面板,操作面板的生成代码如下:[mw_shl_code=csharp,true]using UnityEngine;
using UnityEditor;
public class PuzGametTools : EditorWindow
{        
        [MenuItem ("Puz Gamet Tools/新窗口")]
          static void Init () {
                    PuzGametTools window = (PuzGametTools)EditorWindow.GetWindow (typeof (PuzGametTools));
        }
}[/mw_shl_code]
这样在屏幕上会创建一个unity的空窗体,需要增加控件,修改代码如下:[mw_shl_code=csharp,true]using UnityEngine;
using UnityEditor;
public class PuzGametTools : EditorWindow
{        
        string myString = "Hello World";
        bool groupEnabled;
        bool myBool = true;
        float myFloat = 1.23f;
        [MenuItem ("Puz Gamet Tools/新窗口")]
          static void Init () {
                       PuzGametTools window = (PuzGametTools)EditorWindow.GetWindow (typeof (PuzGametTools));
        }
        void OnGUI () {
                GUILayout.Label ("Base Settings", EditorStyles.boldLabel);
                myString = EditorGUILayout.TextField ("Text Field", myString);
               
                groupEnabled = EditorGUILayout.BeginToggleGroup ("Optional Settings", groupEnabled);
                myBool = EditorGUILayout.Toggle ("Toggle", myBool);
                myFloat = EditorGUILayout.Slider ("Slider", myFloat, -3, 3);
                EditorGUILayout.EndToggleGroup ();
        }
}[/mw_shl_code]其中控件的名称可以写成汉字的,不过显示效果并不理想,建议使用英文。


EditorGUILayout详细的设置参考http://docs.unity3d.com/Documentation/ScriptReference/EditorGUILayout.html


以下列举几个常用的控件的外观:
控件名
外观
  控件名
外观  
控件名
外观  
Toggle
TextArea
TextField
Space
Slider
RectField
PrefixLabel
Popup
PasswordField
MinMaxSlider
MaskField
LabelField
LayerField
IntSlider
IntPopup
IntField
InspectorTitlebar
Foldout
FloatField






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 07:10

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表