Unity复制资源目录并添加新的引用关系

news2024/9/24 5:28:33

有时候需要复制一个场景目录制作新的场景,打包场景也是独立资源,不希望资源复用。我们直接使用Ctrl+D复制资源,里面的预设,材质等都还是指向原有的,所以废话不多说,直接上代码。

操作窗口

首先是制作一个复制资源窗口
在这里插入图片描述

下面是脚本和菜单调用

在这里插入图片描述

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

public class ResCopyWin : EditorWindow
{
    public static ResCopyWin copyWin;
    //[MenuItem("JFrameWork/Resources/复制文件夹(复制依赖关系) %#D", false, 0)] Ctrl+Shift+D
    [MenuItem("JFrameWork/Resources/复制文件夹(复制依赖关系)", false, 0)]


    public static void CopyIt()
    {
        //否则就弹出面板设置

        copyWin = EditorWindow.GetWindow(typeof(ResCopyWin), true, "复制资源目录") as ResCopyWin;

        copyWin.ShowModalUtility();

    }


    string sourcePath = "Assets/";
    string toPath = "Assets/";


    private void OnGUI()
    {
        using (new GUILayout.VerticalScope())
        {
            EditorGUILayout.Space(10);
            EditorGUILayout.LabelField("原始路径:");
            sourcePath = EditorGUILayout.TextField(sourcePath, GUILayout.Width(180));


            EditorGUILayout.Space(10);
            EditorGUILayout.LabelField("目标路径:");
            toPath = EditorGUILayout.TextField(toPath, GUILayout.Width(180));



            EditorGUILayout.Space(10);
            if (GUILayout.Button("开始复制", GUILayout.Width(150), GUILayout.Height(20)))
            {
                OnOk();
            }
        }
    }

    void OnOk()
    {

        CopyFolderKeepAssetsUsingEditor.CopyDirectoryDeep(sourcePath, toPath);
    }


}

原始路径就是要复制的目录,目标路径就是复制出来的目录。

复制函数


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

public class CopyFolderKeepAssetsUsingEditor
{
    //[MenuItem("Tools/复制文件夹(复制依赖关系) %#D", false, 0)]

    //public static void CopyIt()
    //{
    //    CopyDirectoryDeep("Assets/scenes/1", "Assets/scenes/2");
    //}

    public static void CopyDirectoryDeep(string sourcePath, string destinationPath)
    {
        CopyDirectoryRecursively(sourcePath, destinationPath);

        List<string> metaFiles = GetFilesRecursively(destinationPath, (f) => f.EndsWith(".meta"));
        List<(string originalGuid, string newGuid)> guidTable = new List<(string originalGuid, string newGuid)>();

        foreach (string metaFile in metaFiles)
        {
            StreamReader file = new StreamReader(metaFile);
            file.ReadLine();
            string guidLine = file.ReadLine();
            file.Close();
            string originalGuid = guidLine.Substring(6, guidLine.Length - 6);
            string newGuid = GUID.Generate().ToString().Replace("-", "");
            guidTable.Add((originalGuid, newGuid));
        }

        List<string> allFiles = GetFilesRecursively(destinationPath);

        foreach (string fileToModify in allFiles)
        {
            string content = File.ReadAllText(fileToModify);

            foreach (var guidPair in guidTable)
            {
                content = content.Replace(guidPair.originalGuid, guidPair.newGuid);
            }

            File.WriteAllText(fileToModify, content);
        }

        AssetDatabase.Refresh();
    }

    private static void CopyDirectoryRecursively(string sourceDirName, string destDirName)
    {
        DirectoryInfo dir = new DirectoryInfo(sourceDirName);

        DirectoryInfo[] dirs = dir.GetDirectories();

        if (!Directory.Exists(destDirName))
        {
            Directory.CreateDirectory(destDirName);
        }

        FileInfo[] files = dir.GetFiles();
        foreach (FileInfo file in files)
        {
            string temppath = Path.Combine(destDirName, file.Name);
            file.CopyTo(temppath, false);
        }

        foreach (DirectoryInfo subdir in dirs)
        {
            string temppath = Path.Combine(destDirName, subdir.Name);
            CopyDirectoryRecursively(subdir.FullName, temppath);
        }
    }

