Search Unity

Blob* usage

Discussion in 'Entity Component System' started by felipin, Sep 1, 2019.

  1. felipin

    felipin

    Joined:
    Nov 18, 2015
    Posts:
    49
    Hi,

    I'm working on my DOTS Animator and this is my AnimatorController component:
    Code (CSharp):
    1. public unsafe struct AnimatorController : ISharedComponentData, IEquatable<AnimatorController>
    2. {
    3.    public BlobArray<AnimatorParameterInfo> AnimatorParameterInfos;
    4.    public BlobArray<StateTransition> AnyStateTransitions;
    5.    public BlobArray<AnimatorState> States;
    6.    public BlobArray<AnimatorLayerInfo> LayerInfos;
    7.  
    8.    public int AnimatorUniqueIdentifier;
    9.  
    10.    public bool Equals(AnimatorController Other)
    11.    {
    12.       return AnimatorUniqueIdentifier == Other.AnimatorUniqueIdentifier;
    13.    }
    14.  
    15.    public override int GetHashCode()
    16.    {
    17.       return AnimatorUniqueIdentifier;
    18.    }
    19. }
    In order to create a dummy animator controller for testing I wrote this method:
    Code (CSharp):
    1. public static BlobAssetReference<AnimatorController> CreateDummyAnimatorControlerAssetReference()
    2. {
    3.    // State Indices
    4.    const int IdleStateIndex = 0;
    5.    const int LocomotionStateIndex = 1;
    6.    const int DeadStateIndex = 2;
    7.  
    8.    // Parameters Indices
    9.    const int SpeedParameterIndex = 0;
    10.    const int IsAliveParamterIndex = 1;
    11.  
    12.    using (var AnimatorBuilder = new BlobBuilder(Allocator.Persistent))
    13.    {
    14.       ref AnimatorController AnimatorController = ref AnimatorBuilder.ConstructRoot<AnimatorController>();
    15.  
    16.       var ParameterInfos = AnimatorBuilder.Allocate(ref AnimatorController.AnimatorParameterInfos, 2);
    17.  
    18.       // Layers
    19.       var LayerInfo = AnimatorBuilder.Allocate(ref AnimatorController.LayerInfos, 1);
    20.  
    21.       ref var DefaultLayerInfo = ref LayerInfo[0];
    22.  
    23.       DefaultLayerInfo = new AnimatorLayerInfo
    24.       {
    25.          EntryStateIndex = IdleStateIndex,
    26.          BlendingMode = AnimatorLayerBlendingMode.Override,
    27.          BoneMask = ~0,
    28.       };
    29.  
    30.       // Parameters
    31.       {
    32.          SetParameter(AnimatorBuilder, ParameterInfos, SpeedParameterIndex, "Speed", AnimatorParameterType.Float);
    33.          SetParameter(AnimatorBuilder, ParameterInfos, IsAliveParamterIndex, "IsAlive", AnimatorParameterType.Boolean, true);
    34.       }
    35.  
    36.       var States = AnimatorBuilder.Allocate(ref AnimatorController.States, 3); // Idle, Locomotion, Dead
    37.  
    38.       // Idle State (Entry State)
    39.       {
    40.          ref var IdleState = ref States[IdleStateIndex];
    41.  
    42.  
    43.          IdleState = new AnimatorState
    44.          {
    45.             // Animation.Load("Animations\CharacterIdle"),
    46.             PlaybackSpeed = 1.0f
    47.          };
    48.  
    49.          var Transitions = AnimatorBuilder.Allocate(ref IdleState.Transitions, 1);
    50.  
    51.          // Idle -> Locomotion
    52.          {
    53.             ref var ToLocomotion = ref Transitions[0];
    54.  
    55.             ToLocomotion = new StateTransition
    56.             {
    57.                Duration = 0.2f,
    58.                SourceStateIndex = IdleStateIndex,
    59.                DestinationStateIndex = LocomotionStateIndex,
    60.             };
    61.  
    62.             var Conditions = AnimatorBuilder.Allocate(ref ToLocomotion.Conditions, 1);
    63.  
    64.             // Speed > 0.01
    65.             Conditions[0] = new TransitionCondition
    66.             {
    67.                CompareToParameterIndex = SpeedParameterIndex,
    68.                Type = TransitionConditionType.FloatIsGreater,
    69.                CompareFloatValue = 0.01f,
    70.             };
    71.          }
    72.       }
    73.  
    74.       // Locomotiom State
    75.       {
    76.          ref var LocomotionState = ref States[LocomotionStateIndex];
    77.  
    78.          LocomotionState = new AnimatorState
    79.          {
    80.             // Animation.Load("Animations\CharacterWalking"),
    81.             PlaybackSpeed = 1.0f
    82.          };
    83.  
    84.          var Transitions = AnimatorBuilder.Allocate(ref LocomotionState.Transitions, 1);
    85.  
    86.          // Locomotion -> Idle
    87.          {
    88.             ref var ToIdle = ref Transitions[0];
    89.  
    90.             ToIdle = new StateTransition
    91.             {
    92.                Duration = 0.2f,
    93.                SourceStateIndex = IdleStateIndex,
    94.                DestinationStateIndex = LocomotionStateIndex,
    95.             };
    96.  
    97.             var Conditions = AnimatorBuilder.Allocate(ref ToIdle.Conditions, 1);
    98.  
    99.             // Speed < 0.01
    100.             Conditions[0] = new TransitionCondition
    101.             {
    102.                CompareToParameterIndex = SpeedParameterIndex,
    103.                Type = TransitionConditionType.FloatIsLess,
    104.                CompareFloatValue = 0.01f,
    105.             };
    106.          }
    107.       }
    108.  
    109.       // Dead State
    110.       {
    111.          ref var DeadState = ref States[DeadStateIndex];
    112.  
    113.          DeadState = new AnimatorState
    114.          {
    115.             // AnimationClipIndex = Animation.Load("Animations\CharacterDeath"),
    116.             PlaybackSpeed = 1.0f
    117.          };
    118.       }
    119.  
    120.       // Any State Transitions
    121.       {
    122.          var AnyStateTransitions = AnimatorBuilder.Allocate(ref AnimatorController.AnyStateTransitions, 1);
    123.  
    124.          // -> Dead
    125.          {
    126.             ref var ToDeadTransition = ref AnyStateTransitions[0];
    127.  
    128.             ToDeadTransition = new StateTransition
    129.             {
    130.                Duration = 0.05f,
    131.                DestinationStateIndex = DeadStateIndex
    132.             };
    133.  
    134.             var Conditions = AnimatorBuilder.Allocate(ref ToDeadTransition.Conditions, 1);
    135.  
    136.             // IsAlive is false
    137.             Conditions[0] = new TransitionCondition
    138.             {
    139.                CompareToParameterIndex = IsAliveParamterIndex,
    140.                Type = TransitionConditionType.Boolean,
    141.                CompareBooleanValue = false,
    142.             };
    143.          }
    144.       }      
    145.       return AnimatorBuilder.CreateBlobAssetReference<AnimatorController>(Allocator.Persistent);
    146.    }

    Is that how I supposedly should use this?
     
  2. Joachim_Ante

    Joachim_Ante

    Unity Technologies

    Joined:
    Mar 16, 2005
    Posts:
    5,203
    In terms of blob API usage it looks good.
     
    felipin likes this.