Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Mathmatics.Random returns the same value

Discussion in 'Entity Component System' started by hardcodednumber, Jul 21, 2020.

  1. hardcodednumber

    hardcodednumber

    Joined:
    May 26, 2014
    Posts:
    88
    I am trying to use rand to return a position randomly on the board. Every time the counter reaches zero it spawns at the same location. Its as if random never grabs the next 'random' number. I'm doing something wrong, any ideas?

    Code (CSharp):
    1.     [UpdateAfter(typeof(BrickLayoutSystem))]
    2.     [DisableAutoCreation]
    3.     public class PowerUpCreateSystem : JobComponentSystem
    4.     {
    5.         private const float PowerUpHorizontalOffset = 2f;
    6.  
    7.         private EntityCommandBufferSystem _entityCommandBufferSystem;
    8.         private NativeArray<Entity> _powerUpEntities;
    9.         private Random _random;
    10.  
    11.         public NativeArray<Entity> PowerUps { get => _powerUpEntities; set => _powerUpEntities = value; }
    12.  
    13.         protected override void OnCreate()
    14.         {
    15.             _entityCommandBufferSystem = World.GetExistingSystem<BeginSimulationEntityCommandBufferSystem>();
    16.             _random = new Random((uint)DateTime.UtcNow.Ticks);
    17.         }
    18.  
    19.         protected override void OnDestroy()
    20.         {
    21.             base.OnDestroy();
    22.  
    23.             _powerUpEntities.Dispose();
    24.         }
    25.  
    26.         protected override JobHandle OnUpdate(JobHandle inputDeps)
    27.         {
    28.             var random = _random;
    29.             var deltaTime = Time.DeltaTime;
    30.             var buffer = _entityCommandBufferSystem.CreateCommandBuffer().ToConcurrent();
    31.             var powerUps = PowerUps;
    32.  
    33.             var handle = Entities.ForEach((Entity entity, int entityInQueryIndex, ref PowerUpCreateData createData, in PowerUpBoardData boardData) => {
    34.                 createData.TimeSincePowerUpCreated -= deltaTime;
    35.  
    36.                 if (createData.TimeSincePowerUpCreated <= 0) {
    37.                     var powerUp = powerUps[random.NextInt(0, powerUps.Length)];
    38.  
    39.                     var x = boardData.boardSize.x * 0.5f - PowerUpHorizontalOffset;
    40.                     var powerUpPosition = new float3(random.NextFloat(-x, x), random.NextFloat(0, createData.SpawnRange), 0f);
    41.                     var powerUpInstance = buffer.Instantiate(entityInQueryIndex, powerUp);
    42.  
    43.                     buffer.SetComponent(entityInQueryIndex, powerUpInstance, new Translation() { Value = powerUpPosition });
    44.  
    45.                     var randomTime = random.NextFloat(createData.MinTime, createData.MaxTime);
    46.                     createData.TimeSincePowerUpCreated = randomTime;
    47.                     Debug.Log($"Pos: {powerUpPosition}");
    48.                 }
    49.             }).Schedule(inputDeps);
    50.  
    51.             _entityCommandBufferSystem.AddJobHandleForProducer(handle);
    52.  
    53.             return handle;
    54.         }
    55.     }
     
  2. tertle

    tertle

    Joined:
    Jan 25, 2011
    Posts:
    3,753
    You are forgetting it is a struct, unless you write back the internal state it'll return the same result everytime.

    The pattern I usually follow is this.

    Code (CSharp):
    1. // state 0 is an error
    2. var random = new Random((uint)UnityEngine.Random.Range(1, int.MaxValue));
    3.  
    4. this.Entities.ForEach((Entity entity, int entityInQueryIndex) =>
    5. {
    6.     // if you don't set the state different for each entity/chunk then it'll return the same value for every thread as it will have the same state.
    7.     random.InitState((uint)(random.state + entityInQueryIndex));
    8. })
    9. .ScheduleParallel();
    10.  
     
  3. hardcodednumber

    hardcodednumber

    Joined:
    May 26, 2014
    Posts:
    88