    private static List<string> GetFilesRecursively(string path, Func<string, bool> criteria = null, List<string> files = null)
    {
        if (files == null)
        {
            files = new List<string>();
        }

        files.AddRange(Directory.GetFiles(path).Where(f => criteria == null || criteria(f)));

        foreach (string directory in Directory.GetDirectories(path))
        {
            GetFilesRecursively(directory, criteria, files);
        }

        return files;
    }
}

参考

https://discussions.unity.com/t/can-i-duplicate-folder-with-internal-dependencies-between-objects/119179/5

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

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

相关文章

电机控制器功率模块液冷散热参数计算

电机控制器功率模块液冷散热参数计算 1.概述2.热量与流量的关系3.功率模块损耗发热量计算4.案例计算 1.概述 该文档做为评估分析电机控制器功率模块在液冷散热条件下的相关参数参考计算说明。 2.热量与流量的关系 首先我们要确认产生热量的位置和数量。对于电机控制器来说&am…

DyFusion:基于动态融合的交叉注意三维目标检测 论文解析

目录 概况 创新点详解 1、跨注意力动态融合 Cross-Attention Dynamic Fusion &#xff08;1&#xff09;特征提取 &#xff08;2&#xff09;体素特征编码 &#xff08;3&#xff09; BEV特征提取 &#xff08;4&#xff09;特征动态融合 ①线性变换 ②对Q(BEV特征)和…

【CNN】卷积神经网络的相关介绍及计算

文章目录 传统神经网络结构卷积神经网络结构输入的区域大小计算特征值卷积结果计算公式卷积参数共享池化层最大池化特征图变化经典网络 传统神经网络结构 传统神经网络&#xff08;左边的图2D的&#xff09;可以叫wxb、全连接层、FC、MLP、多层感知机、多个线性层堆在一起&…

Python 爬虫入门(八):爬虫工程化及Scrapy简介「详细介绍」

Python 爬虫入门&#xff08;八&#xff09;&#xff1a;爬虫工程化及Scrapy简介「详细介绍」 前言1. Python1.1 Python 简介1.2 Python 爬虫的优势1.3 必须掌握的 Python 基础知识1.3.1 基本语法1.3.2. 函数和模块1.3.3 文件操作1.3.4 数据处理1.3.5 类和对象1.3.6 异常处理 2…

CAP+RabbitMQ

CAP&#xff08;C# APM for Microservices&#xff09;是一个开源的C#库&#xff0c;用于在分布式系统&#xff08;如SOA或微服务系统&#xff09;中实现事件总线及最终一致性&#xff08;分布式事务&#xff09;。CAP提供了多种消息队列&#xff08;MQ&#xff09;实现的支持&…

手把手教你写一个图形化的端口扫描工具

前言 关于学习群 由于我使用masscan进行纯端口扫描的时候&#xff0c;遇到扫描不出结果的情况&#xff0c;我就考虑了自己写一个端口扫描脚本&#xff0c;还挺好用。 库介绍 1、asyncio asyncio 是 Python 的一个库&#xff0c;用于编写单线程并发代码。使用 asyncio&#…

MacBook2024非常出色的虚拟机软件Parallels Desktop19.3中文免费版本

最近我被问得最多的一个问题就是&#xff1a;能不能在一台设备上同时使用Windows系统和macOS系统&#xff1f;答案当然是肯定的&#xff0c;你只需要一款虚拟机软件就能轻松实现。今天&#xff0c;我就来为大家安利一款非常出色的虚拟机软件——Parallels Desktop19。 这款软件…

【C++】模拟实现queue

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 ​​ 一.了解项目功能 &#x1f4cc;了解queue官方标准 在本次项目中我们的目标是模拟实现一个queue,先一起看一下C标准文档中queue的定义:cplusplus : C queue标准文档htt…

中英文字翻译,这几款软件值得收藏!

在这个全球化的时代&#xff0c;语言不再是沟通的障碍&#xff0c;而翻译软件则成为了我们跨越语言鸿沟的得力助手。今天&#xff0c;就让我们一起探索三款让英文翻译变得前所未有的简单与高效的神奇软件&#xff0c;无论是学习、工作还是旅行&#xff0c;它们都能成为你不可或…

kickstart无人值守以及pxe实现服务器自动部署

