Unity 重置项目资源的guid

2023-05-16

有时需要将多个项目的资源合并到一个项目中,但有可能有些资源是共用的,它的guid是一样的,这样合并到一个项目时,可能会超成冲突。

如果要让每个资源的guid都不相同,就需要重新生成guid,并且更新引用。下面是步骤


1. UNITY菜单-> Editor > Project Setting - > Editor 

设置 Version Controller 为Visible Meta Files

2. Asset Serialization 设置为 Force Text

3. 下面是代码

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

namespace UnityGuidRegenerator {
    public class UnityGuidRegeneratorMenu {
        [MenuItem("Tools/Regenerate asset GUIDs")]
        public static void RegenerateGuids() {
            if (EditorUtility.DisplayDialog("GUIDs regeneration",
                "You are going to start the process of GUID regeneration. This may have unexpected results. \n\n MAKE A PROJECT BACKUP BEFORE PROCEEDING!",
                "Regenerate GUIDs", "Cancel")) {
                try {
                    AssetDatabase.StartAssetEditing();

                    string path = Path.GetFullPath(".") + Path.DirectorySeparatorChar + "Assets/_Game";//要更新guid的文件夹
                    UnityGuidRegenerator regenerator = new UnityGuidRegenerator(path);
                    regenerator.RegenerateGuids();
                }
                finally {
                    AssetDatabase.StopAssetEditing();
                    EditorUtility.ClearProgressBar();
                    AssetDatabase.Refresh();
                }
            }
        }
    }

    internal class UnityGuidRegenerator {
        private static readonly string[] kDefaultFileExtensions = {
            // "*.meta",
            // "*.mat",
            // "*.anim",
            // "*.prefab",
            // "*.unity",
            // "*.asset"
            "*.*"
        };

        private readonly string _assetsPath;

        public UnityGuidRegenerator(string assetsPath) {
            _assetsPath = assetsPath;
        }

        public void RegenerateGuids(string[] regeneratedExtensions = null) {
            if (regeneratedExtensions == null) {
                regeneratedExtensions = kDefaultFileExtensions;
            }

            // Get list of working files
            List<string> filesPaths = new List<string>();
            foreach (string extension in regeneratedExtensions) {
                filesPaths.AddRange(
                    Directory.GetFiles(_assetsPath, extension, SearchOption.AllDirectories)
                    );
            }

            // Create dictionary to hold old-to-new GUID map
            Dictionary<string, string> guidOldToNewMap = new Dictionary<string, string>();
            Dictionary<string, List<string>> guidsInFileMap = new Dictionary<string, List<string>>();

            // We must only replace GUIDs for Resources present in Assets. 
            // Otherwise built-in resources (shader, meshes etc) get overwritten.
            HashSet<string> ownGuids = new HashSet<string>();

            // Traverse all files, remember which GUIDs are in which files and generate new GUIDs
            int counter = 0;
            foreach (string filePath in filesPaths) {
                EditorUtility.DisplayProgressBar("Scanning Assets folder", MakeRelativePath(_assetsPath, filePath), counter / (float) filesPaths.Count);
                string contents = File.ReadAllText(filePath);
                
                IEnumerable<string> guids = GetGuids(contents);
                bool isFirstGuid = true;
                foreach (string oldGuid in guids) {
                    // First GUID in .meta file is always the GUID of the asset itself
                    if (isFirstGuid && Path.GetExtension(filePath) == ".meta") {
                        ownGuids.Add(oldGuid);
                        isFirstGuid = false;
                    }
                    // Generate and save new GUID if we haven't added it before
                    if (!guidOldToNewMap.ContainsKey(oldGuid)) {
                        string newGuid = Guid.NewGuid().ToString("N");
                        guidOldToNewMap.Add(oldGuid, newGuid);
                    }

                    if (!guidsInFileMap.ContainsKey(filePath))
                        guidsInFileMap[filePath] = new List<string>();

                    if (!guidsInFileMap[filePath].Contains(oldGuid)) {
                        guidsInFileMap[filePath].Add(oldGuid);
                    }
                }

                counter++;
            }

            // Traverse the files again and replace the old GUIDs
            counter = -1;
            int guidsInFileMapKeysCount = guidsInFileMap.Keys.Count;
            foreach (string filePath in guidsInFileMap.Keys) {
                EditorUtility.DisplayProgressBar("Regenerating GUIDs", MakeRelativePath(_assetsPath, filePath), counter / (float) guidsInFileMapKeysCount);
                counter++;

                string contents = File.ReadAllText(filePath);
                foreach (string oldGuid in guidsInFileMap[filePath]) {
                    if (!ownGuids.Contains(oldGuid))
                        continue;

                    string newGuid = guidOldToNewMap[oldGuid];
                    if (string.IsNullOrEmpty(newGuid))
                        throw new NullReferenceException("newGuid == null");

                    contents = contents.Replace("guid: " + oldGuid, "guid: " + newGuid);
                }
                File.WriteAllText(filePath, contents);
            }

            EditorUtility.ClearProgressBar();
        }

