Unity3D插件开发教程(四):获取地址组件

news2024/11/24 5:52:31

Unity3D插件开发教程(四):获取地址组件

前言

前几天做导出安装包插件时,遇到了个问题,我需要获取地址,可是每次都要手动填入(复制粘贴)地址是个很费时不讨好的事,所以我就写了一个获取地址的小组件。 样子就是这样的:

一个文本和一个按钮,文本显示选择的路径(路径为空时显示提示语,并且无法选择),点击按钮打开面板选择文件夹。

声明

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

知识要点

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

使用版本

  • Unity3D 5.3.3

目标

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

准备

整个插件的结构:

在开始写主要逻辑之前,我们先要做准备工作,那就是,怎么打开下图这个窗口(系统选择文件夹的窗口)。

我在网上搜了一下“Unity3d 如何选择文件夹”的资料,发觉都是要导入一个System.Windows.Forms.dll,然后调用OpenFileDialog。 可是这种方式很不优雅,所以我就去找api,发现了原来EditorUtility是有操作外部文件的方法(项目内部使用AssetDatabase)。EditorUtility里面的OpenFilePanel()OpenFolderPanel()方法就是今天我们要用到的,选择文件和选择文件夹。

代码:

准备工作好了,那么接下来就是正式的代码逻辑了,我们先创建一个GUIExtendWindow的窗口类,之前的教程已经教了很多次了,这里就不再叙述了。

然后申明一个字段“_folderPath”用于后面保存路径。

public class GUIExtendWindow : EditorWindow
{
    [MenuItem("Tools/GUIExtend")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<GUIExtendWindow>("GUIExtend");
    }

    private string _folderPath;
}

接下来就是今天的主角————OpenFolderPanelField()方法。我们要把按钮和文本的逻辑都封装在这个方法里面。首先先看看整个方法的代码。

/// <summary>
/// 
/// </summary>
/// <param name="path">选择的路径</param>
/// <param name="buttonLabel">按钮上的文字</param>
/// <param name="tips">提示</param>
/// <returns></returns>
private string OpenFolderPanelField(string path, string buttonLabel, string tips)
{
    bool disabled;

    string content;

    if (string.IsNullOrEmpty(path))
    {
        disabled = true;

        content = tips;
    }
    else
    {
        disabled = false;

        content = path;
    }

    EditorGUILayout.BeginHorizontal();

    EditorGUI.BeginDisabledGroup(disabled);
    EditorGUILayout.TextArea(content, EditorStyles.label);
    EditorGUI.EndDisabledGroup();

    if (GUILayout.Button(buttonLabel, GUILayout.Width(100)))
    {
        string currentDirectory;

        if (string.IsNullOrEmpty(path))
        {
            currentDirectory = Directory.GetCurrentDirectory();
        }
        else
        {
            currentDirectory = path;
        }

        path = EditorUtility.OpenFolderPanel(tips, currentDirectory, "");
    }

    EditorGUILayout.EndHorizontal();

    return path;
}

三个参数的作用注释已经说明了,而参数部分是可以根据你功能自定义的,你可以替换成GUIContent类型,也可以删除或增加,这就看具体要做到什么的效果了。

接着是判断路径参数是否为空。空的话,文本内容显示为tips,无法选择。不为空,文本内容显示路径,可以选择。

EditorGUILayout.BeginHorizontal()方法之前的文章提到过,是水平布局的一个组件。 这些组件都是一对对的,有Begin就有End。例如BeginDisabledGroup()/EndDisabledGroup(),这是个禁用组件,如果参数为true,包含着的组件都会变成禁用状态。

在禁用组件中间我们绘制一个TextArea组件,样式是EditorStyles.label,这样,原本是文本就不会显示文本框,而又可以选择文本。

接着是点击按钮的逻辑,首先是准备一个默认目录待会打开,默认打开path,如果path为空,则获取项目的目录。

然后我们就可以是使用OpenFolderPanel打开面板了,第一个参数为窗口的标题,第二个参数为默认打开的文件夹目录,第三个参数选择的文件夹的默认名字。使用很简单,用一下就可以了。然后这个方法会回调一个你选择的文件夹的绝对地址。然后我们赋值到参数path里,最后返回。

