Most of the game's assets that are not directly related to data like stats, scripts etc. are stored in Unity Asset Bundles, which are container files that can be loaded into and created in the Unity game engine.

We can use Unity to build our own AssetBundles and replace bundles from the game.

The game uses Unity 2018.4 but newer versions should also work. You'll need basic Unity knowledge to follow these steps.

Loading an AssetBundle from the game

You can load AssetBundles with AssetBundle.LoadFromFile(). This script will load the AssetBundle from the given path and show its contents in the inspector. Add it to an object and press Play to see it in action.

using System.Collections.Generic;
using UnityEngine;

public class AssetBundleLoadTest : MonoBehaviour
{
    // The path of the AssetBundle you want to load
    public string SourcePath = "../extracted/romfs/Data/StreamingAssets/ab/pikachuu_10.ab";
    public List<UnityEngine.Object> AssetRefs; // View this list in the inspector

    void Start()
    {
        var ab = AssetBundle.LoadFromFile(SourcePath);
        var assets = ab.LoadAllAssets();
        AssetRefs.AddRange(assets);
    }
}

To view a loaded asset (e.g. textures, music) in the inspector, double click it in the list. You can use AssetBundle.UnloadAllAssetBundles() to unload all the currently loaded bundles. To use the loaded assets in Edit mode, you can write an Editor script.

Viewing models

Use Instantiate() to load a model. Since we can't use shaders from the game, we have to replace them with another shader like Unity's Standard Shader for viewing.

using UnityEngine;

public class AssetBundleLoadTest : MonoBehaviour
{
    // The path of the AssetBundle you want to load
    public string SourcePath = "../extracted/romfs/Data/StreamingAssets/ab/pikachuu_10.ab";

    void Start()
    {
        // Load the AssetBundle
        var ab = AssetBundle.LoadFromFile(SourcePath);
        var assets = ab.LoadAllAssets();
        
        // Replace shaders
        foreach (var asset in assets)
        {
            var material = asset as Material;
            if (material != null)
            {
                material.shader = Shader.Find("Standard");
            }
        }
        
        // Spawn the model. You can find the name of the prefab in the list.
        Instantiate(ab.LoadAsset<GameObject>("pikachuu_10"));
    }
}

If you run this script and switch to the Scene tab, the model should show up.

Viewing AssetBundle data

Download the tool "Unity Asset Bundle Extractor" and open an .ab file to view all its contents.