unityunity 剧情编辑器器是什么插件

  Unity 的 Asset Store 中除了拥有非常强大的 Unity 编辑器扩展工具之外,还有一些让开发过程事半功倍的脚本插件。今天为大家介绍几款饱受好评的脚本插件。
  Pro Camera 2D
  Pro Camera 2D 是为 2D 及 2.5D 游戏量身定制的相机插件,可以快速在 Unity 中为任意类型 2D 游戏设置合适的相机。它支持三个坐标轴方向,也支持正交及透视两种相机模式。另外该插件从制作之初就一直非常注重性能及可扩展性,所以即便是配置较低的老式移动设备也可放心使用。开发者也可以很方便地扩展该插件以适应游戏的特殊需求。
  Pro Camera 2D 主要分为三大块:
  Core:轻量级且极度优化的插件核心部分,仅关注相机的目标对象及目的地。
  Extensions:包含一系列已定义好的扩展,可以很方便地增加一些相机设置如边框、镜头转换、焦点设置、边界及速度设置、抖动及缩放等等,目前共有 17 个。这些扩展是在 Core 的基础上实现的,但不包含在 Core 中,所以不需要的扩展可以禁用,这样也不会影响性能。
  Triggers:触发器,与 Extensions 类似,增加相机的额外功能。触发器是独立于相机存在的,它会在相机接触到游戏中的目标物体时触发一些事件。自定义触发器也很简单。
  使用 Pro Camera 2D 的方式非常简单,只需在场景的主相机上添加 Pro Camera 2D 脚本,然后进行一些简单的设置即可:
  Pro Camera 2D 支持跟踪多个目标,并且可以设置各个目标相对相机的偏移。另外所有的 Extensions 及 Triggers 都可以很方便的在检视面板中点击按钮进行启用与添加,它会自动将所需的脚本绑定到相机对象上。
  下载地址:
  Ultimate Rope Editor
  顾名思义,Ultimate Rope Editor 就是用来解决游戏中所有绳索相关问题的。它能生成各种类型的绳索,并将绳索物理应用到已有的网格上。更方便的是,绳索的物理参数可以在运行时实时调整,然后复制到编辑器模式下,从而帮助节省大量的迭代时间。
  Ultimate Rope Editor 是一个非常轻量级的插件,它将创建绳索的过程简化到了极致。只需一个脚本就能完成所有的设置,并且具有非常逼真的物理特性。使用 Ultimate Rope Editor 只需在绳索对象上添加 Utilmate Rope 脚本,然后设置绳索的类型、起始点、材质及其物理属性即可。
  这里可以选择三种类型的绳索:
  Procedural:系统自动生成绳索,包含物理特性与网格信息。
  Linked Objects:链式绳索,由一个个小的部位链接。
  Import Bones:从已有的骨骼信息生成绳索的物理,常用于处理头发。
  下载地址:
  Chronos & Time Control
  Chronos & Time Control 是用于控制游戏中各种时钟的插件,也是 Unity Awards 2015 优秀插件大奖得主。该插件小巧易用且优化过性能,可以搞定游戏中所有的时钟控制。支持时间的暂停、倒退、减速及加速,并且每个对象都有单独的时间线,还可以按区域来同时控制多个对象。
  Chronos & Time Control 非常简单,能够很好的应用于自定义脚本,并且完全兼容对象的物理属性,能够自动适应动画、粒子效果、Nav Mesh Agent 及音效。该插件主要包含三种类型的脚本:
  Timekeeper:追踪场景全局时钟的单例,一个场景仅需一个 Timekeeper。
  Clock:所有类型时钟的基类。共有三种时钟:Global Clock(全局时钟)、Local Clock(本地时钟)及 Area Clock(区域时钟)。
  Timeline:整合一个或多个时钟来单独控制某一个游戏对象的 Delta Time 和 Time Scale 等属性。每个需要使用 Chronos 控制的游戏对象都要绑定该脚本。
  Chronos & Time Control 适合实现一些游戏角色的特殊技能,如操控时间的魔法或科幻技能等。不论 2D 或 3D 游戏均能完美支持,且适用于任何平台。
  下载地址:# 开发unity插件——一次搞定unity编辑器常用功能
