Unity ECS で、Prefab を使用した場合に Android ビルドでエラー

始めに

前回の記事Unity ECS で動的に親子関係を作るにあるコードをAndroidビルドしたらエラーになる。 その対処方法を書く。

原因

エラーになるのは Unity.Entities.Serialization.EntityPrefabReference クラス。 これのコンストラクタに GameObject を渡すと、内部では UnityEditor.AssetDatabase が使われるが、 UnityEditor 名前空間は Android でビルド出来ない為にエラーになった。 そのそも、名前の通りUnityエディタ上でしか使えない物なので、他のプラットフォームビルドでも使うべきでない。

対応方法

ここでは Addressable を使う方法で説明する。

  1. パッケージマネージャで Addressable を追加する。
  2. Baker の記述変更
    • プレファブを受け取るプロパティのクラスを GameObject から UnityEngine.AddressableAssets.AssetReferenceGameObject に変える。
    • アセットIDを変換したうえで EntityPrefabReference コンストラクタに与える。
  3. プレファブを Addressable に含める。(プレファブ選択後にインスペクタ上部にあるチェックを入れる。)
  4. プレファブをインスペクタで設定しなおす。
public class MyPrefab : MonoBehaviour
{
    public UnityEngine.AddressableAssets.AssetReferenceGameObject Prefab;

    class Baker : Baker<MyPrefab>
    {
        public override void Bake(MyPrefab myPrefab)
        {
            var assetGUID = new Unity.Entities.Hash128(rp.Prefab.AssetGUID);
            var prefabReference = new Unity.Entities.Serialization.EntityPrefabReference(assetGUID);

            var entity = GetEntity(TransformUsageFlags.None);
            AddComponent(entity, new InitializeComponentData
            {
            });
            AddComponent(entity, new RequestEntityPrefabLoaded
            {
                Prefab = prefabReference
            });
        }
    }

    public struct InitializeComponentData : IComponentData
    {
    }
    public struct ComponentData : IComponentData
    {
        public Entity PrefabEntity;
    }
}

最後に

使えない物を標準ライブラリで実装しないで欲しい。

top