Unity ECS で、Prefab を使用した場合に Android ビルドでエラー
始めに
前回の記事Unity ECS で動的に親子関係を作るにあるコードをAndroidビルドしたらエラーになる。 その対処方法を書く。
- Unity 2022.3.29f1
- com.unity.entities 1.0.16
原因
エラーになるのは Unity.Entities.Serialization.EntityPrefabReference クラス。 これのコンストラクタに GameObject を渡すと、内部では UnityEditor.AssetDatabase が使われるが、 UnityEditor 名前空間は Android でビルド出来ない為にエラーになった。 そのそも、名前の通りUnityエディタ上でしか使えない物なので、他のプラットフォームビルドでも使うべきでない。
対応方法
ここでは Addressable を使う方法で説明する。
- パッケージマネージャで Addressable を追加する。
- Baker の記述変更
- プレファブを受け取るプロパティのクラスを GameObject から UnityEngine.AddressableAssets.AssetReferenceGameObject に変える。
- アセットIDを変換したうえで EntityPrefabReference コンストラクタに与える。
- プレファブを Addressable に含める。(プレファブ選択後にインスペクタ上部にあるチェックを入れる。)
- プレファブをインスペクタで設定しなおす。
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;
}
}
最後に
使えない物を標準ライブラリで実装しないで欲しい。