![unity](http://upload-images.jianshu.io/upload_images/dfd0c91d72136e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这篇文章主要分享unity中与editor插件等相关的使
开发unity插件——一次搞定unity编辑器常用功能
这篇文章主要分享unity中与editor插件等相关的使用,比较基础,不过如果都掌握了就可以扩展写一些unity插件了,平时开发中也会提升工作效率。
editor相关脚本一定要放在Editor文件夹下,继承monobehaviour的文件不要放到Editor文件夹下。
monobehaviour相关的编辑器功能
首先常用的在继承monobehaviour类中写public变量可以在inspector中序列化可编辑一般人都知道了,下面是一些可以更有效率更酷的方法。
增强序列化属性
public bool isGood =
[Tooltip("hp")]//鼠标hover的时候显示一个tooltip
public int life = 0;
[Range(0f, 1f)]//float slider
public float CloudRange = 0.5f;
[Range(0, 15)]//int slider
public int CloudRangeInt = 1;
[Header("OtherAttr")]//可以将属性隔离开,形成分组的感觉
public float CloudHeader = 1f;
[Space(30)]//可以与上面形成一个空隙
public float CloudSpace = 1f;
[HideInInspector]//使属性在inspector中隐藏,但是还是可序列化,想赋值可以通过写程序赋值序列化
public float CloudHideInInspector = 1f;
[NonSerialized]//使public属性不能序列化
public float CloudNonSerialized = 1f;
[SerializeField]//使private属性可以被序列化,在面板上显示并且可以读取保存
private bool CloudSerializeField =
效果如下图,对于一些有范围的数值可以用range做个slider让策划来调节,可以用header和space来组织面板的外观,也可以针对不同的属性进行是否序列化的选择。
也可以序列化一个类
[Serializable]//一个可序列化的类
public class SerializableClass {
public int x = 0;
public Vector2
public SerializableClass serializedO//一个可序列化的类的实例
组件面板的上下文菜单
有时在monobehaviour中写一些方法可以初始化一些值或者随机产生某个值这种需求,都可以在菜单中触发,只要简单的加一行即可。
[ContextMenu("Init")]//可以在组件的右键菜单及设置(那个小齿轮按钮)菜单看到,
void Init()
[ContextMenu("Random value")]
void RandomValue()
Debug.Log("TestContextMenu " + gameObject.name);
life = UnityEngine.Random.Range(1, 100);
效果如下图,点击init就会赋一个初始的值,点击randomvalue可以随机产生一个life的值,这就是最简单的editor工具了
inspector相关的编辑器功能
如果要在inspector中加上一些更高级的功能就需要使用editor相关的方法了
这是要使用的TestInspector类代码
[CustomEditor(typeof(TestInspector))]
public class CloudTools : Editor {
#region inspector
TestI//所对应的脚本对象
GameObject rootO//脚本的GameObject
SerializedObject seriO//所对应的序列化对象
SerializedProperty headC//一个[SerializeField][HideInInspector]且private的序列化的属性
private static bool toggle =//toggle按钮的状态
public void OnEnable()
seriObject = base.serializedO
headColor = seriObject.FindProperty("headColor");
var tscript = (TestInspector)(base.serializedObject.targetObject);
if (tscript != null)
rootObject = script.gameO
Console.Error.WriteLine("tscript is null");
public void OnDisable()
var tscript = (TestInspector)(base.serializedObject.targetObject);
if (tscript == null)
// 这种情况是脚本对象被移除了;
Debug.Log("tscript == null");
// 这种情况是编译脚本导致的重刷;
Debug.Log("tscript != null");
seriObject =
rootObject =
public override void OnInspectorGUI()
base.OnInspectorGUI();
seriObject.Update();
//将target转化为脚本对象
script = target as TestI
//random按钮
if (GUILayout.Button("RandomNum"))
//注册undo,可以在edit菜单里看到undo,也可以通过ctrl+z来回退
Undo.RecordObject(script, "revert random num");
script.RandomNum(script.num);
//save scene和toggle这组按钮
GUILayout.BeginHorizontal();
if (GUILayout.Button("SaveScene"))
EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();
if(GUILayout.Button(toggle ? "untoggle" : "toggle"))
toggle = !
GUILayout.EndHorizontal();
script.isAlive = EditorGUILayout.BeginToggleGroup("isAlive", script.isAlive);
if (script.isAlive)//如果isAlive不勾选则不显示life
script.life = EditorGUILayout.Slider("life", script.life, 0, 100f);
EditorGUILayout.EndToggleGroup();
//可以显示TestInspector中序列化但是不在inspector中显示的属性
EditorGUILayout.PropertyField(headColor);
seriObject.ApplyModifiedProperties();
//展示普通信息
EditorGUILayout.LabelField("life " + script.life, GUILayout.Width(200));
Repaint();
#endregion
其中需要用OnEnable和OnDisable来做初始化和清理工作,OnInspectorGUI方法可以类比monobehaviour中的OnGUI,做ui渲染和ui事件处理。
里面还注册了UnDo,好处是可以通过ctrl+z来进行撤销操作,这样才更完美更像一个完善的unity插件。
代码也没什么难度,我也做了下简单的注释,执行一下看看效果大部分人就都理解了。效果如下图
各种上下文菜单
之前可以在monobehaviour中加入[ContextMenu("Random value")]来生成对应脚本组件面板的上下文菜单,那么如果要生成一个在transform组件上的菜单怎么办
[MenuItem("CONTEXT/Transform/RandomPosition")]
static void ContextMenu_TransformRandomPosition()//随机改变transform组件的position
Debug.Log("ContextMenu_Transform");
Transform[] transforms = Selection.GetTransforms(SelectionMode.TopLevel | SelectionMode.OnlyUserModifiable);
foreach (Transform transform in transforms)
transform.localPosition = new Vector3(UnityEngine.Random.Range(-10, 10),
UnityEngine.Random.Range(-10, 10),
UnityEngine.Random.Range(-10, 10));
Debug.Log(transform.localPosition);
效果如下图,如果策划或者美术需要对transform的position干这种随机的事,是不是就可以这么搞了?或者对collider、rigibody之类的组件加上一些属性模板的设置,会很方便吧
带勾选的菜单
在editor中加个菜单item是件很容易的事情,那么如果这个菜单是可以勾选的呢?是不是可以解决一些开关的问题?
const string Menu_Checked = "Cloud/MenuChecked";//checked menu的名字
const string Key_MenuChecked = "MenuChecked";//checked menu状态存储的key
[MenuItem(Menu_Checked)]
static void MenuChecked()
bool flag = Menu.GetChecked(Menu_Checked);
Debug.Log("Key_MenuChecked to 0");
PlayerPrefs.SetInt(Key_MenuChecked, 0);//通过存储0和1来判断是否check menu
Debug.Log("Key_MenuChecked to 1");
PlayerPrefs.SetInt(Key_MenuChecked, 1);
Menu.SetChecked(Menu_Checked, !flag);
[MenuItem(Menu_Checked, true)]//判断menu是否check的函数
public static bool IsMenuChecked()
Menu.SetChecked(Menu_Checked, PlayerPrefs.GetInt(Key_MenuChecked, 0) == 1);
效果如下图,其中需要一个菜单的valid函数来判断菜单是否在勾选状态,这里用了playprefs,在windows上就写到注册表里了
project面板中的菜单
这个菜单是加到了Assets下面,那么在project面板中右键也可以看到,这种菜单可以干什么呢,我也没想好,不过干些修改assetsimport属性或者修改一些资源等等还是挺好用的吧
[MenuItem("Assets/TestAssets")]
static void MenuAssets()
if(Selection.activeObject == null)
Debug.Log("TestAssets choose null");
Debug.Log("TestAssets name = " + Selection.activeObject.name);
一般这种菜单都可以通过Selection.activeObject/activeGameObject等等来获取选中对象,当然也可以获取多选的多个对象,这个看下api就知道了
hierarchy面板菜单
这个菜单还是比较实用的,相对来说也不太一样
[MenuItem("GameObject/Create Other/TestGameObject")]//将菜单放到GameObject菜单中,可以在hierarchy中看到
static void MenuGameObject()
Debug.Log("TestGameObject");
将菜单加到GameObject下面,就可以在hierarchy里右键看到了
那么基于这个菜单我们可以做个比较实用的功能,例如右键hierarchy中场景的一个GameObject并且对它进行SetActive为true or false的操作,代码如下:
//快捷键可以为%=ctrl/cmd #=shift &=alt LEFT/RIGHT/UP/DOWN F1-F12,HOME END PGUP PGDN _a~_z
[MenuItem("GameObject/SetActive _a", false, 11)] //11及以后可以在Camera之后显示
static void MenuGameObjectSetActive()//通过按a键来设置所选择GameObject的active状态
Debug.Log("MenuGameObjectSetActive");
if(Selection.activeGameObject != null)
Undo.RecordObject(Selection.activeGameObject, "SetActive" + Selection.activeGameObject.activeSelf + " " + Selection.activeGameObject.name);
Selection.activeGameObject.SetActive(!Selection.activeGameObject.activeSelf);//就算锁定了inpector,也是处理当前选中的
Debug.Log(Selection.activeObject.name);
[MenuItem("GameObject/SetActive", true, 11)]
static bool CheckIsGameObject()//判断是否显示该菜单的校验方法,如果没选择GameObject为灰
UnityEngine.Object selectedObject = Selection.activeO
if(selectedObject != null && selectedObject.GetType() == typeof(GameObject))
Debug.Log(selectedObject.name);
其中做校验的方法是为了在不选中GameObject的时候能够将菜单灰掉。另外这种菜单可以绑定一个快捷键,这个例子是绑定了a键,菜单中也可以看出来。
最终效果就成了:我选中一个GameObject,只要按下a键就可以SetActive(false),再按下变成true,还是比较实用的吧,基于此可以做很多实用的东西。效果如下图
对话框比较简单,就是一些内置的api,具体可以查看api,支持了例如简单和复杂对话框、打开保存文件对话框、进度条等等功能
EditorUtility.DisplayCancelableProgressBar("ok", "done", 0.7f)EditorUtility.ClearProgressBar();EditorUtility.OpenFilePanel("open", "d:/", ".txt");
如果要做的事情可能不是与某个GameObject相关,inspector不能满足要求,那么可以创建一个新的窗口,创建新的editor窗口需要继承EditorWindow,代码如下
[CustomEditor(typeof(CloudWindow))]
public class CloudWindow : EditorWindow {
#region 对话框
//通过MenuItem按钮来创建这样的一个对话框
[MenuItem("Cloud/ShowEditorTestPanel")]
public static void ConfigDialog()
EditorWindow.GetWindow(typeof(CloudWindow));
public UnityEngine.Object go =
string goName= "default";
float life = 100f;
bool isAlive =
bool toggleE
void OnGUI()
GUILayout.Label("Label Test", EditorStyles.boldLabel);
//通过EditorGUILayout.ObjectField可以接受Object类型的参数进行相关操作
go = EditorGUILayout.ObjectField(go, typeof(UnityEngine.Object), true);
if (GUILayout.Button("Button Test"))
if (go == null)
Debug.Log("go == null");
Debug.Log(go.name);
goName = EditorGUILayout.TextField("textfield", goName);
toggleEnabled = EditorGUILayout.BeginToggleGroup("optional settings", toggleEnabled);
if (toggleEnabled)
isAlive = EditorGUILayout.Toggle("isalive", isAlive);
life = EditorGUILayout.Slider("life", life, 0, 100);
EditorGUILayout.EndToggleGroup();
#endregion
好像代码也不复杂,也没什么难度就是常见的ui绘制,效果如下:
如果有更高的需求可能需要更深入的研究一下unity中editor的相关api和文档
unity还提供了可以在scene窗口中做一些操作,例如画一些辅助线、显示label、操作handler等,具体可以参考
如果把这些代码执行一遍,改改调试一下,理解基本流程,那么已经可以写一些提高工作效率的unity插件了
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】浅析混合云和跨地域网络构建实践,分享高性能负载均衡设计,9月21日阿里云专家和你说说网络那些事儿,足不出户看直播,赶紧预约吧!&&
大数据开发套件(Data IDE),提供可视化开发界面、离线任务调度运维、快速数据集成、多人协同工作等功能,为您...
一站式提供企业即时通讯、销售管理、协同办公。
基于深度学习技术及阿里巴巴多年的海量数据支撑, 提供多样化的内容识别服务,能有效帮助用户降低违规风险。其产品包括...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
MaxCompute75折抢购
Loading...Unity3D使用Sublime作为编辑器 - 简书
Unity3D使用Sublime作为编辑器
终于无法忍受MonoDeveloper的龟速,决心换一个工具作为Unity3D的代码编辑器。看身边的朋友开始用Sublime,清凉快速、自动补全、内置构建、配色丰富,总之一个字,酷!
于是请教余老板给配置了个同样地环境,这里记录下过程,分享给大家。
环境要求:
已安装Unity3D已安装
步骤一:给Sublime安装PackageControl
具体方法见PackageControl的,如果已安装请跳过。
步骤二:为Sublime安装OmniSharp插件
OmniSharp只支持Sublime Text 3,请在Package Control中进行安装。
菜单选择 Preferences & Settings - More & Syntax Specific - User
OmniSharp设置.png
填入以下内容并保存
"auto_complete": true,
"auto_complete_selector": "source - comment",
"auto_complete_triggers": [ {"selector": "source.cs", "characters": ".&"} ],
步骤三:为Sublime安装Unity3D Build System插件
经测试,通过Package Control安装的这个插件在Sublime Text 3里面有问题,具体表现为Sublime的Packages目录里相关文件没有被下载,囧。不过我们可以手动安装,选择菜单:Sublime Text & Preferences & Browse Packages...在这个目录里面运行git clone
"Unity3D Build System"
TIPS:后面必须加"Unity3D Build System"参数,否则不能正常运行。
步骤四:设置Unity3D的默认编辑器为Sublime
设置Unity3D的默认脚本编辑器.png
步骤五:创建项目的Sublime工程文件
在Sublime中,选择菜单 File & Open…在文件选择对话框中,打开Unity3D项目的文件夹,这时Sublime左侧会有树形目录。
选择菜单 Project & Save Project As...将sublime-project文件保存到Unity3D相应项目的根目录,并以项目名称命名。例如:Unity3D项目中.Net工程文件为TestProject.sln,则保存为TestProject.sublime-project。
NOTE:这里有两个sln文件,一个是xxx.sln,另一个是xxx-csharp.sln,选用前者。
修改sublime-project内容为了更好适配Unity3D开发,我们需要设置一下sublime工程文件。
"folders":
"file_exclude_patterns":
"*.asset",
"*.unity",
"*.unitypackage",
"*.prefab",
"*.controller",
"folder_exclude_patterns":
"Materials",
"NGUIAtlas",
"Prefabs",
"StreamingAssets",
"path": "Assets",
"follow_symlinks": true
"solution_file": "./TestProject.sln"
将其中的TestProject.sln改为你的工程文件名。以后双击这个sublime工程文件就可以用Sublime打开工程。
步骤六:配置快捷键
代码跳转等功能会比较常用,我们把快捷键配置成和MonoDeveloper中一样。选择菜单:Sublime Text & Package Settings & OmniSharp & KeyBindings User,替换成以下内容并保存(感谢余老板提供:))。
{"command": "omni_sharp_go_to_definition", "keys": ["super+d"]},
{"command": "omni_sharp_rename", "keys": ["alt+r"]},
{"command": "omni_sharp_find_usages", "keys": ["shift+super+r"]},
{"command": "omni_sharp_format_document", "keys": ["super+k"]},
{"command": "omni_sharp_code_actions", "keys": ["alt+enter"]},
{"command": "omni_sharp_new_file", "keys": ["super+alt+ctrl+c"], "args":{"paths": []}},
{"command": "omni_sharp_new_file", "keys": ["super+alt+ctrl+i"], "args":{"tmpltype":"interface","paths": []}},
{"command": "omni_sharp_hide_panel", "keys": ["alt+x"]},
{"command": "omni_sharp_show_panel", "keys": ["alt+z"]},
{"command": "omni_sharp_type_lookup", "keys": ["alt+`"]},
{"command": "omni_sharp_run_unit_tests", "keys":["ctrl+shift+r"]},
{"command": "omni_sharp_build_project", "keys":["super+alt+b"]},
{"command": "omni_sharp_reload_solution", "keys": ["super+option+r"]},
{"command": "omni_sharp_fix_usings", "keys": ["option+super+u"]}
经过以上步骤,Sublime for Unity3D的环境就搭建完成,请自行试一下自动补全、编译等功能是否OK。这样除了断点调试,可以把MonoDeveloper晾一边了:P
补充:第一次建立工程时,需要用MonoDeveloper来生成sln文件。
刀的真意不在杀,在于藏6577人阅读
Unity3D(24)
Unity3D_插件(2)
在阅读本教程之前,你需要对Unity的操作流程有一些基础的认识,并且最好了解内置的GUI系统如何使用。
如何让编辑器运行你的代码
Unity3D可以通过事件触发来执行你的编辑器代码,但是我们需要一些编译器参数来告知编译器何时需要触发该段代码。
代码里可以访问到当前选中的内容(通过Selection类),并据此来确定显示视图。
[MenuItem(XXX)]声明在一个函数上方,告知编译器给Unity3D编辑器添加一个菜单项,并且当点击该菜单项的时候调用该函数。[ContextMenu(&XXX&)]声明在类上方,可以向你的上下文菜单()中添加一个菜单项。[ExecuteInEditMode]声明在类上方来通知编译器,该类的OnGUI和Update等函数在编辑模式也也会被调用。[AddComponentMenu(&XXX/XXX&)]来把该脚本关联到Component菜单中,点击相应菜单项即可为GameObject添加该Component脚本。
开始编写编辑器
为了避免不必要的包含,Unity3D的运行时和编辑器类分辨存储在不同的Assemblies里(UnityEngine和UnityEditor)。当你准备开始编写编辑器之前,你需要using UnityEditor来导入编辑器的名称空间。&
有些代码可能是运行时和编辑器都需要执行的,如果你想在其中加以区分,那么可以使用#if UNITY_EDITOR ... #endif宏来对编辑器代码做特殊处理。&
在你开始真正编写代码之前,我认为你还需要知道所有放在命名为Editor目录下的脚本会在其它脚本之后进行编译,这方便了你去使用那些运行时的内容。而那些目录下的脚本是不能访问到Editor目录下的内容的。所以,你最好把你的编辑器脚本写在Editor目录下。
如何创建自定义编辑器窗口&
创建你的窗口&
如果你想自定义一个可编辑的面板,那么你需要编写一个继承自EditorWIndow的类。通常情况下,你还需要写一个[MenuItem]来告知编译器何时打开这个面板。这个事件的回调应该是一个静态方法,并且返回一个窗口的实例。
现在,当你点击对应的菜单项时,会弹出一个空白的窗口。并且你可以像Unity3D编辑器预制的窗口一样随意拖动和停靠。下面来看看我们如何来在窗口内实现我们想要的功能吧。
扩展你的窗口&
和运行时的GUI一样,如果你需要在窗口中添加交互控件,那么必须重写OnGUI方法。
具体的重写方式和运行时的GUI一样,你甚至可以使用任何扩展自原生GUI系统的插件(例如iGUI和GUIX)来简化你的插件开发流程(仅经过初步测试,更深层次的可用性尚待验证)。同时UnityEditor名称空间下的EditorGUILayout在原生GUI之上提供了一些更方便的接口和控件,让你可以轻松的使用一些编辑器特有的UI控件。&
除了OnGUI外,你可能还会需要如下一些回调来触发某些具体的逻辑(完整的列表请参考官方文档):
OnSelectionChange,但你点选物品时触发&OnFocus /OnLostFocus,获得和失去焦点时触发&
进一步扩展你的窗口&
自定义控件&
和运行时GUI的使用方式一样,如果你打算自定义自己的控件,那么最简单的方式就是实现一个静态方法(也可以不是静态的),并提供一些可选参数,在方法内部根据这些参数来完成对控件的布局(就像你在OnGUI中做的一样)。&
如果你打算把自定义控件实现在窗口类内部,你可以使用Partial类来更好的管理你的代码。&
绘制2D内容(绘制图片)可以使用GUI.DrawTexture来完成对图片资源的绘制。&绘制基础图元GUI本身并没有提供绘制基础图元的方法,但是可以通过一些方式来封装出这些方法。&绘制线段:通过一个像素的贴图资源配合GUI.DrawTexture和矩阵旋转来完成线段的绘制。绘制矩形框:通过GUI.Box和样式设置来封装出对矩形框和矩形填充框。
资源选择器
EditorLayout.ObjectField控件提供一个资源选择逻辑,生成时需要指定某种资源类型。然后你可以拖动该种资源到该控件或点击控件旁边的小圆圈进行列表进行选择。&
如何存储编辑内容&
你可能需要创建一个继承自SerializedObject的类来保存编辑的数据。继承自SerializedObject的对象能用于存储数据而不参与渲染,并可以最终打包到AssetBundle。 针对当前的编辑选项等内容的存储,可能需要另外一个SerializedObject类(和具体的系统设计相关)。&
向导式的编辑窗口&
在很多情况下可能你都会需要一个有很多参数的编辑面板,然后在编辑结束后有一个按钮加以确认。这你不用自己来实现,UnityEditor提供了ScriptableWizard来帮助你快捷的进行开发。 他是继承自EditorWindow的,所以他们的使用是很类似的。不过注意,当你点击确认按钮时,OnWizardCreate()会被调用。另外,ScriptableWizard.DisplayWizard可以帮助你生成并显示出该窗口。&
如何扩展INSPECTOR面板
当你在Unity3D中点选一个对象时,Inspector面板会随即显示出此对象的属性。我们可以针对某个类型的对象扩展该面板,这在为Unity3D开发插件时是非常有用的。&
定义INSPECTOR何时被触发
自定义的Inspector面板需要继承Editor类。由于功能相对具体,所以你无需定义代码何时被触发,对应代码会在你点击它所对应的物体时自动执行。 那么如何定义它所对应的类型呢?只需要在你的类定义之前通过编译器的命令[CustomEditor(typeof(XXX))]就可以完成这项工作了。&
访问被编辑的对象&&
在Inspector视图中,我们经常需要访问正在被编辑的对象。Editor类的成员变量target正是提供了这一关联。 &尽管如此,需要注意target是一个Object类型的对象,具体使用时可能需要类型转换(可以使用C#的泛型来避免重复的类型转换)。&
实现你自己的INSPECTOR界面&
扩展Editor与扩展EditorWindow唯一的不同在于你需要重写的是OnInspectorGUI而不是OnGUI。另外,如果你想绘制默认的可编辑项,只需调用DrawDefaultInspector即可。&
在SCENE界面定义编辑句柄&
当选中一个物体的时候,可能我们希望在Scene视图里也能定义一些编辑或展现。这一工作可以通过OnSceneGUI和Handle类来完成。OnSceneGUI用来处理来自Scene视图的事件,而Handle类用来在Scene视图实现一些3D的GUI控件(例如控制对象位置的Position控制器)。 具体的使用方式可以参考官方的参考文档。&
一些常用的功能说明:
AssetDatabase.CreateAsset可以帮住你从资源目录中创建一个资源实例。Selection.activeObject返回当前选中的对象。&EditorGUIUtility.PingObject用来实现在Project窗口中点击某一项的操作。Editor.Repaint用来重绘界面所有的控件。XXXImporter用来设置某种资源的具体导入设置(例如在某些情况下你需要设置导入的贴图为可读的)。&EditorUtility.UnloadUnusedAssets用于释放没有使用的资源,避免你的插件产生内存泄漏。&Event.Use用来标记事件已经被处理结束了。&EditorUtility.SetDirty用来通知编辑器数据已被修改,这样在下次保存时新的数据将被存储。&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:486825次
积分:4641
积分:4641
排名:第6457名
原创:55篇
转载:12篇
评论:52条
(1)(1)(3)(1)(1)(2)(1)(1)(2)(1)(2)(4)(2)(1)(2)(1)(5)(1)(1)(2)(1)(2)(4)(3)(10)(7)(3)(4)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 unity 剧情编辑器 的文章

更多推荐

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

点击添加站长微信