Unity Alembic 在打包后报错:failed to load alembic at C://***.abc

2023-12-04 03:44

本文主要是介绍Unity Alembic 在打包后报错:failed to load alembic at C://***.abc,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ABC动画打Windows包后,加载时报错?找不到.abc文件。

你可能在用Unity做Windows 平台的项目时,遇到过使用Alembic动画的需求。
在资源管理方面,如果你的工作流是:所有ABC动画制作成预制,并且在项目打包时,将他们放在场景中,并提前将Active勾选掉,隐藏起来,在需要用的时候再显示出来,播放动画。那么你将不会遇到上述问题。

因此,如果你只是为了着急解决问题,对你而言,可以用上述方式来解决你的报错问题。

然而,作为一名资深游戏开发人员,真的很难忍受这种资源管理方式,即便现在不做游戏了,依然希望我的资源是在用到的时候再加载。不用的时候,他就应该呆在它的小窝里好好待着,而不是跑到场景里猫起来= = 况且也不能满足资源热更新的需求。

因此,经过一些国内外网站上对于该问题的搜索及自身的思考,了解了问题产生的原因,也总结了一套方案。

原因:
由于abc文件是一种特殊的数据格式,数据量是巨大的,用他们讲的我没看懂的英文说,是multigig bloat,类似巨量数据膨胀的意思,英文并不如编程优秀= = ,因此,它的加载方式也比较复杂并不像animationClip那般简单。为何官方没有提供一个动态为其Stream的接口呢?从19年的一个Unity官方程序员的留言中看到,当时应该是还没写,大概至今已经忘了支持了吧。。

解决方案:
不过,你可以在打包时,注册构建后处理回调。在回调中,将项目用到的abc文件拷贝,并复制到打包后的目标文件夹下的streamingAssets目录里。这样对于客户端开发人员来说,就可以无感于abc繁琐的操作,亦可优雅的使用既有框架对资源进行加载和卸载。项目中的streamingassets文件夹中也没有任何变化。

但其实资源大小并未真正减少。只是为了满足动态加载时内心的完美体验。哈哈,那么Talk完了,ShowCode.(注意: 使用時請將它放到Editor文件夾下。)

/* 工具由來:* 若項目ABC動畫,並未在Build時放入場景,通過SetActive去打開。* 而是,通過Resources、Addressable或第三方解決方案等AB包的* 方式加載的話,則會出現ABC文件無法找到的報錯。** 這是由於ABC工作流機制所致。但Alembic並未暴露可改引用路徑的接口。* * 因此,我們需要將ABC文件Copy到打包目錄中,從而使得在程序運行時,* 動態加載的動畫文件,可以Stream到其引用的ABC。* 該工具就是為了做這個工作而寫。** 使用:時請將它放到Editor文件夾下。* * CopyRight@ Vimala Eric* 2023.12.3*/using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;namespace Editor
{/// <summary>/// ABC文件打包後處理工具/// </summary>class AbcBuildPostProcess:IPreprocessBuildWithReport{/// <summary>/// Abc文件根目錄/// </summary>const string AbcFolder = "/Alembic";/*你可以填空,默認掃描全局abc文件。我的建議起碼填所有abc資源的根目錄,減少打包時的準備時間*/const string KUnsupportedTarget = "Alembic only supports the following build targets: Windows 64-bit, macOS X, and Linux 64-bit.";static readonly HashSet<KeyValuePair<string, string>> FilesToCopy = new ();public int callbackOrder { get; }public void OnPreprocessBuild(BuildReport report){var target = report.summary.platform;if (!TargetIsSupported(target)){Debug.LogException(new Exception(KUnsupportedTarget));return;}//初始化 filesToCopyInitFilesToCopy(report.summary);Copy();}static void Copy(){StringBuilder sb = new StringBuilder();foreach (var files in FilesToCopy){if (!File.Exists(files.Key)){continue;}var dir = Path.GetDirectoryName(files.Value);if (dir != null && !Directory.Exists(dir)){Directory.CreateDirectory(dir);}if (File.Exists(files.Value)){var attrs = File.GetAttributes(files.Value);attrs &= ~FileAttributes.ReadOnly;File.SetAttributes(files.Value, attrs);}File.Copy(files.Key, files.Value, true);sb.Append(Path.GetFileName(files.Key)+",");}Debug.Log($"PostProcess Copy ABC:{sb}");FilesToCopy.Clear();}static void InitFilesToCopy(BuildSummary summary){var streamingAssetsPath = GetOutPutStreamingAssetsPath(summary);//get all abc filesvar abcFiles = Directory.GetFiles(Application.dataPath+AbcFolder,"*.abc");int assetsIndex = 0;foreach (var abcFile in abcFiles){assetsIndex = abcFile.IndexOf("/Assets", StringComparison.Ordinal);var localPath = abcFile.Substring(assetsIndex, abcFile.Length - assetsIndex);FilesToCopy.Add(new KeyValuePair<string, string>(abcFile, $"{streamingAssetsPath}{localPath}"));}}static string GetOutPutStreamingAssetsPath(BuildSummary summary){switch (summary.platform){case BuildTarget.StandaloneOSX:return Path.Combine(summary.outputPath, "Contents/Resources/Data/StreamingAssets");case BuildTarget.StandaloneLinux64:case BuildTarget.StandaloneWindows64:var name = Path.ChangeExtension(summary.outputPath, null);return name + "_Data/StreamingAssets";default:throw new NotImplementedException();}}static bool TargetIsSupported(BuildTarget target){return target == BuildTarget.StandaloneOSX || target == BuildTarget.StandaloneWindows64 || target == BuildTarget.StandaloneLinux64;}}
}

白羽小镇
VimalaEric
2023.12.3记

这篇关于Unity Alembic 在打包后报错:failed to load alembic at C://***.abc的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/451977

相关文章

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

CentOS系统使用yum命令报错问题及解决

《CentOS系统使用yum命令报错问题及解决》文章主要讲述了在CentOS系统中使用yum命令时遇到的错误,并提供了个人解决方法,希望对大家有所帮助,并鼓励大家支持脚本之家... 目录Centos系统使用yum命令报错找到文件替换源文件为总结CentOS系统使用yum命令报错http://www.cppc

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed 文章目录 DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed问题解决办法 问题 使用 DBeaver 连接 MySQL 数据库的时候, 一直报错下面的错误 Public Key Retrieval is

类的load方法和initialize方法对比

1. load方法在main()之前被调用,而initialize方法在main()之后调用 load方法实际是在load_images过程中被调用的。load_images会将当前应用依赖的所有镜像(动态库)加载到内存,在在加载中首先是对镜像进行扫描,将所有包含 load 方法的类加入列表 loadable_classes ,然后从这个列表中逐一调用其所包含的 load 方法。 +[XXCl