Files
jelito/Assets/jelycho/Code/Enemies/WavesManagerActor.cs
2025-10-24 13:54:27 +02:00

69 lines
2.0 KiB
C#

using System.Collections.Generic;
using RebootKit.Engine.Extensions;
using RebootKit.Engine.Main;
using RebootKit.Engine.Simulation;
using RebootReality.jelycho.Enemies.Zombie;
using Unity.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;
namespace RebootReality.jelycho.Enemies {
public class WavesManagerActor : Actor {
[SerializeField] AssetReferenceGameObject[] m_ZombiesPrefabs;
[SerializeField] Transform[] m_SpawnPoints;
[SerializeField] float m_SpawnRate = 32;
[SerializeField] int m_MaxZombies = 1000;
int m_Stage;
int m_ZombiesToSpawn;
float m_SpawnTimer;
readonly List<ZombieActor> m_AliveZombies = new List<ZombieActor>(128);
//
// @MARK: Waves Manager
//
public void StartWave(int stage) {
m_Stage = stage;
m_ZombiesToSpawn = stage * 10;
m_SpawnTimer = 1.0f;
}
void SpawnZombieAtRandomPosition() {
Transform spawnPoint = m_SpawnPoints.Random();
ZombieActor zombieActor = (ZombieActor) RR.SpawnActor(m_ZombiesPrefabs.Random(), spawnPoint.position, spawnPoint.rotation);
zombieActor.died.AddListener(() => {
m_AliveZombies.RemoveSwapBack(zombieActor);
});
m_AliveZombies.Add(zombieActor);
}
//
// @MARK: IActor
//
protected override IActorData CreateActorData() {
return new NoActorData();
}
public override void OnServerTick(float deltaTime) {
base.OnServerTick(deltaTime);
if (m_ZombiesToSpawn <= 0) {
return;
}
if (m_AliveZombies.Count >= m_MaxZombies) {
return;
}
m_SpawnTimer -= deltaTime;
if (m_SpawnTimer <= 0.0f) {
SpawnZombieAtRandomPosition();
m_ZombiesToSpawn -= 1;
m_SpawnTimer = 1.0f / m_SpawnRate;
}
}
}
}