组件封装完毕了,接下来就是使用了,使用也很简单,跟EditorGUILayout的方法一样使用就行了。

void OnGUI()
{
    _folderPath = OpenFolderPanelField(_folderPath, "Select Folder", "please select Folder");
}

最后

其实,Unity3D的GUILayoutEditorGUILayout等类都是采用上述的方法将多个组件(内容)封装在一起。 所以这种封装的方法我建议是写在一个类里面,然后变成静态函数,这样就可以任何地方都能使用。例如笔者就用了一个EditorGUILayoutExtend作为封装组件的类。

有人问到,如果我不是选择文件夹,而是选择文件怎么办,其实做法也是一样的,当然,我也会在源代码里面把选择文件的逻辑加上。

源代码

==========================分割线==========================

如果大家有什么意见和建议,或者是有什么疑问,或者是有想看的知识点内容,都欢迎到评论区发上你们的评论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1840910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Ubuntu 18.04.4 LTS上安装 netmap

文章目录 步骤运行配置文件编译安装使用netmap 步骤 sudo su sudo apt-get update sudo apt install build-essential sudo apt-get install -y git sudo apt-get install -y linux-headers-$(uname -r)rootVM-20-6-ubuntu:/home/ubuntu/netmap/LINUX# git clone https://gith…

3dmax怎么渲染又快又清晰?

在3ds Max中&#xff0c;追求快速且清晰的渲染效果是每个设计师的目标。云渲染技术的出现&#xff0c;为这一目标提供了强大的支持。通过云渲染&#xff0c;设计师能够利用远程服务器的强大计算能力&#xff0c;实现快速渲染&#xff0c;同时保持图像的高清晰度。 一、3dmax怎么…

RAM + 串口的简单应用

REVIEW 之前已经学习过&#xff1a; RAM&#xff1a; RAM IP核配置_ip核 ram配置-CSDN博客 串口接收&#xff1a;Vivado 串口接收优化-CSDN博客 串口发送&#xff1a;Vivado 串口通信(UART)------串口发送_vivado串口收发实验-CSDN博客 按键&#xff1a;基于状态机的按键消抖实…

MTU 和 MSS 关系、 IP分片、TCP分段

从四层模型&#xff1a;链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;应用层说 一 、以太网V2格式数据帧 : 链路层 Destination Source Type DataAndPad FCS 6 6 2 46~1500 4 二、IP: 网络层 0 1 …

MySQL8,Navicat能登陆成功,密码却忘记了

执行成功的图&#xff1a; 以下为步骤&#xff1a;本文一共8个简单步骤。 环境&#xff1a;mysql8、window10、navicat11 1、打开本地电脑window10的命令窗&#xff08;俗称黑窗口&#xff09;&#xff0c;windowR 2、输入regegit&#xff0c;回车&#xff0c;打开注册表 3、…

哪里可以姓名设计免费签名?6个软件帮助你轻松设计签名

哪里可以姓名设计免费签名&#xff1f;6个软件帮助你轻松设计签名 这里有六个免费的软件和在线工具可以帮助您设计个性化的签名&#xff1a; 1.一键logo设计&#xff1a;这是一个功能强大且易于使用的设计工具&#xff0c;提供了丰富的签名设计模板和各种字体效果供选择。您可…

Kubernetes入门-Kubernetes集群构成

目录 前言 控制面板节点与工作节点 控制面板节点 工作节点 被托管的Kubernetes 用kubectl命令行工具管理Kubernetes 前言 前面说过&#xff0c;Kubernetes是云的操作系统顾名思义&#xff0c;它位于应用和基础设施之间Kubernetes运行在基础设施上&#xff0c;而应用运行…

手机录屏声音怎么录?2个小妙招教会你

手机录制好的视频怎么没有声音&#xff1f;你是否也遇到了这个难题&#xff1f;在日常生活中&#xff0c;手机录屏功能已经成为我们生活和工作中的得力助手。而录屏的声音&#xff0c;作为录屏功能的重要组成部分&#xff0c;更是为我们的录制体验增添了不少色彩。那么&#xf…

一文带你搞定Linux开发环境配置

Linux开发必备 万事先更新 sudo apt update && sudo apt upgrade安装gcc工具链 sudo apt install build-essential像mysql、nacos等等建议装docker里&#xff0c;数据挂载到宿主机&#xff0c;日志别挂&#xff0c;直接装本机哪天日志塞满了就要开始重装系统了 以下…

