Unity 使用LoadFromFileAsync无法加载的问题

本文链接:https://blog.csdn.net/t163361/article/details/82753084
最近准备申请新星创作者,需要2000个粉丝关注,觉得文章有用的,请点一下左侧边栏的关注,谢谢。

最近在优化资源加载的时候,发现LoadFromFileAsync这个函数在我们的加载模块怎么都不会加载,process一直是0.
之前资源加载使用的是WWW的加载方式。
但是单独写一个测试代码却跑的溜溜的。
各种查资料也没有一个明确的答复。
最后发现是因为我们项目切场景时候设置了allowSceneActivation=false导致的~

这个时候执行LoadFromFileAsync没问题
AsyncOperation op = SceneManager.LoadSceneAsync(sceneName);
op.allowSceneActivation=false;
这个时候执行LoadFromFileAsync会一直被卡住
while(!op.isDone&&op.prorpess<0.9f)
{
	yield return new WaitFroEndOfFrame();
}
op.allowSceneActivation=true;
这个时候执行LoadFromFileAsync也没问题

如果处于allowSceneActivation=false的状态,会导致LoadFromFileAsync这个方法被阻塞而无法被加载
查了下官方文档
https://docs.unity3d.com/ScriptReference/AsyncOperation-allowSceneActivation.html
里面有这么一句话

When allowSceneActivation is set to false then progress is stopped at 0.9. The isDone is then maintained at false. When allowSceneActivation is set to true isDone can complete. While isDone is false, the AsyncOperation queue is stalled. For example, if a LoadSceneAsync.allowSceneActivation is set to false, and another AsyncOperation (e.g. SceneManager.UnloadSceneAsync ) is initialized, the last operation will not be called before the first allowSceneActivation is set to true.
然后细看了下他们的继承关系
LoadFromFileAsync的返回值AssetBundleCreateRequest继承于AsyncOperation。
处理方案就显而易见了。只能绕开这个坑了。
后记:
Resources.LoadAsync也会遇到这个问题。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
你可以使用Unity的AssetBundle功能来在运行时加载外部的BFX文件。AssetBundle是一种Unity用于打包和加载资源的机制,它允许您将资源打包成一个独立的文件,并在运行时动态加载。 首先,您需要创建一个AssetBundle,其中包含您想要加载的BFX文件。您可以使用Unity的AssetBundle Build Pipeline来构建AssetBundle。具体的步骤如下: 1. 将BFX文件添加到Unity项目中,并确保它的导入设置正确。 2. 在Unity编辑器中,选择菜单栏中的 "Assets" -> "Build AssetBundles"。这将会构建所有的AssetBundle。 3. 构建完成后,您可以在Unity项目的输出目录中找到生成的AssetBundle文件。 在运行时加载AssetBundle并使用其中的BFX文件,您可以按照以下步骤进行: 1. 在Unity中创建一个空的GameObject,然后将以下代码附加到该GameObject上: ```csharp using UnityEngine; public class LoadAssetBundle : MonoBehaviour { public string assetBundlePath; // AssetBundle文件的路径 void Start() { StartCoroutine(LoadAssetBundle()); } IEnumerator LoadAssetBundle() { // 加载AssetBundle文件 var assetBundleRequest = AssetBundle.LoadFromFileAsync(assetBundlePath); yield return assetBundleRequest; // 获取加载完成的AssetBundle对象 var assetBundle = assetBundleRequest.assetBundle; if (assetBundle == null) { Debug.LogError("Failed to load AssetBundle!"); yield break; } // 加载BFX文件 var bfxRequest = assetBundle.LoadAssetAsync<GameObject>("YourBFXObjectName"); yield return bfxRequest; // 获取加载完成的BFX对象 var bfxObject = bfxRequest.asset as GameObject; if (bfxObject == null) { Debug.LogError("Failed to load BFX!"); yield break; } // 在场景中实例化BFX对象 Instantiate(bfxObject); // 卸载AssetBundle assetBundle.Unload(false); } } ``` 2. 将BFX文件的AssetBundle路径赋值给 `assetBundlePath` 变量。 3. 在场景中创建一个空的GameObject,并将上述脚本附加到该GameObject上。 4. 运行游戏,您将会在指定的路径中加载并实例化BFX对象。 这样,您就可以在Unity中运行时加载外部的BFX文件了。请确保BFX文件的导入设置正确,并根据实际情况调整代码中的路径和对象名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值