Search Unity

Bug: HybridComponent not added to Companion object

Discussion in 'Entity Component System' started by swejk, Mar 13, 2020.

  1. swejk

    swejk

    Joined:
    Dec 22, 2013
    Posts:
    20
    I have 3 entities: 2 Ships (same archetype) and Projectile Prefab.
    Ship holds a reference to Projectile Prefab entity.
    Using IConvertGameObjectToEntity I am adding SpriteRenderer, Animator Hybrid Components to Ship entities and SpriteRender to Projectile Entity.

    In first scene i have 2 ShipAuthoring gameobjects.
    On play one of the ships disapears (SpriteRenderer, Animator are not added to companion).
    In this scene the Projectiles are spawned for both ships so they are converted correctly.

    In second scene with only 1 ShipAuthoring there is one Visible Ship and Projectiles become invisible (Sprite Renderer not added to projectile companion).

    When debugging I noticed that in GameObjectConversionMappingSystem.CreateCompanionGameObjects line 822 wrong components are returned for projectile in second scene (Animator is returned, but SpriteRenderer Should be returned) therefore the SpriteRenderer is not added to the companion object.

    Anyone knows how to workaround this problem? It is possible I am doing something wrong, but in that case it is not obvious to me at all.

    My conversion code:
    Code (CSharp):
    1. public class PlayerAuthoring : MonoBehaviour, IConvertGameObjectToEntity, IDeclareReferencedPrefabs
    2.     {
    3.  
    4.         public float RotationSpeed;
    5.         public ProjectileAuthoring ProjectilePrefab;
    6.         public float ShootCooldown;
    7.         public SpriteRenderer SpriteRenderer;
    8.         public Animator Animator;
    9.      
    10.         public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    11.         {
    12.             dstManager.AddComponentData(entity, new Player());
    13.             dstManager.AddComponentData(entity, new RotateTowards
    14.             {
    15.                 Speed = RotationSpeed
    16.             });
    17.             dstManager.AddComponentData(entity, new Shoot
    18.             {
    19.                 ProjectilePrefab = conversionSystem.GetPrimaryEntity(ProjectilePrefab),
    20.                 CooldownDuration = ShootCooldown,
    21.                 CurrentCooldown = 0f
    22.             });
    23.          
    24.             conversionSystem.AddHybridComponent(SpriteRenderer);
    25.             conversionSystem.AddHybridComponent(Animator);
    26.         }
    27.  
    28.         public void DeclareReferencedPrefabs(List<GameObject> referencedPrefabs)
    29.         {
    30.             referencedPrefabs.Add(ProjectilePrefab.gameObject);
    31.         }
    32.     }
    Code (CSharp):
    1.     public class ProjectileAuthoring : MonoBehaviour, IConvertGameObjectToEntity
    2.     {
    3.  
    4.         public float Speed;
    5.         public float TimeToLive;
    6.         public SpriteRenderer SpriteRenderer;
    7.      
    8.         public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    9.         {
    10.             dstManager.AddComponentData(entity, new MoveForward
    11.             {
    12.                 Speed = Speed
    13.             });
    14.             dstManager.AddComponentData(entity, new TimeToLive
    15.             {
    16.                 Value = TimeToLive
    17.             });
    18.             conversionSystem.AddHybridComponent(SpriteRenderer);
    19.         }
    20.  
    21.     }