使用背景 在企业中安装多台操作系统时会面临的问题&#xff1a;当安装Linux操作系统时&#xff0c;安装过程会需要回答很多关于设定的问题 这些问题必须手动选择&#xff0c;否则无法进行安装 。当只安装1台Linux系统&#xff0c;手动选择设定工作量比较轻松 当安装多台Linux&a…

PSO_GA混合算法优化PID参数(附代码)

由于PSO算法本身的缺陷,其存在容易出现早熟收敛、后期迭代效率不高、搜索精度不高的问题,在线性递减惯性权重PSO算法的基础上,与GA遗传算法相结合,针对PSO易陷入局部最优,通过采用GA杂交变异的思想,增加了粒子的多样性,跳出局部最优,增强混合算法的全局搜索能力,提高搜…

完美解决pip命令版本冲突导致对应版本模块包无法安装的问题

解决步骤 使用pip更新/降低指定模块包命令格式降低pip自身至指定版本的命令再次换源安装指定模块包 在对 FasterNet 这篇论文源码复现过程中&#xff0c;我们首先需要安装相关依赖文件&#xff08; path/to/your/requirements.txt&#xff09; -extra-index-url https://down…

CentOS7 VMware虚拟机基于NAT配置网络IP

目录 前言 VMnet8 虚拟网络编辑 ens33 ping 防火墙 前言 平时学习时一直需要用到Linux服务器&#xff0c;一般都是在Windows上安装VMware来创建一个虚拟机。创建的虚拟机需要配置网络才能够访问外网&#xff0c;可以通过以下两种方式来配置虚拟机网络 桥接模式NAT模式&…

给儿童掏耳朵用什么工具好?TOP4机型实测数据大公开

作为一名专业的个护测评师&#xff0c;我深知宝宝掏耳朵是一件多难的事情&#xff0c;由于宝宝的耳朵属于盲区。在为他操作时&#xff0c;很容易伤及宝宝的耳膜。因此&#xff0c;帮宝宝掏耳朵时工具的选择非常的重要。然而市场上许多跨界大牌存在隐患。某些网红品牌&#xff0…

视频发光字体特效怎么做 会声会影字体怎么淡化退出 视频剪辑制作教程

视频字体样式在视频制作中起着重要的作用&#xff0c;它可以帮助传达信息、增强视觉吸引力、提供情感表达、强调关键信息和提供文化背景解读等。这篇文章以会声会影为例&#xff0c;来一起看看发光字体制作&#xff0c;字体怎么淡化退出等内容。 你可以在这里免费下载会声会影…

Spring-Kafka确认机制报错:No Acknowledgment available as an argument

问题出现 在spring boot集成kafka时报错&#xff0c;报错信息&#xff1a; No Acknowledgment available as an argument, the listener container must have a MANUAL AckMode to populate the Acknowledgment.翻译&#xff1a; Acknowledgment 参数不可用&#xff0c;监听…

thingsboard-3.6.4 源码编译运行

1.首先我们要检查我们所需要的环境是否全部安装&#xff0c;还有对应的版本&#xff0c;一定要按照项目要求的版本来&#xff0c;要不然你会给自己挖很多坑。 我们使用的是3.6.4的版本&#xff0c;下面的版本全是基于这个版本的。需要安装好已经配置环境变量。 这部分大家就自…

adaboost提升方法

集成学习&#xff1a;串联&#xff08;提升方法&#xff09;&#xff0c;并联&#xff08;随机森林&#xff09; Adaboost&#xff1a;分类加法模型&#xff08;更新样本权值&#xff0c;投票权值-由权值误差率决定&#xff09; 提升树&#xff1a;回归加法模型 &#xff08;…

Linux驱动开发—平台总线模型详解

文章目录 1.平台总线介绍1.1平台总线模型的组成部分1.2平台总线模型的优势 2.使用平台总线模型开发驱动2.1注册platform设备2.2注册platform驱动2.3效果演示 1.平台总线介绍 Linux 平台总线模型&#xff08;Platform Bus Model&#xff09;是一种设备驱动框架&#xff0c;用于…

软件测试老兵的十条生存法则

在当下的数字化时代&#xff0c;软件测试行业正经历快速的变革和发展。自动化测试、持续集成和持续交付&#xff08;CI/CD&#xff09;、人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;、云计算和DevOps等技术正在重塑软件测试的各个方面。这些变化不…