Skip to content

Instantly share code, notes, and snippets.

@sidsbrmnn
Last active November 6, 2024 18:55
Show Gist options
  • Select an option

  • Save sidsbrmnn/4c1b96f07f036a1b6569309fb0d67d6f to your computer and use it in GitHub Desktop.

Select an option

Save sidsbrmnn/4c1b96f07f036a1b6569309fb0d67d6f to your computer and use it in GitHub Desktop.
Usage of Additional Entities in Unity DOTS
using System;
using Unity.Entities;
using UnityEngine;
public struct Spawner : IComponentData
{
public Entity Prefab;
public float Interval;
}
[DisallowMultipleComponent]
public class SpawnerAuthoring : MonoBehaviour
{
[Serializable]
public struct SpawnerDataForBaking
{
public GameObject Prefab;
public float Interval;
}
[SerializeField] private SpawnerDataForBaking[] Data;
private class SpawnerAuthoringBaker : Baker<SpawnerAuthoring>
{
public override void Bake(SpawnerAuthoring authoring)
{
if (authoring.Data == null)
return;
if (authoring.Data.Length == 0)
return;
var entity = GetEntity(TransformUsageFlags.Dynamic);
AddComponent(entity, new Spawner
{
Prefab = GetEntity(authoring.Data[0].Prefab, TransformUsageFlags.Dynamic),
Interval = authoring.Data[0].Interval
});
AddComponent(entity, new Timer { Value = authoring.Data[0].Interval * 2 });
for (int i = 1; i < authoring.Data.Length; i++)
{
var additionalEntity = CreateAdditionalEntity(TransformUsageFlags.Dynamic);
AddComponent(additionalEntity, new Spawner
{
Prefab = GetEntity(authoring.Data[i].Prefab, TransformUsageFlags.Dynamic),
Interval = authoring.Data[i].Interval
});
AddComponent(additionalEntity, new Timer { Value = authoring.Data[i].Interval * 2 });
}
}
}
}
using Unity.Burst;
using Unity.Entities;
using Unity.Transforms;
[UpdateAfter(typeof(TimerSystem))]
public partial struct SpawnerSystem : ISystem
{
[BurstCompile]
public void OnCreate(ref SystemState state)
{
state.RequireForUpdate<BeginSimulationEntityCommandBufferSystem.Singleton>();
}
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
var ecbSingleton = SystemAPI.GetSingleton<BeginSimulationEntityCommandBufferSystem.Singleton>();
var ecb = ecbSingleton.CreateCommandBuffer(state.WorldUnmanaged);
new SpawnJob { ECB = ecb }.Schedule();
}
[BurstCompile]
private partial struct SpawnJob : IJobEntity
{
public EntityCommandBuffer ECB;
public void Execute(in LocalTransform transform, in Spawner spawner, ref Timer timer)
{
if (timer.Value > 0)
return;
timer.Value = spawner.Interval;
var entity = ECB.Instantiate(spawner.Prefab);
ECB.SetComponent(entity, LocalTransform.FromPosition(transform.Position));
}
}
}
using Unity.Burst;
using Unity.Entities;
public struct Timer : IComponentData
{
public float Value;
}
public partial struct TimerSystem : ISystem
{
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
var deltaTime = SystemAPI.Time.DeltaTime;
foreach (var timer in SystemAPI.Query<RefRW<Timer>>())
{
timer.ValueRW.Value = timer.ValueRO.Value - deltaTime;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment