Unity功能实现_打开Window的文件/文件夹

这篇具有很好参考价值的文章主要介绍了Unity功能实现_打开Window的文件/文件夹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🏆 个人愚见,没事写写笔记

🏆《博客内容》:Unity3D开发内容

🏆🎉欢迎 👍点赞✍评论⭐收藏

🔎目标:打开Window的文件/文件夹

☀️核心代码

public class DllOpenFileDialog
{
    [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
    public static extern bool GetOpenFileName([In, Out] OpenDialogFile ofn);

    [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
    public static extern bool GetSaveFileName([In, Out] OpenDialogFile ofn);

    [DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
    public static extern IntPtr SHBrowseForFolder([In, Out] OpenDialogDir ofn);

    [DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
    public static extern bool SHGetPathFromIDList([In] IntPtr pidl, [In, Out] char[] fileName);
}

GetOpenFileName和GetSaveFileName都是Windows API中的函数,它们都定义在comdlg32.dll中。这两个函数都是用来显示文件打开或保存对话框的。它们的区别在于,GetOpenFileName用于打开文件,而GetSaveFileName用于保存文件。

SHBrowseForFolder和SHGetPathFromIDList都是Windows API中的函数,它们都定义在shell32.dll中。这两个函数都是用来显示文件夹选择对话框的。它们的区别在于,SHBrowseForFolder用于显示文件夹选择对话框,而SHGetPathFromIDList用于将一个PIDL转换为一个路径名。文章来源地址https://www.toymoban.com/news/detail-783839.html

☀️具体实现

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;

public class WindowTool : MonoBehaviour
{
    private static WindowTool instance = null;

    private void Awake()
    {
        instance = this;
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            Debug.Log(GetPath());
        }

        if (Input.GetKeyDown(KeyCode.A))
        {
            Debug.Log(GetFilePath());
        }   
        
    }

    public string GetPath()
    {
        OpenDialogDir ofn2 = new OpenDialogDir();

        ofn2.pszDisplayName = new string(new char[2000]);
        ofn2.lpszTitle = "请选择文件夹";
        // ofn2.pidlRoot = IntPtr.Zero;
        IntPtr pidlPtr = DllOpenFileDialog.SHBrowseForFolder(ofn2);
        // return "";

        char[] charArray = new char[2000];
        for (int i = 0; i < 2000; i++)
            charArray[i] = '\0';

        DllOpenFileDialog.SHGetPathFromIDList(pidlPtr, charArray);
        string fullDirPath = new String(charArray);
        fullDirPath = fullDirPath.Substring(0, fullDirPath.IndexOf('\0'));

        fullDirPath += "\\";

        Debug.Log(fullDirPath);
        return fullDirPath;
    }

    public string GetFilePath()
    {
        string filepath = "";
        OpenDialogFile pth = new OpenDialogFile();
        pth.structSize = Marshal.SizeOf(pth);
        pth.filter = "All files (*.*)|*.*";
        pth.file = new string(new char[256]);
        pth.maxFile = pth.file.Length;
        pth.fileTitle = new string(new char[64]);
        pth.maxFileTitle = pth.fileTitle.Length;
        pth.initialDir = Application.dataPath; //默认路径
        pth.title = "请选择文件";
        pth.defExt = "";
        pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
        if (DllOpenFileDialog.GetSaveFileName(pth))
            // if (DllOpenFileDialog.GetOpenFileName(pth))
        {
            filepath = pth.file; //选择的文件路径; 
            Debug.Log(filepath);
        }

        return filepath;
    }

    public string GetFilePathTest()
    {
        string filepath = "";
        OpenDialogFile pth = new OpenDialogFile();

        if (DllOpenFileDialog.GetOpenFileName(pth))
        {
            filepath = pth.file; //选择的文件路径; 
            Debug.Log(filepath);
        }

        return filepath;
    }
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenDialogFile
{
    public int structSize = 0;
    public IntPtr dlgOwner = IntPtr.Zero;
    public IntPtr instance = IntPtr.Zero;
    public String filter = null;
    public String customFilter = null;
    public int maxCustFilter = 0;
    public int filterIndex = 0;
    public String file = null;
    public int maxFile = 0;
    public String fileTitle = null;
    public int maxFileTitle = 0;
    public String initialDir = null;
    public String title = null;
    public int flags = 0;
    public short fileOffset = 0;
    public short fileExtension = 0;
    public String defExt = null;
    public IntPtr custData = IntPtr.Zero;
    public IntPtr hook = IntPtr.Zero;
    public String templateName = null;
    public IntPtr reservedPtr = IntPtr.Zero;
    public int reservedInt = 0;
    public int flagsEx = 0;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenDialogDir
{
    public IntPtr hwndOwner = IntPtr.Zero;
    public IntPtr pidlRoot = IntPtr.Zero;
    public String pszDisplayName = null;
    public String lpszTitle = null;
    public UInt32 ulFlags = 0;
    public IntPtr lpfn = IntPtr.Zero;
    public IntPtr lParam = IntPtr.Zero;
    public int iImage = 0;
}

public class DllOpenFileDialog
{
    [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
    public static extern bool GetOpenFileName([In, Out] OpenDialogFile ofn);

    [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
    public static extern bool GetSaveFileName([In, Out] OpenDialogFile ofn);

    [DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
    public static extern IntPtr SHBrowseForFolder([In, Out] OpenDialogDir ofn);

    [DllImport("shell32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
    public static extern bool SHGetPathFromIDList([In] IntPtr pidl, [In, Out] char[] fileName);
}

🚀感谢:🎉欢迎 👍点赞✍评论⭐收藏

到了这里,关于Unity功能实现_打开Window的文件/文件夹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity3D小功能】Unity3D中在创建完项目后自动创建文件夹列表

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 随着项目开发的体量增大,要导入大量的素材、UI、模型之类的资源。 需要创建不同的文件夹进行整理

    2024年02月03日
    浏览(71)
  • Unity 获取文件夹引用并读取文件夹路径

    编辑器中的文件夹属于DefaultAssets类型的资源 EditorGUILayout.ObjectField 可以获取对象的引用 AssetDatabase.GetAssetPath可通过对象的实例id获取资源路径 DirectoryInfo 可获取目录内文件信息 Path.GetFileNameWithoutExtension 可获取无后缀的文件名 弹出窗口 选择文件夹 打印文件夹内文件名 点击文件

    2024年04月27日
    浏览(56)
  • Unity内文件夹详解

    Assets:这是Unity项目中包含所有资源的主要文件夹。这包括3D模型、纹理、声音、动画、脚本、场景等等。 Editor: 只在编辑器下使用。 包含Unity编辑器扩展的脚本和资源。这些扩展可以添加新的菜单项、工具栏按钮、面板等等,这些脚本会在Unity编辑器中运行而不会出现在游

    2024年02月04日
    浏览(43)
  • Unity的工程中文件夹介绍

    知乎上看篇文章,讲学一样的东西有两种入门方式,一种方式是从简单的学起,另一种方式是基础的学起。所谓不管简单还是基础,两个都要同样的学。 这篇内容介绍博主自己学到的Unity工程的目录结构相关内容,最终还是以Unity的官方文档为准。当然网上各类分享很多,博

    2024年02月01日
    浏览(48)
  • Unity中读取Json文件:基于Assets/Resources文件夹

    我好生气😤,Python,JS里面一两行代码能够搞定的Json读取,在Unity中使用C#读取Json文件超多坑,爬出来一个又来一个。 主要是JsonUtility.FromJson太不给力了。 最好的方式是,使用 https://github.com/jilleJr/Newtonsoft.Json-for-Unity 这个第三方库。详情见下。 Step 1: 先把对应的Json File放到

    2024年02月12日
    浏览(56)
  • 【Unity】读写ProjectSettings、UserSettings、Library文件夹中的文件

    【Unity】读写ProjectSettings、UserSettings、Library文件夹中的文件 AssetDatabase 类提供的 LoadAssetAtPath 方法和 CreateAsset 方法只能读写Assets、Packages文件夹中的资产,如果想要读写其他文件夹(ProjectSettings、UserSettings、Library等)中的资产,需要使用 UnityEditorInternal.InternalEditorUtility 类。

    2024年02月04日
    浏览(89)
  • Unity加载资源时的常用路径或文件夹

    加载资源或者下载资源时的常用路径,我们平常开发下用的是编辑器下的路径。 编辑器下使用的资源路径和Windows端打包后并没有什么区别。你在编辑器下写的资源路径代码,大概率是可以在Windows下无缝运行的,重点是移动端打包后使用的资源路径,和Windows的资源路径有所不

    2024年02月16日
    浏览(40)
  • unity | 图片放入指定文件夹自动变成sprite精灵模式

    一、理解我们要做的事         原本图片放入文件夹后是Default(默认)模式,但是需要大量处理图片的时候,我们希望它拖进去就是sprite模式 = 我们想修改unity原本的功能。 二、unity是允许我们去修改它本身的一些功能的,你可以定制属于你的unity         这需要用到UnityEdit

    2024年02月06日
    浏览(71)
  • Unity Editor 遍历指定文件夹下的所有prefab

    适用场景:                  查找指定文件夹下所有的prefab并找到所有引用的图片及路径。 步骤分析:                 1、通过guid获取资源路径                 2、获取文件夹中包含后缀为.prefab的路径                 3、编辑器下加载该资源(如果对资源有编辑的话

    2024年02月04日
    浏览(67)
  • qt 窗口实现打开文件夹浏览资源(纯代码实现,后附代码)

     新建 widget 项目可参考 QT入门初学者——如何新建一个工程项目(详细)_guuuuug的博客-CSDN博客_qt新建工程   实现界面,点击浏览会打开文件夹 选中文件,窗口显示文件名,文件路径 过长的文字会在最后显示...,鼠标悬浮在文字栏会显示全部文字。 点击右下角打开可以实现打

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包