        private static IEnumerable<string> GetGuids(string text) {
            const string guidStart = "guid: ";
            const int guidLength = 32;
            int textLength = text.Length;
            int guidStartLength = guidStart.Length;
            List<string> guids = new List<string>();

            int index = 0;
            while (index + guidStartLength + guidLength < textLength) {
                index = text.IndexOf(guidStart, index, StringComparison.Ordinal);
                if (index == -1)
                    break;

                index += guidStartLength;
                string guid = text.Substring(index, guidLength);
                index += guidLength;

                if (IsGuid(guid)) {
                    guids.Add(guid);
                }
            }

            return guids;
        }

        private static bool IsGuid(string text) {
            for (int i = 0; i < text.Length; i++) {
                char c = text[i];
                if (
                    !((c >= '0' && c <= '9') ||
                      (c >= 'a' && c <= 'z'))
                    )
                    return false;
            }

            return true;
        }

        private static string MakeRelativePath(string fromPath, string toPath) {
            Uri fromUri = new Uri(fromPath);
            Uri toUri = new Uri(toPath);

            Uri relativeUri = fromUri.MakeRelativeUri(toUri);
            string relativePath = Uri.UnescapeDataString(relativeUri.ToString());

            return relativePath;
        }
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity 重置项目资源的guid 的相关文章

  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • GUID 是好盐吗?我的注册/登录过程有什么缺陷吗?

    如果我的数据库中的表如下所示 userid uniqueidentifier username varchar 20 password varbinary max 当用户提交 注册 时 我将用户 通行证发送到存储过程 存储过程创建一个新的
  • 为什么二进制指南与通常的表示不同

    我有以下指南 AAB13E97 449B 4D5B BDE2 AC479C31B782 使用 System Guid DbLinq SQLite 来存储它 以下字段将添加到数据库中 973EB1AA 9B44 5B4D BDE2 AC479
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 如何用C语言生成GUID?

    我想生成插入 SQLite 数据库的 guid 即数据库本身不支持 但是 我想控制某些属性 用于生成不断增加的指导值的有序性 计算机独立性 数据库是公共的 可能 可能不希望 guid 允许某人将数据追溯到特定机器 足够 的随机性 guid
  • SQL Server:搜索所有表中的特定 GUID

    我发现需要清理一些数据 并且我需要找到一些特定的指南 即唯一标识符 在 SQL Server 我想出了一个存储过程SELECT从当前数据库中每个表的每个 uniqueidentifier 列中查找 如果找到 guid 则返回一个结果集 它使
  • Direct3D 10 是否有 COM 暴露

    先生们 尊敬的女士们 我在 Code Project 的 COM 论坛上发布了这个问题 并得到了一个傲慢的回复 希望对您有所帮助 我看到 Microsoft 有一个用于 Direct3D 9 的 COM 库 其 GUID 为 81BDCBC
  • 创建了一个脚本来切换盖子关闭操作(睡眠/不执行任何操作)我可以看到它生效,但它不起作用

    我制作了一个 vbs 脚本 它基本上可以在 睡眠 和 不做任何事情 之间切换关闭盖子操作 这个想法是在我的桌面上有一个图标来保存每次控制面板 gt 电源选项 gt 更改WhatClosingTheLidDoes 顺便说一句 我使用的是 Wi
  • 如何在 rowguid 列中输入值?

