Search Unity

Resolved Check Max and Min Value

Discussion in 'Entity Component System' started by veliefendi, Sep 11, 2022.

  1. veliefendi

    veliefendi

    Joined:
    Jan 14, 2017
    Posts:
    24
    Hello, I am arraying entities in 2d grid layout. I have to find the Max Column and Min Column values so that I can find the maximum distance that the grid can travel left and right on the screen. But the code below is trying to find the max and min values, but the min and max values do not change even if all the columns are gone from the beginning or the end. I guess even though the entities are lost, the component data continues to live in the chunk. Is there a way to delete it completely or to check if a certain component data has an entity?

    Code (csharp):
    1.  
    2. public partial class AlienMovement : SystemBase
    3. {
    4.     public float time;
    5.     public int index;
    6.     public int maxRowValue;
    7.     public int maxColumnValue;
    8.     public int minColumnValue;
    9.     public bool forward;
    10.  
    11.  
    12.     protected override void OnCreate()
    13.     {
    14.         time = 1;
    15.     }
    16.     protected override void OnUpdate()
    17.     {
    18.         var soldierQuery = GetEntityQuery(typeof(Translation), ComponentType.ReadOnly<RowData>(), ComponentType.ReadOnly<ColumnData>());
    19.  
    20.         Entities
    21.             .WithAll<SpaceInvaderTag>()
    22.             .ForEach((in RowData rowData) =>
    23.             {
    24.                 int thisNum = rowData.Row;
    25.                 if (thisNum > maxRowValue) { maxRowValue = thisNum; }
    26.  
    27.             }).WithoutBurst().Run();
    28.  
    29.         Entities
    30.             .WithAll<SpaceInvaderTag>()
    31.             .ForEach((in ColumnData columnData) =>
    32.             {
    33.                 int minNumber = columnData.Column;
    34.                 int maxNumber = columnData.Column;
    35.                 if(minNumber < minColumnValue) { minColumnValue = minNumber; }
    36.                 if(maxNumber > maxColumnValue) { maxColumnValue = maxNumber; }
    37.             }).WithoutBurst().Run();
    38.  
    39.         Debug.Log("minColumData: " + minColumnValue);
    40.         Debug.Log("maxColumnData: " + maxColumnValue);
    41.  
    42.  
    43.         //Zaman 1 sn'ye artıkça index'de 1 artıyor.
    44.         time -= Time.DeltaTime;
    45.         if (time < 0)
    46.         {
    47.             index++;
    48.             time = 1;
    49.         }
    50.         //Row index'i maxValue ulaşınca sıfırlıyor
    51.         if (index >= maxRowValue + 1) { index = 0; }
    52.  
    53.  
    54.  
    55.  
    56.  
    57.         //var denemeJob = new DenemeJob
    58.         //{
    59.         //    TranslationTypeHandle = GetComponentTypeHandle<Translation>(false),
    60.         //    RowTypeHandle = GetComponentTypeHandle<RowData>(true),
    61.         //    DeltaTime = Time.DeltaTime,
    62.         //    Row = index
    63.         //};
    64.  
    65.  
    66.  
    67.         //Dependency = denemeJob.Schedule(soldierQuery, Dependency);
    68.         //RequireForUpdate(soldierQuery);
    69.  
    70.  
    71.     }
    72. }
    73.  
    74. public partial struct DenemeJob : IJobEntityBatch
    75. {
    76.     public ComponentTypeHandle<Translation> TranslationTypeHandle;
    77.     [ReadOnly] public ComponentTypeHandle<RowData> RowTypeHandle;
    78.     public float DeltaTime;
    79.     public int Row;
    80.  
    81.     public void Execute(ArchetypeChunk batchInChunk, int batchIndex)
    82.     {
    83.         var translationArray = batchInChunk.GetNativeArray(TranslationTypeHandle);
    84.         var rowDataArray = batchInChunk.GetNativeArray(RowTypeHandle);
    85.  
    86.  
    87.         for (int j = 0; j < batchInChunk.Count; j++)
    88.         {
    89.  
    90.             if (Row == rowDataArray[j].Row)
    91.             {
    92.                 var translation = translationArray[j];
    93.                 translation.Value.x += 0.7f * DeltaTime;
    94.                 translationArray[j] = translation;
    95.             }
    96.  
    97.         }
    98.  
    99.     }
    100.  
    101. }
    102.  
    103.  
    104.  
     
    Last edited: Sep 13, 2022
  2. veliefendi

    veliefendi

    Joined:
    Jan 14, 2017
    Posts:
    24
    Thank you for your concern.

    If somebody is interested, here is working script :
    Code (CSharp):
    1. public partial class SpaceInvaderMovement : SystemBase
    2. {
    3.     public float time;
    4.     public int index;
    5.     public int maxRowValue;
    6.  
    7.  
    8.  
    9.     protected override void OnCreate()
    10.     {
    11.         time = 1;
    12.     }
    13.     protected override void OnUpdate()
    14.     {
    15.         var soldierQuery = GetEntityQuery(typeof(Translation), ComponentType.ReadOnly<RowData>(), ComponentType.ReadOnly<ColumnData>());
    16.  
    17.         NativeArray<int> columns = new NativeArray<int>(2, Allocator.TempJob);
    18.  
    19.         DenemeJob2 denemeJob2 = new DenemeJob2
    20.         {
    21.             columnDataTypeHandle = GetComponentTypeHandle<ColumnData>(true),
    22.             minMaxColumns = columns
    23.         };
    24.  
    25.         Dependency = denemeJob2.Schedule(soldierQuery, Dependency);
    26.         Dependency.Complete();
    27.  
    28.         Debug.Log("min column: " + denemeJob2.minMaxColumns[0]);
    29.         Debug.Log("max column: " + denemeJob2.minMaxColumns[1]);
    30.  
    31.  
    32.  
    33.         //Zaman 1 sn'ye artıkça index'de 1 artıyor.
    34.         time -= Time.DeltaTime;
    35.         if (time < 0)
    36.         {
    37.             index++;
    38.             time = 1;
    39.         }
    40.         //Row index'i maxValue ulaşınca sıfırlıyor
    41.         if (index >= maxRowValue + 1) { index = 0; }
    42.  
    43.  
    44.  
    45.  
    46.  
    47.         var denemeJob = new DenemeJob
    48.         {
    49.             TranslationTypeHandle = GetComponentTypeHandle<Translation>(false),
    50.             RowTypeHandle = GetComponentTypeHandle<RowData>(true),
    51.             DeltaTime = Time.DeltaTime,
    52.             Row = index
    53.         };
    54.  
    55.  
    56.  
    57.         Dependency = denemeJob.Schedule(soldierQuery, Dependency);
    58.         RequireForUpdate(soldierQuery);
    59.  
    60.         columns.Dispose();
    61.  
    62.     }
    63. }
    64.  
    65. public partial struct DenemeJob : IJobEntityBatch
    66. {
    67.     public ComponentTypeHandle<Translation> TranslationTypeHandle;
    68.     [ReadOnly] public ComponentTypeHandle<RowData> RowTypeHandle;
    69.     public float DeltaTime;
    70.     public int Row;
    71.  
    72.     public void Execute(ArchetypeChunk batchInChunk, int batchIndex)
    73.     {
    74.         var translationArray = batchInChunk.GetNativeArray(TranslationTypeHandle);
    75.         var rowDataArray = batchInChunk.GetNativeArray(RowTypeHandle);
    76.  
    77.  
    78.         for (int j = 0; j < batchInChunk.Count; j++)
    79.         {
    80.  
    81.             if (Row == rowDataArray[j].Row)
    82.             {
    83.                 var translation = translationArray[j];
    84.                 translation.Value.x += 0.7f * DeltaTime;
    85.                 translationArray[j] = translation;
    86.             }
    87.  
    88.         }
    89.  
    90.     }
    91.  
    92. }
    93.  
    94. public partial struct DenemeJob2 : IJobEntityBatch
    95. {
    96.     [ReadOnly] public ComponentTypeHandle<ColumnData> columnDataTypeHandle;
    97.     public NativeArray<int> minMaxColumns;
    98.  
    99.     public void Execute(ArchetypeChunk batchInChunk, int batchIndex)
    100.     {
    101.         var ColumnArray = batchInChunk.GetNativeArray(columnDataTypeHandle);
    102.  
    103.         if(ColumnArray.Length == 0) { return; }
    104.  
    105.  
    106.         int min = int.MaxValue;
    107.         foreach(var column in ColumnArray)
    108.         {
    109.             if(column.Column < min)
    110.             {
    111.                 min = column.Column;
    112.             }
    113.         }
    114.         minMaxColumns[0] = min;
    115.  
    116.  
    117.         int max = int.MinValue;
    118.         foreach(var column in ColumnArray)
    119.         {
    120.             if(column.Column > max)
    121.             {
    122.                 max = column.Column;
    123.             }
    124.         }
    125.         minMaxColumns[1] = max;
    126.     }
    127. }
    128.  
    129.  
    130.  
     
    Last edited: Sep 14, 2022