Unity学习笔记--在Editor下实现一个有下拉菜单的文件路径记忆功能(保姆级教程)

news2024/9/25 19:19:12

目录

    • 前言
    • 需求分析
    • 知识前提
      • 一、下拉菜单的实现
      • 二、选取对应文件夹路径
      • 三、写入到.txt文件
    • 完整代码

前言

最近需要在Unity编辑器下实现一个面板,有一个下拉菜单,其他人可以往这个下拉菜单里面添加一些文件夹路径,保证下次进来的时候能够直接通过这个面板获取到本地已经添加的文件夹路径。

需求分析

  1. 实现一个下拉菜单,能够选取本地已经添加的文件夹路径
  2. 提供一个添加文件夹路径的按钮,点击之后能够选取本地文件夹路径,添加到当前已有的文件夹路径列表中
  3. 提供文件写入功能,能够把当前内存中的文件夹路径写入硬盘,通俗点来说就是需要把变量内容保存到.txt文件中。

知识前提

一、下拉菜单的实现

首先关于下拉菜单的实现,查找Unity手册,发现有一个叫:EditorGUILayout.Popup的方法可以使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class SaveFileHistory : EditorWindow
{
    // 下拉列表的选项
    private string[] options = new string[] { "Option 1", "Option 2", "Option 3" };

    // 当前选中的选项
    private int selectedOption = 0;

    [MenuItem("Window/My Editor Window")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow(typeof(SaveFileHistory));
    }

    void OnGUI()
    {
        // 显示下拉列表
        selectedOption = EditorGUILayout.Popup("My Dropdown Menu", selectedOption, options);
    }
}

在这里插入图片描述

在这个示例代码中,首先定义了一个字符串数组 options,其中包含了下拉列表中的选项。然后,定义了一个整数变量 selectedOption,用于保存当前选中的选项。在 OnGUI() 方法中,使用 EditorGUILayout.Popup() 方法来显示下拉列表。EditorGUILayout.Popup() 方法的第一个参数是用于显示下拉列表的标签名称,第二个参数是当前选中的选项,第三个参数是下拉列表的选项。

当用户选择了一个新的选项时,selectedOption 变量会被更新,可以在代码中使用它来执行相应的操作。

需要注意的是,这个示例代码是一个继承自 EditorWindow 的自定义编辑器窗口。你可以在 Unity 编辑器中选择 “Window/My Editor Window” 菜单来打开这个窗口。在这个窗口中,会显示一个下拉菜单,用户可以选择一个选项。这个示例演示了如何在自定义编辑器窗口中创建一个简单的下拉菜单,但是它的效果比较简单,可能无法满足复杂的需求。如果需要更复杂的下拉菜单效果,可以考虑使用其他的 Unity 编辑器扩展技术。

二、选取对应文件夹路径

要选取,那么肯定就需要让用户选取本地的路径,我们可以使用EditorUtility.OpenFolderPanel
新建一个脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class OpenFolderPanelTest : EditorWindow
{
    // 下拉列表的选项
    private string[] options = new string[] { "Option 1", "Option 2", "Option 3" };

    // 当前选中的选项
    private int selectedOption = 0;

    [MenuItem("Window/OpenFolderPanelTest")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow(typeof(OpenFolderPanelTest));
    }

    void OnGUI()
    {
        GUILayout.BeginHorizontal();

        if (GUILayout.Button("浏览", GUILayout.Width(100f)))
        {
            string temp_path = EditorUtility.OpenFolderPanel("添加常用文件夹路径",  "Assets/Resources", "");
            if (!temp_path.Equals(""))
            {
                Debug.Log(temp_path);
            }
            else
            {
                Debug.LogWarning("未选择文件夹");
            }
        }

        GUILayout.EndHorizontal();
    }
}

在这里插入图片描述

三、写入到.txt文件

这个就没什么好说的了,简单讲讲思路
首先定义一个List,用户点击浏览之后,选中文件夹路径,那么List.Add路径就好了
然后利用File IO保存到.txt文件中就好了

完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;

public class SaveFileHistory : EditorWindow
{
    private const string history_content_file_path = "Assets/Resources/save_file_history.txt";
    private string target_folder_path = "";
    private int selected_folder_index = 0;
    private string[] history_file_path_array = null;

    [MenuItem("Window/My Editor Window")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow(typeof(SaveFileHistory));
    }

    private void OnGUI()
    {
        GUILayout.BeginHorizontal();
        {
            string[] show_history_file_path_array = GetShowHistoryFilePathArray();
            selected_folder_index = EditorGUILayout.Popup("", selected_folder_index, show_history_file_path_array);

            if (history_file_path_array.Length != 0)
            {
                target_folder_path = history_file_path_array[selected_folder_index];
            }

            if (GUILayout.Button("浏览", GUILayout.Width(100f)))
            {
                string temp_path = EditorUtility.OpenFolderPanel("添加常用文件夹路径", "", "");
                if (!temp_path.Equals(""))
                {
                    target_folder_path = temp_path;
                    AppendSavePrefabHistoryPath(target_folder_path);
                    // 更新history_file_path_array
                    history_file_path_array = GetHistoryFilePathArray();
                }
                else
                {
                    Debug.LogWarning("未选择文件夹");
                }
            }
        }
        GUILayout.EndHorizontal();



        GUILayout.BeginHorizontal();
        {
            if (GUILayout.Button("打印当前选中的文件夹路径", GUILayout.Width(200f)))
            {
                Debug.Log(target_folder_path);
            }
        }
        GUILayout.EndHorizontal();


    }

