Unity 同步guid脚本
美术和程序分裂两个工程相互需要保持结构一致,且guid一致。以下脚本校验一致性,并且将美术的文件夹中的guid强制同步成程序的资源guid.
# !/usr/bin/env python3
import os
import sys
import yaml
import chardetdef os_is_win32():return sys.platform == 'win32'def folderPathFixEnd(path_str):if not os_is_win32():if not path_str[-1] == "/":return path_str + "/"else:return path_strif path_str.startswith("\\\\?\\"):return path_strret = "\\\\?\\" + os.path.abspath(path_str)ret = ret.replace("//", "/")ret = ret.replace("/", "\\")return retdef gci(folderPath_: str, fileFilter_: list, fileList_: list = None):if not os.path.isdir(folderPath_):sys.exit(1)files = os.listdir(folderPath_)for fi in files:fi_d = os.path.join(folderPath_, fi)if os.path.isdir(fi_d):gci(fi_d, fileFilter_, fileList_)else:_filePath = os.path.join(folderPath_, fi_d)_fileSuffix = os.path.splitext(_filePath)[1]if fileFilter_:if _filePath and not _fileSuffix == "" and (_fileSuffix in fileFilter_):fileList_.append(_filePath)else:fileList_.append(_filePath)def getFileListInFolder(folder_: str, filters_: list = None):_filePathList = []folder_ = folderPathFixEnd(folder_)if filters_ and len(filters_) > 0:for _i in range(len(filters_)):if filters_[_i] == "" or not filters_[_i][0] == ".":raise Exception("后缀不对")return Nonegci(folder_,filters_,_filePathList)return _filePathListdef getRelativePathToMetaDict(assetsPath_):_filePathList = getFileListInFolder(assetsPath_,[".png", ".jpg", ".mat", ".prefab", ".controller", ".anim", ".FBX", ".PNG", ".physicsMaterial2D"])_relativePathToGuidDict = {}for _i in range(len(_filePathList)):_filePath = _filePathList[_i]_metaFilePath = _filePath + ".meta"_fs = open(_metaFilePath, encoding="UTF-8")_yamlData = yaml.load(_fs, Loader=yaml.FullLoader)_relativePath = _filePath.split(assetsPath_)[1]_relativePathToGuidDict[_relativePath] = _yamlData.guidreturn _relativePathToGuidDictdef getAllKnowTypeFileInAssets(assetsPath_):return getFileListInFolder(assetsPath_,[".meta",".mat", ".prefab", ".controller", ".anim", ".renderTexture", ".asset", ".fontsettings", ".physicsMaterial2D"])def readFromFile(filePath_: str):_encodeInfo = Nonetry:_file = open(filePath_, 'rb')try:_encodeInfo = chardet.detect(_file.read())finally:_file.close()except Exception as e:print(filePath_, e)_encodeType = _encodeInfo["encoding"]_contentStr = Nonetry:_file = open(file=filePath_, mode='r', encoding=_encodeType)try:_contentStr = _file.read()finally:_file.close()except Exception as e:print(filePath_, e)sys.exit(1)return _contentStr, _encodeTypedef writeFileWithStr(filePath_: str, str_: str, encodeType_: str):if not os.path.exists(os.path.dirname(filePath_)):os.makedirs(os.path.dirname(filePath_))try:_file = open(file=filePath_, mode='w', encoding=encodeType_)try:_file.write(str_)finally:_file.close()except Exception as e:print(filePath_, e)if __name__ == "__main__":# 程序工程 - 美术资源文件的相对路径和guid之间的关系_developAssetsPath = "程序Assets路径"_developRelativePathToGuidDict = getRelativePathToMetaDict(_developAssetsPath)# 美术工程 - 资源文件相对路径和guid之间的关系_artAssetsPath = "美术Asstes路径"_artRelativePathToGuidDict = getRelativePathToMetaDict(_artAssetsPath)# 美术工程,相同的相对路径guid的映射关系_inDevelopNotInArtList = []_inArtNotInDevelopList = []_artGuidToDevelopGuidDict = {}for _developRelativePath in _developRelativePathToGuidDict:if _developRelativePath in _artRelativePathToGuidDict:_guidInDevelop = _developRelativePathToGuidDict[_developRelativePath]_guidInArt = _artGuidToDevelopGuidDict[_developRelativePath]if not _guidInDevelop == _guidInArt:_artGuidToDevelopGuidDict[_guidInArt] = _guidInDevelopelse:_inDevelopNotInArtList.append(_developRelativePath)for _artRelativePath in _artRelativePathToGuidDict:if not _artRelativePath in _developRelativePathToGuidDict:_inArtNotInDevelopList.append(_artRelativePath)# 打印两者差异print("在 开发 目录,不在 美术 目录 的文件有 : ")for _i in range(len(_inDevelopNotInArtList)):print(" " + _inDevelopNotInArtList[_i])print("在 美术 目录,不在 开发 目录 的文件有 : ")for _i in range(len(_inArtNotInDevelopList)):print(" " + _inArtNotInDevelopList[_i])# 打开美术工程,把所有的guid全部替换掉_artFilePathList = getAllKnowTypeFileInAssets(_artAssetsPath)for _i in range(len(_artFilePathList)):_artFilePath = _artFilePathList[_i]_contentStr, _encodeType = readFromFile(_artFilePath)for _key in _artGuidToDevelopGuidDict:_contentStr.replace(_key, _artGuidToDevelopGuidDict[_key])writeFileWithStr(_artFilePath, _contentStr, _encodeType)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
