Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct here to familiarize yourself with the rules and how to post constructively.

  2. Unity 2022.1 is now available as the latest Tech release.
    Dismiss Notice

Cant Convert GameObject to Entity in 0.3 version

Discussion in 'Data Oriented Technology Stack' started by Opeth001, Dec 4, 2019.

  1. Opeth001

    Opeth001

    Joined:
    Jan 28, 2017
    Posts:
    896
    Hello Everyone,

    I upgraded my project from entities 0.1 to 0.3.


    my MonoBehaviour code is converting a prefab and instantiating it's entities x times.(got it from ECSSamples)
    Code (CSharp):
    1.  
    2. players = new NativeArray<Entity>(pSkins.Length, Allocator.Persistent);
    3. // Create entity prefab from the Player GameObject Prefab Architype once
    4. var settings = GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, null); // Error Here
    5. var prefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(clientPlayerPrefabArchitype, settings);
    6. var entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
    7.  
    8. // Efficiently instantiate a bunch of entities from the already converted entity prefab
    9. entityManager.Instantiate(prefab, players);
    10.  
    11.  

    The Error:
    Code (CSharp):
    1. ArgumentNullException: A valid BlobAssetStore must be passed to construct a BlobAssetComputationContext
    2. Parameter name: blobAssetStore
    3. Unity.Entities.BlobAssetComputationContext`2[TS,TB]..ctor (Unity.Entities.BlobAssetStore blobAssetStore, System.Int32 initialCapacity, Unity.Collections.Allocator allocator) (at Library/PackageCache/com.unity.entities@0.3.0-preview.4/Unity.Entities.Hybrid/GameObjectConversion/BlobAssetComputationContext.cs:31)
    4. Unity.Physics.Authoring.BeginColliderConversionSystem.OnUpdate () (at Library/PackageCache/com.unity.physics@0.2.5-preview/Unity.Physics.Hybrid/Conversion/BeginColliderConversionSystem.cs:14)
    5. Unity.Entities.ComponentSystem.InternalUpdate () (at Library/PackageCache/com.unity.entities@0.3.0-preview.4/Unity.Entities/ComponentSystem.cs:102)
    6. Unity.Entities.ComponentSystemBase.Update () (at Library/PackageCache/com.unity.entities@0.3.0-preview.4/Unity.Entities/ComponentSystemBase.cs:301)
    7. Unity.Entities.ComponentSystemGroup.OnUpdate () (at Library/PackageCache/com.unity.entities@0.3.0-preview.4/Unity.Entities/ComponentSystemGroup.cs:109)
    8. UnityEngine.DebugLogHandler:LogException(Exception, Object)
    9. Unity.Entities.Conversion.JournalingUnityLogger:LogException(Exception, Object) (at Library/PackageCache/com.unity.entities@0.3.0-preview.4/Unity.Entities.Hybrid/GameObjectConversion/JournalingUnityLogger.cs:50)
    10. UnityEngine.Debug:LogException(Exception)
    11. Unity.Debug:LogException(Exception) (at Library/PackageCache/com.unity.entities@0.3.0-preview.4/Unity.Entities/Stubs/Unity/Debug.cs:19)
    12. Unity.Entities.ComponentSystemGroup:OnUpdate() (at Library/PackageCache/com.unity.entities@0.3.0-preview.4/Unity.Entities/ComponentSystemGroup.cs:113)
    13. Unity.Entities.ComponentSystem:InternalUpdate() (at Library/PackageCache/com.unity.entities@0.3.0-preview.4/Unity.Entities/ComponentSystem.cs:102)
    14. Unity.Entities.ComponentSystemBase:Update() (at Library/PackageCache/com.unity.entities@0.3.0-preview.4/Unity.Entities/ComponentSystemBase.cs:301)
    15. Unity.Entities.GameObjectConversionUtility:Convert(World) (at Library/PackageCache/com.unity.entities@0.3.0-preview.4/Unity.Entities.Hybrid/GameObjectConversion/GameObjectConversionUtility.cs:147)
    16. Unity.Entities.GameObjectConversionUtility:ConvertGameObjectHierarchy(GameObject, GameObjectConversionSettings) (at Library/PackageCache/com.unity.entities@0.3.0-preview.4/Unity.Entities.Hybrid/GameObjectConversion/GameObjectConversionUtility.cs:229)
     
  2. Opeth001

    Opeth001

    Joined:
    Jan 28, 2017
    Posts:
    896
    it's working now by changing this part:
    Code (CSharp):
    1.  
    2. var settings = GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, null);
    3.  
    4. to
    5.  
    6. var settings = GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, new BlobAssetStore());
     
  3. Opeth001

    Opeth001

    Joined:
    Jan 28, 2017
    Posts:
    896
    im using Entities 0.4 and this workaround dont works correctly for some android devices,(the player goes under the ground)
     
    MahdiNfa and aVaKus like this.
  4. james7132

    james7132

    Joined:
    Mar 6, 2015
    Posts:
    166
    Was this ever fixed? I am getting the same issue now as well.

    Edit: Nevermind did not read all of the posts in the thread.
     
    Last edited: Aug 11, 2020
  5. Robacks

    Robacks

    Joined:
    Aug 7, 2012
    Posts:
    25
    Can confirm this happening in 0.14.0-preview.18 still.

    this solution seems to work for me.
     
  6. TWolfram

    TWolfram

    Joined:
    Aug 6, 2017
    Posts:
    72
    For me this results in a memory leak, using Entities 0.17.0-preview.41
     
  7. Enzi

    Enzi

    Joined:
    Jan 28, 2013
    Posts:
    724
    The BlobAssetStore has to be disposed afterwards.
     
    jmcusack and Opeth001 like this.
  8. voidraizer

    voidraizer

    Joined:
    Dec 20, 2013
    Posts:
    6
    I also get a memory leak so I tried to dispose afterward and as soon as the prefab is spawned, I get lots of errors
    upload_2021-3-7_14-12-27.png

    upload_2021-3-7_14-11-36.png
     
  9. TWolfram

    TWolfram

    Joined:
    Aug 6, 2017
    Posts:
    72
    Exactly, trying to fix the memory leak only results in more errors. Would love to hear how we're supposed to properly dispose a blobassetstore.
     
  10. Enzi

    Enzi

    Joined:
    Jan 28, 2013
    Posts:
    724
    I have pretty much the same code as @voidraizer, only that I don't use physics with it. From what I know, Physics stores data in the BlobAssetStore so it can't be just disposed in that case.

    What's holding you back from putting a "Convert to Entity" component on your prefabs?
     
  11. Shudrum

    Shudrum

    Joined:
    Apr 3, 2011
    Posts:
    61
    Sorry, just seen that because I had the same issue and fixed it. So necro time!

    I don't know your context, but on my test project, my spawner is a Monobehavior. To fix this issue, and avoid the BlobAssetStore to be garbage collected, I had to put it as a member and dispose it on destroy:

    Code (CSharp):
    1.  
    2. public class Spawner : MonoBehaviour
    3. {
    4.   public GameObject unit;
    5.  
    6.   private EntityManager _manager;
    7.   private Entity _enemyEntityPrefab;
    8.   private BlobAssetStore _blobAssetStore;
    9.  
    10.   private void Start() {
    11.     _blobAssetStore = new BlobAssetStore();
    12.     _manager = World.DefaultGameObjectInjectionWorld.EntityManager;
    13.     _enemyEntityPrefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(
    14.       unit,
    15.       GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, _blobAssetStore)
    16.     );
    17.   }
    18.  
    19.   private void OnDestroy() {
    20.     _blobAssetStore.Dispose();
    21.   }
    22. }
    23.  
     
  12. julianwitte

    julianwitte

    Joined:
    Oct 3, 2012
    Posts:
    8
    Easier then managing your own BlobAssetStore would be using the conversion system BlobAsset;


    Code (CSharp):
    1. var world = World.DefaultGameObjectInjectionWorld;
    2.         var conversionSystem = world.GetExistingSystem<GameObjectConversionSystem>();
    3.  
    4.         var prefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(unitPrefab,
    5.             GameObjectConversionSettings.FromWorld(world, conversionSystem.BlobAssetStore));
    If you are using IConvertGameObjectToEntity then it is even easier, since conversionSystem comes for free in the Convert method.
     
unityunity