gpt4 book ai didi

unity3d - 在编辑器播放模式下显示从AssetBundle加载的 Sprite 时出现问题

转载 作者:行者123 更新时间:2023-12-02 02:50:23 32 4
gpt4 key购买 nike

我在Unity中从SpriteAtlas加载Sprite时遇到了问题,该资源是从AssetBundle下载的。

在当前的游戏中,我试图实现AssetBundles来删除“Resources”文件夹的使用,并减少内存开销(除其他外)。

在Game应用程序中,下载的精灵在编辑器中运行时无法正确呈现,因此我构建了一个小型测试项目以更好地理解问题。不幸的是,即使我使用相同的代码来下载和显示精灵,测试项目也可以完美地工作。从现在开始,我将把这两个版本称为 TestApp GameApp 。重申一下,这个问题只是在编辑器中运行时的问题(不是最终的设备版本),但这对我们来说是一个突破,因为我们根本无法开发和测试该应用程序。与在编辑器中运行相比,构 build 备的周转时间太长。

我用于加载资产 bundle 包的脚本的简化版本如下。 (为简洁起见,已对其进行了大大简化,包括剥离所有对象缓存和错误处理等)

public IEnumerator GetSpriteFromBundle(string bundleURL, string spriteAtlasName, string spriteName, Action<Sprite> onLoadAction)
{
// get the AssetBundle
AssetBundle bundle = null;
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(bundleURL);
yield return request.SendWebRequest();
if (!request.isNetworkError && !request.isHttpError)
{
bundle = DownloadHandlerAssetBundle.GetContent(request);
}

// Get the SpriteAtlas
SpriteAtlas atlas = null;
if (bundle != null)
{
if (bundle.Contains(spriteAtlasName))
{
AssetBundleRequest assetRequest = bundle.LoadAssetAsync<SpriteAtlas>(spriteAtlasName);
yield return assetRequest;
if (assetRequest.isDone)
{
atlas = assetRequest.asset as SpriteAtlas;
}
}
}

// Get the Sprite
Sprite sprite = null;
if (atlas != null)
{
sprite = atlas.GetSprite(spriteName);
}
onLoadAction(sprite);
}

我用来调用它以加载Sprite的脚本如下(再次删除错误处理):
public void Start()
{
UnityEngine.UI.Image displayImage = GameObject.Find("Path/To/ImageObject").GetComponent<UnityEngine.UI.Image>();
StartCoroutine(
GetSpriteFromBundle(
"https://mycdn.com/myassetbundles/gamesprites", // AssetBundleURL
"GameSprites", // SpriteAssetName
"Icon1", // SpriteName
(sprite) =>
{
displayImage.sprite = sprite;
})
);
}

最终的结果是,所有东西都可以在TestApp中正常工作并正确加载,但是在编辑器中播放GameApp时,子画面要么不可见,要么显示为带有3个正方形的怪异图像。

我能看到的唯一区别是,当我使用帧调试器查看TestApp和GameApp之间的差异时,TestApp会在批处理中显示SpriteAtlas纹理,而GameApp不会。

正如您在TestApp中看到的那样,正确设置了Texture。
TestApp - Texture is correctly set

而在GameApp中,未设置纹理
GameApp - Texture is not set

我在版本之间检查并确认的事项
  • GameApp和TestApp都没有任何错误或异常。
  • 在构建并部署到设备时,它可以正常工作(仅在
    到目前为止的Android)
  • 在GameApp的onLoadAction回调中返回了一个精灵对象。
  • 我在两个应用程序中都使用了相同的AssetBundles和Sprites。
  • 我已经在两个应用程序的检查器中对Image对象设置进行了并排比较。
  • 这两个应用程序都设置为相同的构建平台(我尝试过使用Android,WebGL和
    StandaloneWindows,并且所有结果都相同)
  • AssetBundle是
    为正确的构建平台构建(如上所述)

  • 我可以看到TestApp和GameApp之间的唯一区别是GameApp更大/更复杂,并且具有场景更改(我们从加载场景开始,然后进入游戏内场景),但是我不知道没有看到这两个因素会如何影响任何事情。

    我还使用AssetBundle.LoadFromFileAsync()设置并测试了一个版本,并从StreamingAssets文件夹加载文件,结果相同

    所以,我的问题是:
    这是Unity编辑器中的错误吗?我应该看什么才能尝试解决此问题?在找到解决方案之前,我们基本上无法使用AssetBundles。

    我已经使用 AssetBundleBrowser资产来设置AssetBundles。

    我已经测试了Unity的各种版本,从较旧的2018.1版本到最新版本(在撰写本文时为2018.2.7f1)。

    (来自 Unity Forums的交叉发布)

    -更新-

    有人提到这是一个重复的问题 this question,但是我要问一个完全不同的问题。
    我的代码在设备上可以正常工作,但在Unity Editor中不能工作。

    我还尝试通过以下代码重构我的代码,以查询Sprite而不是SpriteAtlas,并使用LoadAssetWithSubAsAssetsAsync方法和以下代码,但最终结果仍然相同,即在编辑器中未显示任何Sprite。
    private IEnumerator GetSpriteFromBundle(string bundleURL, string spriteName, Action<Sprite> onLoadAction)
    {
    // get the AssetBundle
    AssetBundle bundle = null;
    UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(bundleURL);
    yield return request.SendWebRequest();
    if (!request.isNetworkError && !request.isHttpError)
    {
    bundle = DownloadHandlerAssetBundle.GetContent(request);
    }

    // Get the Sprite
    Sprite sprite = null;
    if (bundle != null)
    {
    if (bundle.Contains(spriteName))
    {
    AssetBundleRequest assetRequest = bundle.LoadAssetWithSubAssetsAsync<Sprite>(spriteName);
    yield return assetRequest;
    if (assetRequest.isDone)
    {
    for (int i = 0; i < assetRequest.allAssets.Length; i++)
    {
    sprite = assetRequest.allAssets[i] as Sprite;
    if (sprite != null && sprite.name == spriteName)
    {
    onLoadAction(sprite);
    yield break;
    }
    }
    }
    }
    }
    onLoadAction(null);
    }

    最佳答案

    原来,问题是由SpritePacker设置引起的。

    如果我将SpritePacker模式(在“编辑”->“项目设置”->“编辑器”中)设置为“为构建启用”,则精灵将无法正确加载,而如果将其设置为“始终启用”(我认为是默认设置),则精灵,然后从AssetBundle中正确加载了SpriteAtlas。

    (我将其作为Unity的一个bug提出,但是还没有听到回应)。

    关于unity3d - 在编辑器播放模式下显示从AssetBundle加载的 Sprite 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52490417/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com