    谁能告诉我在表的 rowguid 列中插入值的正确方法 我正在使用 sql server management studio use the NEWID https msdn microsoft com en us library ms19
  • C# 和 SQL Server 中 int 到 guid 的不同转换

    在 C 和 SQL Server 中将 int 转换为 guid 时 我得到不同的值 在C 中我使用这个方法 public static Guid Int2Guid int value byte bytes new byte 16 BitC
  • Guid.NewGuid() 返回重复项?

    我们有一个应用程序可以为我们的一项服务生成模拟数据以用于测试目的 每个数据项都有一个唯一的 Guid 然而 当我们对模拟器进行一些小的代码更改后运行测试时 它生成的所有对象都具有相同的 Guid 创建了一个数据对象 然后是一个 for 循环
  • 无法嵌入程序集“...\Microsoft.Search.Interop.dll”中的互操作类型,因为它缺少 GuidAttribute 属性

    在我创建的新项目中添加对 Microsoft Search Interop dll 库的引用时 出现此错误 Microsoft Search Interop dll 是一个库 它提供了一些有用的 API 来与 Windows 搜索进行通信
  • SQL Server 中 COMB GUID 处的时间戳为 8 个字节或时间戳为 6 个字节

    感谢精彩的文章 我们有 COMB GUID 根据目前的实施情况 有两种方法 使用最后 6 个字节作为时间戳 GUID作为多个数据库下的快速主键 http www codeproject com Articles 388157 GUIDs a
  • 如何在 Python 中创建 GUID/UUID

    如何在 Python 中创建独立于平台的 GUID UUID 我听说有一种在 Windows 上使用 ActivePython 的方法 但它只是 Windows 因为它使用 COM 有没有使用普通Python的方法 The uuid模块 h
  • TypeScript GUID 类? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道在 TypeScript 中像 GUID UUID 这样的 C 的良好 可靠的实现吗 我自己可
  • 在 10 亿次迭代中获得相同 GUID 的机会有多大?

    我正在开展一个项目 需要生成大约 10 亿个 GUID 我知道 GUID 不能保证是唯一的 但几乎始终是唯一的 如果我生成了十亿个 GUID 那么匹配的概率是多少 博客文章 GUID 是全局唯一的 但 GUID 的子字符串不是 https
  • WiX - 根据环境将编译后的 web.config 复制到网站根目录

    作为 WiX 安装的一部分 我将所有转换 编译的 web config 文件复制到安装目录 编译后的 web config 的名称格式为 web ENV config 在我的安装 UI 中 我创建了一个自定义对话框 在其中解析 ENV 并填

随机推荐

  • Minimum Snap轨迹规划详解(1)轨迹规划

    一 轨迹规划是什么 xff1f 在机器人导航过程中 xff0c 如何控制机器人从A点移动到B点 xff0c 通常称之为运动规划 运动规划一般又分为两步 xff1a 1 路径规划 xff1a 在地图 xff08 栅格地图 四 八叉树 RRT地
  • RealsenseD415/D435深度相机常用资料汇总

    1 Realsense SDK 2 0 Ubuntu 16 04 安装指导网址 https github com IntelRealSense librealsense blob master doc distribution linux
  • C++STL详解三:迭代器

    C 43 43 STL详解三 xff1a 迭代器 文章目录 C 43 43 STL详解三 xff1a 迭代器前言一 迭代器是什么二 迭代器的案例 xff1a List迭代器的简化版代码1 简单分析List的储存方式2 List的迭代器 三
  • cpp-httplib库的简介与工作流程

    A C 43 43 11 single file header only cross platform HTTP HTTPS library It s extremely easy to setup Just include the htt
  • audiowrite函数用法(matlab)

    audiowrite函数用法 xff08 matlab xff09 一 xff0c 语法 1 2 audiowrite filename y Fs audiowrite filename y Fs Name Value 二 xff0c 解释
  • 5G协议 基本架构 专有名词简称和缩写

    1 先来两个5G架构图 专有名词解释 xff1a 5GC 5G generation core Network 5G核心网络 NG RAN Next generation radio access network 下一代无线接入网络 AMF
  • 加速度计和陀螺仪互补滤波(转载)

