public void ProcessWave(float elapseSeconds, float realElapseSeconds)
        {
            if (Finish)
            {
                return;
            }

            timer += elapseSeconds;

            if (waveElements.Count > 0)
            {
                if (timer > waveElements.Peek().CumulativeTime)
                {
                    WaveElement waveElement = waveElements.Dequeue();
                    int         enemyId     = waveElement.EnemyId;
                    ReferencePool.Release(waveElement);
                    waveElement = null;
                    CurrentEnemyIndex++;
                    GameEntry.Event.Fire(this, SpawnEnemyEventArgs.Create(enemyId));
                }
            }
            else if (!Finish && timer >= NextWaveTime)
            {
                Finish = true;
            }
        }
        public static WaveElement Create(WaveElementData waveElementData, float cumulativeTime)
        {
            WaveElement waveElement = ReferencePool.Acquire <WaveElement>();

            waveElement.waveElementData = waveElementData;
            waveElement.CumulativeTime  = cumulativeTime;
            return(waveElement);
        }
        public void Clear()
        {
            while (waveElements.Count > 0)
            {
                WaveElement waveElement = waveElements.Dequeue();
                ReferencePool.Release(waveElement);
            }

            waveData = null;
            waveElements.Clear();
            CurrentEnemyIndex = 1;
            TotalSpawnTime    = 0f;
            NextWaveTime      = 0f;
            timer             = 0;
            Finish            = false;
        }
        public static Wave Create(WaveData waveData)
        {
            Wave wave = ReferencePool.Acquire <Wave>();

            wave.waveData = waveData;
            WaveElementData[] waveElementDatas = waveData.WaveElementDatas;
            float             timer            = 0;

            foreach (var waveElementData in waveElementDatas)
            {
                timer += waveElementData.SpawnTime;
                wave.waveElements.Enqueue(WaveElement.Create(waveElementData, timer));
            }

            wave.TotalSpawnTime = timer;
            wave.NextWaveTime   = timer + waveData.FinishWaitTIme;
            return(wave);
        }