Moving from Resources.load to assetbundles

Hi everyone, I’m looking to the future of my project and I’m trying to implement asset bundles. I’ve read around the web and have followed the relatively new Assetbundlemanager tutorial demo, but I’m still a bit confused on how to load sprites. I don’t know if I’m overthinking this, or I’m wrong in my understanding of things but here it goes. Also this game is sprite heavy, but not much else. And yes, I know I’m playing with fire with using strings to grab corresponding sprites.

Right now I have a method with a string parameter as the name of a sprite that loads it from resources like so on the character.

  public virtual void ChangeBodySprite(string bodyName)
    {
        spriteRender.sprite = Resources.Load("Characters/" + characterObj.CharacterName + "/Body/" + bodyName, typeof(Sprite)) as Sprite;
        currentBodySpriteName = bodyName;
    }

This works fine. But I’ve read the assetbundlemanager tutorial, and if I did so correctly, along with the scripting documentation, only gameobjects can be loaded from assetbundles in the high-level API. The documentation states “Prior to version 5.0, users could fetch individual components directly using Load. This is not supported anymore. Instead, please use LoadAsset to load the game object first and then look up the component on the object.”
ex: This is how to instantiate a gameobject with the assetbundlemanager.

protected IEnumerator InstantiateGameObjectAsync (string assetBundleName, string assetName)
    {
        // This is simply to get the elapsed time for this phase of AssetLoading.
        float startTime = Time.realtimeSinceStartup;

        // Load asset from assetBundle.
        AssetBundleLoadAssetOperation request = AssetBundleManager.LoadAssetAsync(assetBundleName, assetName, typeof(GameObject) );
        if (request == null)
            yield break;
        yield return StartCoroutine(request);

        // Get the asset.
        GameObject prefab = request.GetAsset<GameObject> ();

        if (prefab != null)
            GameObject.Instantiate(prefab);
     
        // Calculate and display the elapsed time.
        float elapsedTime = Time.realtimeSinceStartup - startTime;
        Debug.Log(assetName + (prefab == null ? " was not" : " was")+ " loaded successfully in " + elapsedTime + " seconds" );
    }

This is what is confusing to me. So in order for me to load a sprite from this high-level api I have to have my sprite on a gameobject prefab, load that gameobject prefab from the bundle, grab the component that has the sprite, then load that sprite onto my character. Below I have pseudo-code that works, but I just want to make sure that this is the right direction. Here is the pseudo-code that I tried.
ex:

protected IEnumerator InstantiateGameObjectAsync(string assetName)
    {
        // This is simply to get the elapsed time for this phase of AssetLoading.
        float startTime = Time.realtimeSinceStartup;

        // Load asset from assetBundle.
        AssetBundleLoadAssetOperation request = AssetBundleManager.LoadAssetAsync(assetBundleName, assetName, typeof(GameObject));
        if (request == null)
        {
            Debug.Log("request failed");
            yield break;
         
        }
        yield return StartCoroutine(request);
        // Get the asset.
        GameObject prefab = request.GetAsset<GameObject>();

        if (prefab != null)
        {
            SpriteRenderer spr = prefab.GetComponent<SpriteRenderer>();

            render.sprite = spr.sprite;
        }
        // Calculate and display the elapsed time.
        float elapsedTime = Time.realtimeSinceStartup - startTime;
        Debug.Log(assetName + (prefab == null ? " was not" : " was") + " loaded successfully in " + elapsedTime + " seconds");
    }

This works(but obviously I wouldn’t want to make a prefab with a spriterender with one sprite on it for every sprite I have in the game). So this is what is also confusing me, is this the right way to go about it? In the sense that I load a gameobject and grab a sprite from a component on it(maybe gameobject prefabe with a script with a list of sprites on it);

But I’ve also seen another way to go about this(I think this may not be allowed now) in what I assume is the lower level api of asset bundles, and while this example doesnt use sprites, it goes as.

Ienumerator assetTexture(string textureName){
AssetBundleRequest assetTxture = assetBundle.LoadAssetAsync<Texture2D>(texturename);
yield return assetTxture;
gameImage.texture = assetTxture.asset as Texture2D;}

So I hope I was able to show everyone how I’m confused without confusing you as well. Thanks for taking the time to read this and I’d appreciate any help or a finger in the right direction where I can learn some more about this. Thanks in advance.

You have misunderstanding. What manual sais is that you no longer can load just Component of GameObject without loading GameObject itself. It sais nothing about not being able to load texture/sprite or any other asset type from assetbundle directly.

Thank you for clearing that up for me Teravisor. I was clearly overthinking it, especially since sprites and textures can be added to bundles by themselves.