请选择 进入手机版 | 继续访问电脑版
前言

前几天做导出安装包插件时,遇到了个问题,我需要获取地址,可是每次都要手动填入(复制粘贴)地址是个很费时不讨好的事,所以我就写了一个获取地址的小组件。 样子就是这样的:
Unity3D插件开发教程(四):获取地址组件-1.jpg
Unity3D插件开发教程(四):获取地址组件-2.jpg
一个文本和一个按钮,文本显示选择的路径(路径为空时显示提示语,并且无法选择),点击按钮打开面板选择文件夹。

声明

    欢迎分享本文本文未经允许不能以任何形式转载。


知识要点

    组合GUI组件EditorGUI.BeginDisabledGroup()/EndDisabledGroup()EditorUtility.OpenFolderPanel()

使用版本

    Unity3D 5.3.3

目标

    如何把多个组件封装在一起,组合成自己需要用的组件,然后一句代码就可以调用
准备

整个插件的结构:
Unity3D插件开发教程(四):获取地址组件-3.png
在开始写主要逻辑之前,我们先要做准备工作,那就是,怎么打开下图这个窗口(系统选择文件夹的窗口)。
Unity3D插件开发教程(四):获取地址组件-4.jpg
我在网上搜了一下“Unity3d 如何选择文件夹”的资料,发觉都是要导入一个System.Windows.Forms.dll,然后调用OpenFileDialog。 可是这种方式很不优雅,所以我就去找api,发现了原来EditorUtility是有操作外部文件的方法(项目内部使用AssetDatabase)。EditorUtility里面的OpenFilePanel()OpenFolderPanel()方法就是今天我们要用到的,选择文件和选择文件夹。
代码:
准备工作好了,那么接下来就是正式的代码逻辑了,我们先创建一个GUIExtendWindow的窗口类,之前的教程已经教了很多次了,这里就不再叙述了。
然后申明一个字段“_folderPath”用于后面保存路径。
  1. [/code]接下来就是今天的主角————[b]OpenFolderPanelField()[/b]方法。我们要把按钮和文本的逻辑都封装在这个方法里面。首先先看看整个方法的代码。
  2. [code]
复制代码
三个参数的作用注释已经说明了,而参数部分是可以根据你功能自定义的,你可以替换成GUIContent类型,也可以删除或增加,这就看具体要做到什么的效果了。
接着是判断路径参数是否为空。空的话,文本内容显示为tips,无法选择。不为空,文本内容显示路径,可以选择。
EditorGUILayout.BeginHorizontal()方法之前的文章提到过,是水平布局的一个组件。 这些组件都是一对对的,有Begin就有End。例如BeginDisabledGroup()/EndDisabledGroup(),这是个禁用组件,如果参数为true,包含着的组件都会变成禁用状态。
在禁用组件中间我们绘制一个TextArea组件,样式是EditorStyles.label,这样,原本是文本就不会显示文本框,而又可以选择文本。
接着是点击按钮的逻辑,首先是准备一个默认目录待会打开,默认打开path,如果path为空,则获取项目的目录。
然后我们就可以是使用OpenFolderPanel打开面板了,第一个参数为窗口的标题,第二个参数为默认打开的文件夹目录,第三个参数选择的文件夹的默认名字。使用很简单,用一下就可以了。然后这个方法会回调一个你选择的文件夹的绝对地址。然后我们赋值到参数path里,最后返回。
组件封装完毕了,接下来就是使用了,使用也很简单,跟EditorGUILayout的方法一样使用就行了。
[code][/code]最后

其实,Unity3D的GUILayoutEditorGUILayout等类都是采用上述的方法将多个组件(内容)封装在一起。 所以这种封装的方法我建议是写在一个类里面,然后变成静态函数,这样就可以任何地方都能使用。例如笔者就用了一个EditorGUILayoutExtend作为封装组件的类。
有人问到,如果我不是选择文件夹,而是选择文件怎么办,其实做法也是一样的,当然,我也会在源代码里面把选择文件的逻辑加上。
源代码
==========================分割线==========================
如果大家有什么意见和建议,或者是有什么疑问,或者是有想看的知识点内容,都欢迎到评论区发上你们的评论。

最后我希望有更多人参与到插件开发的队伍里。也欢迎大家投稿。

QQ群:234204968
=========================最后的最后=======================
你们觉得好记得赞啊,觉得不好可以评论啊,不然我不知道到底有没有人在看啊/(ㄒoㄒ)/~~
分享到 :
0 人收藏

3 个回复

倒序浏览
血剑染江山.  中级会员 | 2018-11-9 09:45:57
问楼主个问题,如何定位到目录?如prefab 上的脚本,点一下unity就自动切换到该脚本的目录,代码怎么切换目录?
白笙  中级会员 | 2018-11-9 09:45:57
可能是文章中不明显,这篇文章教的是如何获取项目外部路径的。文章有提到“ 发现了原来EditorUtility是有操作外部文件的方法(项目内部使用AssetDatabase)。 ”。
然后文章复杂是因为要教会别人怎么去封装组件,以便下次重复调用。
悆。  高级会员 | 2018-11-9 09:45:57
SerializedObject so = new SerializedObject(pingObject);
SerializedProperty script = so.FindProperty("m_Script");
EditorGUIUtility.PingObject(script.objectReferenceInstanceIDValue);

pingObject为你脚本在Prefab上的实例化对象。

ps:本来打算以后教程再写出来的,怕你急用就先贴上来了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|翁笔

© 2001-2018 Wengbi.com

返回顶部