    private void AppendSavePrefabHistoryPath(string append_history_file_path)
    {
        history_file_path_array = GetHistoryFilePathArray();
        List<string> history_file_path_list = new List<string>();

        //当前选中的放到第一个
        history_file_path_list.Add(append_history_file_path);
        //原来的文件路径放后
        foreach (string history_file_path in history_file_path_array)
        {
            //重复的不添加
            if (!history_file_path.Equals(append_history_file_path))
            {
                history_file_path_list.Add(history_file_path);
            }
        }

        //先清空
        File.WriteAllText(history_content_file_path, "");
        //再添加
        File.AppendAllLines(history_content_file_path, history_file_path_list);
    }

    /// <summary>
    /// `EditorGUILayout.Popup()` 方法默认使用空格作为下拉菜单中选项之间的分隔符。
    /// 这意味着,如果你将文件路径作为选项添加到下拉菜单中,路径中的斜杠 `/` 将被解释为分隔符,从而导致菜单显示异常。
    /// 为了解决这个问题,你可以将文件路径中的斜杠 `/` 替换为其他字符,比如 `-` 或者 `|`,然后在菜单的回调函数中将这些字符再替换回斜杠 `/`。
    /// </summary>
    /// <returns></returns>
    private string[] GetShowHistoryFilePathArray()
    {
        history_file_path_array = GetHistoryFilePathArray();
        string[] show_history_file_path_array = new string[history_file_path_array.Length];

        System.Array.Copy(history_file_path_array, show_history_file_path_array, history_file_path_array.Length);

        for (int i = 0; i < show_history_file_path_array.Length; i++)
        {
            show_history_file_path_array[i] = show_history_file_path_array[i].Replace('/', '\\');
        }
        return show_history_file_path_array;
    }

    private string[] GetHistoryFilePathArray()
    {
        if (!File.Exists(history_content_file_path))
        {
            File.WriteAllText(history_content_file_path, "");
        }
        return File.ReadAllLines(history_content_file_path);
    }
}

在这里插入图片描述
验证文件记忆功能,第二次进入,还能显示之前选中的文件夹路径
在这里插入图片描述

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

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

相关文章

Linux SPI-NAND 驱动开发指南

文章目录Linux SPI-NAND 驱动开发指南1 概述1.1 编写目的1.2 适用范围1.3 相关人员3 流程设计3.1 体系结构3.2 源码结构3.3 关键数据定义3.3.1 flash 设备信息数据结构3.3.2 flash chip 数据结构3.3.3 aw_spinand_chip_request3.3.4 ubi_ec_hdr3.3.5 ubi_vid_hdr3.4 关键接口说…

webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题

webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题 文章目录webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题记录个iusse. 插入音频数据后,GetAudioInternal 进行操作决策: Normal&#xff1a;正常播放。 Acceleration&#xff1a;变声不变调的减速播放算法。 Pr…

【学习笔记】互联网金融:芝麻信用分的建模过程

学习资料&#xff1a; 数据分析学习随记 | 互联网金融行业2C授信模型(芝麻信用) 1. 背景 互联网金融的本质是风控。 1.1 数据分析师的角色 数据分析师在金融行业基本上有两种角色&#xff1a; 1.1.1 数据建模师 偏算法&#xff0c;但要很懂业务。要求对算法的理解较深&am…

电子标签播种墙方案

一、PTL优势&#xff1a; 二、系统构架&#xff1a; v1.2基站软件管理系统仓库标签v1.4仓库标签三、基站特点&#xff1a; 接收PC下达的操作指令&#xff0c;解析后再通过RF发送给电子标签 无线通讯距离30m无线通信速率200/50kbps网络通信速率10/100 Mbps自定义双向数据通讯协…

接口测试很难?3分钟带你入门接口自动化测试

1、什么是接口&#xff1f; 接口是连接前台和后台的桥梁&#xff0c;前台通过接口调用后端已完成的功能&#xff0c;而无需关注内部的实现细节。借助于接口&#xff0c;可以实现前后台分离&#xff0c;各自完成开发工作后&#xff0c;进行联调&#xff0c;提高工作效率。 2、接…

开学季电容笔怎么选?学生党高性价比电容笔推荐

或许许多人会认为苹果Pencil是无可取代的&#xff0c;但是我认为这压感取决于我们的预算和需求。要是我们对于绘画没有过高的要求的话&#xff0c;其实可以选择使用平替电容笔&#xff0c;而没必要入手apple pencil。为了让你对电容笔有更多的认识&#xff0c;我接下来推荐几款…

Flutter第三方插件objectbox的使用

