Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more.
    Dismiss Notice

Custom struct in BlobArray

Discussion in 'Entity Component System' started by swejk, Jun 20, 2019.

  1. swejk

    swejk

    Joined:
    Dec 22, 2013
    Posts:
    20
    Hi,

    I have an issue with struct elements in BlobArray, where they have default values in runtime. I think that I am not initializing the array correctly, but I cant find the correct approach anywhere.

    Concretely, with this code, when accessing clipDataRef.Value.Motions from some job, all elements will have default values ( StartFrame = 0, EndFrame = 0, Translation = {0,0,0}).

    Any advice how can I overcome this please ?

    Code (CSharp):
    1. [Serializable]
    2. public struct Motion {
    3.   public int StartFrame;
    4.   public int EndFrame;
    5.   public float3 Translation;
    6. }
    7.  
    8. [Serializable]
    9. public struct Clip {
    10.   public bool Loop;
    11.   public BlobArray<Motion> Motions;
    12. }
    13.  
    14. public class ClipData : MonoBehaviour {
    15.    public Motion[] Motions;
    16.    public bool Loop;
    17. }
    18.  
    19.  
    20. class SomeConversionSystem : GameObjectConversionSystem {
    21.  
    22.   protected override void OnUpdate() {
    23.     Entities.ForEach((ClipData clipData) =>{
    24.         var builder = new BlobBuilder(Allocator.Temp);
    25.         ref var root = ref builder.ConstructRoot<Clip>();
    26.         root.Loop = clipData.Loop;
    27.         var motions = builder.Allocate(clipData.Motions.Length, ref root.Motions);
    28.  
    29.         for(int i = 0; i < clipData.Motions.Length; i++) {
    30.            motions[i] = clipData.Motions[i];
    31.         }
    32.  
    33.        var clipBlob = builder.CreateBlobAssetReference<Clip>(Allocator.Persistent);
    34.  
    35.       builder.Dispose();
    36.  
    37.      var entity = GetPrimaryEntity(clipData.gameObject);
    38.      DstEntityManager.AddComponentData(entity,
    39.                 new SomeComponent {ClipDataRef = clipBlob});
    40.      });
    41.   }
    42. }
     
  2. swejk

    swejk

    Joined:
    Dec 22, 2013
    Posts:
    20
    I did not access the blobReference value correctly. I have this solved now.
    Code (CSharp):
    1. // Bad
    2. var clips = clipDataRef.Value.Motions
    3.  
    4. // Good
    5. ref var clips = ref clipDataRef.Value.Motions
    6.  
     
    JonasMumm likes this.
  3. Justin_Larrabee

    Justin_Larrabee

    Joined:
    Apr 24, 2018
    Posts:
    106
    It's been mentioned in another thread that they will add static analysis tools to the compiler to prevent this mistake from happening.
     
    swejk likes this.
  4. topitsky

    topitsky

    Joined:
    Jan 12, 2016
    Posts:
    96
    I've been looking for information about blobs, what is the advantage over a nativearray? Can it store more complex datastructures? eg. An Array of array (eg. If I had to store a rotation for each bone in one animation struct).
     
  5. recursive

    recursive

    Joined:
    Jul 12, 2012
    Posts:
    669
    It can store arbitrary data structures, but the best way to think of it is an in-memory file, with the root blob struct being the header. It can have it's own data, but
    BlobPtr<T>
    ,
    BlobArray<T>
    , and others store offsets into that file from the header.
     
    andrew-lukasik and JonasMumm like this.