AddressableでScriptableObjectからMeshやMaterialを参照したい

Unity
public class MstHairMesh : ScriptableObject
{
    public Mesh _mesh;
    public Material[] _mat;
}

こんな感じで指定してScriptableObjectだけAddressableAssetにすれば、暗黙的にMeshやMaterialがAssetBundleに入ってくれるんじゃないかと期待しました。

Exception encountered in operation UnityEngine.AddressableAssets.Initialization.InitializationOperation, result='', status='Succeeded' - Chain: ChainOperation of Type: MstHairMesh failed because dependent operation failed
Exception of type 'UnityEngine.AddressableAssets.InvalidKeyException' was thrown., Key=hair000
UnityEngine.ResourceManagement.ChainOperation2:OnWrappedCompleted(AsyncOperationHandle1)
DelegateList1:Invoke(AsyncOperationHandle1) (at

実行時エラーになりました。不可能みたいです。 Unity2019.3.4f1 Addressable1.6.2 windows editorで確認したところ正常に取得できました。サブアセットも大丈夫で

スポンサーリンク

解決法

AssetReferenceT

public class MstHairMesh : ScriptableObject
{
    
    public AssetRefMesh _mesh;
    public AssetRefMat[] _mat;
}

[System.Serializable]
public class AssetRefMesh : AssetReferenceT<Mesh>
{
    public AssetRefMesh(string guid) : base(guid) { }
}
[System.Serializable]
public class AssetRefMat : AssetReferenceT<Material>
{
    public AssetRefMat(string guid) : base(guid) { }
}

これなら大丈夫でした。ただし、ScriptableObject読み込んだ後さらにLoadAssetAsyncをmesh materialそれぞれに対して呼ばなくちゃいけませんでした。だるいですね

Prefabから参照する

public class DummyHairMeshComp : MonoBehaviour
{
    public Mesh _mesh;
   public Material[] _mat;
}

GameObjectをAddressableAssetにして読み込むのはOKでした

諦めてMesh Materialを直接放り込む

AssetBundleに直接持たせる方法ですね、試してないですがきっと大丈夫です。しかし個別にLoadAssetAsync呼ぶことにはなりそう。Labelで楽できる?