一般我们需要把脚本绑定在GameObject上,然后在Inspector视图下对其进行序列化编辑。假如我想把多个GameObject显示在一个自定义windows中怎么办呢?
这里我做了一个例子,把GameObject绑定在场景上,绑定在文件夹上。 呵呵~
如下图所示,我把Hierarcy视图中的gameObject拖到了场景上。然后就可以直接对其进行编辑了。
上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
using UnityEngine; using System.Collections; using UnityEditor; using UnityEditorInternal; using System.Collections.Generic; [CustomEditor (typeof(UnityEditor.DefaultAsset))] public class CustomInspector : Editor { List<Data> datas = new List<Data> (); public override void OnInspectorGUI () { Event e = Event.current; string path = AssetDatabase.GetAssetPath (target); GUI.enabled = true; //if (path.EndsWith (".unity")) { Draw(); if (e.type == EventType.DragUpdated) { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; e.Use (); } if (e.type == EventType.DragPerform) { Object o1 = DragAndDrop.objectReferences [0]; if (o1 is GameObject) { datas.Add(new Data(){go = o1 as GameObject}); } } } } Vector2 scrollPos = Vector2.zero; void Draw() { scrollPos = EditorGUILayout.BeginScrollView(scrollPos); foreach(Data data in datas) { var editor = Editor.CreateEditor (data.go); data.fold =EditorGUILayout.InspectorTitlebar (data.fold, data.go); if(data.fold) { editor.OnInspectorGUI (); GUILayout.BeginHorizontal(); GUILayout.Space(20); GUILayout.BeginVertical(); foreach (Component c in data.go.GetComponents<Component> ()) { if (!data.editors.ContainsKey (c)) data.editors.Add (c, Editor.CreateEditor (c)); } foreach (Component c in data.go.GetComponents<Component> ()) { if (data.editors.ContainsKey (c)) { data.foldouts [c] = EditorGUILayout.InspectorTitlebar (data.foldouts.ContainsKey (c) ? data.foldouts [c] : true, c); if (data.foldouts [c]) data.editors [c].OnInspectorGUI (); } } GUILayout.EndVertical(); GUILayout.EndHorizontal(); } } EditorGUILayout.EndScrollView(); } void OnInspectorUpdate () { Repaint (); } class Data { public GameObject go; public bool fold = true; public Dictionary<Object , Editor> editors = new Dictionary<Object, Editor> (); public Dictionary<Object, bool> foldouts = new Dictionary<Object, bool> (); } } |
放到你的工程里就可以直接看到效果。 另外,这里我没做窗口数据的序列化 ,祝大家学习愉快。。
- 本文固定链接: https://www.xuanyusong.com/archives/3815
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
没明白怎么操作?????
我也第一次接触,花了点时间。
首先,复制脚本内容创建脚本,并创建 Editor 文件夹,并将脚本放于其下,准备操作即可。
如果你的版本不小于5 不大于 5.3 (测试版本5.6.0f3,有点小问题等会介绍)。
在 Project 面板中 选择 文件夹 或者 Scene文件,然后将 Hierarchy 面板中的 GameObject 拖进 Inspector 中即可看到效果。
如果你的版本大于5.3 出现 Scene 场景文件无法将 GameObject 拖进 Inspector 中的时候,则将第8行中的 DefaultAsset 更换为 SceneAsset 即可。
但是如此操作,则这个脚本无法同时对 文件夹 和 Scene 场景文件生效,不知 雨松大大 有没有什么解决办法。
把Hierarcy视图中的gameObject拖到了场景上 ???我的怎么不能拖动??
雨松大大,能把logo挡住的发出来么。。。或者loge设置一下透明度。。。
这个Logo放的位置挡住了…………
大大,UnityEditor.DefaultAsset,报错
这是unity5.X的API unity4没有
谢谢,那5.0以下,这里怎么写?