    简单易懂的理解 xff1a 这么说吧 xff0c 加速度计计算出来的角度干扰比较大 xff0c 波形比较杂乱 xff0c 陀螺仪融合出来的波形比较平稳但是存在积分漂移 xff0c 所以二者结合 陀螺仪测量角速度积分的基础上利用加速度计测量的
  • 关于精度、分辨率、LSB的理解

    1 精度 是用来描述物理量的准确程度的 精度有关的有两个很重要的指标 xff1a DNL INL DNL xff1a Differencial NonLiner 微分非线性度INL xff1a Interger NonLiner 积分非线性
  • MPU6050教程(转载)

    如果你想玩四轴 xff0c 想搞什么空中鼠标 xff0c 平衡车等待 xff0c 那么MPU6050真的是太强大了 xff0c 能做很多东西 但是论坛上MPU6050整个教学过程基本上是没有的 xff0c 资源共享 xff0c 不应该只在自
  • Swift 中使用SDWebImage

    SDWebImage是开发中常用的插件 xff0c 主要用于加载外部图片 xff0c 具有缓存图片资源的功能 xff0c 然而SDWebImage是由Object C所写 步骤 xff1a 下载SDWebImage https github
  • VSCode的多个(C/C++)源文件的编译运行(Linux)

    引言 VSCode作为微软推出的一款免费的轻量级的集成开发环境 xff0c 可谓是良心之作 它拥有VS的高颜值 xff0c 而且像瑞士军刀一样 xff0c 拥有丰富的插件 xff0c c c 43 43 java python js htm
  • Android 任务栈简介

    Android 任务栈简介 一个Android应用程序功能通常会被拆分成多喝Activity xff0c 而各个Activity之间通过Intent进行连接 xff0c 而Android系统 xff0c 通过栈结构来保存整个App的Acti
  • Error: Invalid character in header content [“Authorization“]

    GET https xxxxxx com api getToken Body 34 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 eyJleHAiOjE2NzkzMTM5MDB9 VgZnHxBUqR3I PZD
  • 标准C++库有哪些

    C 43 43 标准库的内容基本可以分以下为10类 xff1a C1 标准库中与语言支持功能相关的头文件 C2 支持流输入 输出的头文件 C3 与诊断功能相关的头文件 C4 定义工具函数的头文件 C5 支持字符串处理的头文件 C6 定义容器
  • 示波器解析串口数据

    文章目录 前言一 示波器准备二 硬件介绍三 软件四 串口TTL数据协议1 波特率2 数据起始和停止信号3 数据有效位4 数据校验位 五 示波器探头连接五 串口数据波形捕获 方式1 xff1a 示波器自带的decode进行解码方式2 xff1
  • UART波形分析

    1 逻辑分析仪解码配置 波特率 xff1a 9600 2 逻辑分析仪结果 3 波特率计算 1除以9600 xff0c 结果如下 xff08 e 4表示10的负4次方 xff09 表示 0 00010416秒 61 104 16 微秒 找到发
  • snprintf()函数使用方法

    众所周知 sprintf不能检查目标字符串的长度 xff0c 可能造成众多安全问题 所以都会推荐使用snprintf 自从snprintf代替了sprintf xff0c 相信大家对snprintf的使用都不会少 xff0c 函数定义如下
  • vlc通过udp读取h264码流

    vlc通过udp读取h264码流 在使用gstreamer过程中 xff0c 遇到需要在服务端推送码流 xff0c 客户端接受的情况 xff0c 而有些主机并未安装gstreamer xff0c 但是可以采用vlc读取视频 xff0c 方法
  • ubuntu20.04回退系统内核

    ubuntu20 04回退系统内核 有时候开机之后突然发现nvidia smi检查不到驱动了 分辨率不对 xff0c 第二个屏幕检测不到等等 xff0c 一般来说是因为内核自动更新导致的 xff0c 这里介绍一下内核回退的方法 第一步 查看
  • Unity 重置项目资源的guid

    有时需要将多个项目的资源合并到一个项目中 xff0c 但有可能有些资源是共用的 xff0c 它的guid是一样的 xff0c 这样合并到一个项目时 xff0c 可能会超成冲突 如果要让每个资源的guid都不相同 xff0c 就需要重新生成g