using Unity.Entities;
using Unity.Mathematics;
public struct MobSpawnData : IComponentData
{
internal Entity mobPrefab;
internal float maxSpawnCount;
internal float3 spawnPosition;
internal float3 endPosition;
}
using Unity.Entities;
using UnityEngine;
public class SpawningAuthoring : MonoBehaviour
{
[SerializeField] internal GameObject mobPrefab;
[SerializeField] internal Transform endPosition;
[SerializeField] internal float maxSpawnCount;
}
public class SpawnerBaker : Baker<SpawningAuthoring>
{
public override void Bake(SpawningAuthoring authoring)
{
var entity = GetEntity(TransformUsageFlags.None);
AddComponent(entity, new MobSpawnData
{
mobPrefab = GetEntity(authoring.mobPrefab, TransformUsageFlags.Dynamic),
spawnPosition = authoring.transform.position,
endPosition = authoring.endPosition.position,
maxSpawnCount = authoring.maxSpawnCount,
});
}
}
using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;
using UnityEngine;
public partial struct SpawningSystem : ISystem
{
float counter;
uint updateCounter;
public void OnUpdate(ref SystemState state)
{
foreach (var item in SystemAPI.Query<MobSpawnData>())
{
if (counter < item.maxSpawnCount)
{
SpawnMob(ref state, item);
Debug.Log("Spawning");
}
}
}
public void SpawnMob(ref SystemState state, MobSpawnData mob)
{
Entity newEntity = state.EntityManager.Instantiate(mob.mobPrefab);
var randomY = Unity.Mathematics.Random.CreateFromIndex(updateCounter++);
state.EntityManager.SetComponentData(newEntity, LocalTransform.FromPosition(mob.spawnPosition + randomY.NextFloat3(-1,1.5f)));
counter++;
}
}