Flutter基础 demo地址 参考地址 文章目录Flutter基础前言一、demo效果图二、objectbox是什么&#xff1f;三、objectbox的使用1.在pubspec.yaml文件中添加2.执行flutter pub get命令3.创建数据库模型4.执行flutter pub run build_runner build 命令5.如果报错则执行flutter pu…

Renderdoc中一个daraw的API调用以及其作用

分析renderdoc中一个draw调用的api接口&#xff0c;如下是一个draw调用的渲染api的过程&#xff0c;下面来分析一下这几个函数的作用。 PSSetShaderResources、VSSetShader、PSSetShader这三个方法在renderdoc调用过程使用的方法&#xff0c;这三个方法的做法分别如下&#xff…

【华为OD机试模拟题】用 C++ 实现 - 日志采集系统(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

NMS详解

(类别&#xff0c;坐标1&#xff0c;坐标2&#xff0c;坐标3&#xff0c;坐标4&#xff0c;类别分数) step1&#xff1a;对最后一列分数进行排序 &#xff0c;可以看到类别就被打乱了 step2&#xff1a; 弹出得到selected_bboxes作为基准&#xff0c;减少bbox_list。其实就是准…

寻路库recastnavigation改造

本文是介绍对寻路库recastnavigation 改造&#xff0c;使得使用更加友好。 Git仓库: https://github.com/jiangguilong2000/recastnavigation 首先&#xff0c;我们要做一些前置操作 SDL: 开放源代码的跨平台多媒体开发库 Premake&#xff1a;量跨平台构建系统 环境: VS 2019…

国内知名插画培训机构有哪些,学习插画怎么选培训班

国内知名插画培训机构有哪些&#xff1f;给大家梳理了国内5家专业的插画师培训班&#xff0c;最新无大插画班排行榜&#xff0c;各有优势和特色&#xff01; 一&#xff1a;国内知名插画培训机构排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日系插画、游戏原画…

Linux 计划任务讲解

目录 计划任务 一次性计划任务 长期性计划任务 计划任务 管理员可以编辑自己的和普通用户的计划任务 普通用户只可以编辑自己的计划任务 计划任务根据执行方式分为一次性计划任务、长期性计划任务 一次性计划任务 此计划只执行一次&#xff0c;执行后或就不会再执行了 通…

项目管理之三点估算(正态分布)

三点估算法主要来自于项目的计划评审技术 PERT&#xff0c;能评估时间与概率的关系。 三点估算法不仅可以用于定量风险分析&#xff0c;也可用于进度管理中活动历时估算。先记住几个概念&#xff1a;最乐观时间TO&#xff1a;完成该工作最少需要的时间&#xff1b;最悲观时间TP…

R统计绘图-PCA详解1(princomp/principal/prcomp/rda等)

此文为《精通机器学习&#xff1a;基于R》的学习笔记&#xff0c;书中第九章详细介绍了无监督学习-主成分分析(PCA)的分析过程和结果解读。 PCA可以对相关变量进行归类&#xff0c;从而降低数据维度&#xff0c;提高对数据的理解。分析的主要目的一般是&#xff1a;1)识别数据…

CVPR2022 | ABINet+: 似人阅读: 场景文本识别的自主、双向和迭代语言建模

论文标题&#xff1a;ABINet&#xff1a;Read Like Humans: Autonomous, Bidirectional and Iterative Language Modeling for Scene Text Recognition代码&#xff1a;https://github.com/FangShancheng/ABINet链接&#xff1a;https://arxiv.org/abs/2103.06495一、AbstractH…

Linux 安装php环境

1.下载php wget http://am1.php.net/distributions/php-7.3.2.tar.gz 2.解压 tar -zxvf php-7.3.2.tar.gz 3.安装扩展 接下来进行参数配置&#xff0c;配置前如果没有libxml2和libxml2-devel会报错&#xff0c;所以应该更新libxml2并安装libxml2-devel&#xff0c;使用在线…

C++回顾(一)——从C到C++

前言 在学习了C语言的基础上&#xff0c;C到底和C有什么区别呢&#xff1f; 1.1 第一个C程序 #include <iostream>// 使用名为std的命名空间 using namespace std;int main() {// printf ("hello world\n");// cout 标准输出 往屏幕打印内容 相当于C语言的…

ELK日志分析--Kibana

Kibana 概述 部署安装浏览页面并使用 1.Kibana 概述 Kibana-是进入Elastic的窗口使用Kibana&#xff0c;可以 1 搜索&#xff0c;观察和保护。 从发现文档到分析日志再到发现安全漏洞&#xff0c;Kibana是您访问这些功能及其他功能的门户。 2 可视化和分析您的数据。 搜索隐藏的…

github ssh密钥配置,克隆远程仓库

GitHub的SSH配置 在往github上push项目的时候&#xff0c;如果走https的方式&#xff0c;每次都需要输入账号密码&#xff0c;非常麻烦。而采用ssh的方式&#xff0c;就不再需要输入&#xff0c;只需要在github自己账号下配置一个ssh key即可&#xff01; 很多朋友在用github管…