Unity 利用System.IO 实现文件夹下的文件内容移动到其他区

本文探讨了在Unity中开发资源导入插件的过程,重点解决了跨区文件移动问题,通过代码实现了文件夹和相关联文件的完整导入,避免了材质丢失等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unity文件操作

最近想自己写个简单的资源导入插件,写了到关键部分之后发现,文件夹由于权限问题,不能跨区移动,但是文件可以,(问:为什么要导入文件夹而不是文件呢? 答:这样做会导致纹理材质丢失的问题,因为只导入文件,一些相关联的内容部分会丢失,就拿FBX格式模型来举例吧!如果只导入FBX格式模型文件,那么这个模型就会出现材质丢失,当然了 肯定不止这些东西了,为了避免这样的问题出现,所以我们才会在导入模型的时候选择相关联的内容全部导Unity中,这样才算一个该资源的全部内容,当然了 你也可以这么想 我可以框选所有相关联的文件内容导进来啊!这当然可以,但是我们写工具就是为了便携,更快的协助我们进行项目的开发的)。OK,到此为止,下面直接上代码。

using System;

using System.Collections.Generic;

using System.IO;

using UnityEngine;

class TestScript : MonoBehaviour {


    public List<string> folderVessel = new List<string>();

    public List<string> fileVessel = new List<string>();

    private protected string sourcePath = @"G:\TestFolder";//自定义路径

    private protected string targetPath = @"D:\use\Unity\UnityProjectPath\ToLeadModel\Assets\FBX\";//自定义路径

    private string _fn = null;

    private string fn = null;

    private void Start()
    {
        if (Directory.Exists(targetPath))
        {
            string[] folderName = sourcePath.Split('\\');
            for (int i = 0; i < folderName.Length; i++)
            {
                if (folderName.Length - i == 1)
                {
                    _fn = string.Concat(targetPath, "\\", folderName[i]);
                }
                else
                {
                    string ls = folderName[i];
                    fn = fn + ls + '\\';
                }
            }

            print(fn);//打印合并的路径是否正确

            Directory.CreateDirectory(_fn);

            getSourceFolder(sourcePath);

            for (int i = 0; i < folderVessel.Count; i++)
            {
                string tp = folderVessel[i].Replace(fn, targetPath);
                Directory.CreateDirectory(tp);
            }

            for (int i = 0; i < fileVessel.Count; i++)
            {
                string tf = fileVessel[i].Replace(fn, targetPath);
                File.Move(fileVessel[i], tf);
            }

            UnityEditor.AssetDatabase.Refresh();
        }
        else
        {
            return;
        }
    }

    void getSourceFolder(string folder)
    {
        getSourceFile(folder);
        string[] _dir = Directory.GetDirectories(folder);
        for (int i = 0; i < _dir.Length; i++)
        {
            folderVessel.Add(_dir[i]);
            getSourceFolder(_dir[i]);
        }
    }

    void getSourceFile(string path)
    {
        string[] files = Directory.GetFiles(path);
        for (int i = 0; i < files.Length; i++)
        {
            fileVessel.Add(files[i]);
        }
    }
}



这里我们文件夹需要在新的区上创建相对应的,而且还要存储好这些路径结构,而文件则可以直接move。当然了,我相信肯定会有更好及更高效的解决方案,这里还网众多看官指点。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值