B端系统的UI框架选择,不要输在了起跑线,如何破?

所谓成也框架、败也框架&#xff0c;框架就是这么的优点和缺点鲜明&#xff0c;市面上的框架多如牛毛&#xff0c;谁家的最优秀呢&#xff1f;为何框架搞出来的UI界面同质化呢&#xff0c;如何避免这种情况&#xff0c;如何在框架的基础上进一步提升颜值和体验呢&#xff0c;本…

Go语言day1

下载go语言的安装程序&#xff1a; All releases - The Go Programming Language 配置go语言的环境变量&#xff1a; 写第一个go语言 在E:\go_workspace当前窗口使用cmd命令: 输入 go run test.go

茂名石油行业:可燃气体报警器校准检测守护安全新防线

茂名&#xff0c;作为广东省的重要石化基地&#xff0c;其石油行业的发展一直备受关注。 随着石油产业的蓬勃发展&#xff0c;气体泄露的风险也日渐突出&#xff0c;给企业的生产安全和员工的生命安全带来了不小的挑战。 在这一背景下&#xff0c;可燃气体报警器的重要性日益…

6月19日作业

思维导图 实现服务器连接多个客户端局域网 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),sever(new QTcpServer(this)) {ui->setupUi(this); }Widget::~Widget() {delete ui; }v…

Java 开发面试题精选:RocketMQ 一篇全搞定

前言 RocketMQ作为一个高性能、高可用的分布式消息和流处理平台&#xff0c;广泛应用于分布式系统中的解耦、异步通信和数据流处理场景。这篇文章我精选了一些关于RockerMQ面试题目&#xff0c;这些问题涵盖了RocketMQ的所有关键知识点&#xff0c;从基本概念到高级应用&#…

使用Flink接受kafka中的数据并对数据进行ETL

做这个开发是因为&#xff1a;在实际开发操作中&#xff0c;你的kafka主题中会有大量的数据但是需求并不需要所有数据&#xff0c;所有我们要对数据进行清洗&#xff0c;把需要的数据保存在flink流中&#xff0c;为下流的开发做好数据保障&#xff01; 首先创建工具类 再写一…

类注释规范

类注释规范 1.1.1 模板配置 模板路径&#xff1a;File–>settings–>Editor–>File and Code Templates–>Includes–>File Header  N A M E &#xff1a;设置类名&#xff0c;与下面的 {NAME}&#xff1a;设置类名&#xff0c;与下面的 NAME&#xff1a;设…

Java语法糖写法

一、函数式接口 1、Function函数式接口&#xff1a;有一个输入参数&#xff0c;有一个输出 2、断定型接口&#xff1a;有一个输入参数&#xff0c;返回值只能是布尔值&#xff01; 3、Consumer 消费型接口&#xff1a;只有输入&#xff0c;没有返回值 4、Supplier供给型接口&a…

电影美学复古胶片特效视频转场模板 | Premiere Pro 项目工程文件

这个Premiere Pro项目工程文件是一个电影美学胶片特效视频转场模板&#xff0c;每个过渡效果都散发出一种有机的怀旧魅力&#xff0c;让人回忆起经典电影卷轴和模拟摄影的独特美感。 项目特点&#xff1a; 胶片烧伤过渡效果&#xff1a;包括从微妙的闪烁到大胆的爆发&#xff…

Redis 主从同步

主从同步 很多企业没有使用Redis的集群&#xff0c;但是至少都做了主从。有了主从&#xff0c;当master挂掉的时候&#xff0c;运维让从库过来接管&#xff0c;服务就可以继续&#xff0c;否则master需要经过数据恢复和重启的过程&#xff0c;可能会拖很长时间&#xff0c;影响…

Ubuntu 24.04安装zabbix7.0.0图形中文乱码

当zabbix安装完成后&#xff0c;设置中文界面时&#xff0c;打开图形&#xff0c;中文内容会显示方框乱码&#xff0c;是因为服务器字体中没有相关的中文字体&#xff0c;需要更换。 1、找到中文字体&#xff0c;可以在网络上下载《得意黑》开源字体&#xff0c;也可以在windo…