Beispiel #1
0
        public PoolController GetPoolController(Fsm fsm, bool createIfNotFound)
        {
            PoolController poolCtrl = null;

            switch (from)
            {
            case FromType.Owner:
                if (fsm == null)
                {
                    return(null);
                }
                if (fsm.Owner == null)
                {
                    return(null);
                }

                poolCtrl = fsm.Owner.GetComponent <PoolController>();
                if (!poolCtrl && createIfNotFound)
                {
                    poolCtrl = fsm.Owner.gameObject.AddComponent <PoolController>();
                }
                break;

            case FromType.GameObject:
                if (gameObject == null)
                {
                    return(null);
                }
                if (gameObject.IsNone || gameObject.Value == null)
                {
                    return(null);
                }

                poolCtrl = gameObject.Value.GetComponent <PoolController>();
                if (!poolCtrl && createIfNotFound)
                {
                    poolCtrl = gameObject.Value.AddComponent <PoolController>();
                }
                break;

            case FromType.Group:
                if (groupName == null)
                {
                    return(null);
                }
                if (groupName.IsNone || string.IsNullOrEmpty(groupName.Value))
                {
                    return(null);
                }

                poolCtrl = PoolController.GetPool(groupName.Value);
                if (!poolCtrl && createIfNotFound)
                {
                    poolCtrl = PoolController.CreatePool(groupName.Value);
                }
                break;
            }

            return(poolCtrl);
        }
Beispiel #2
0
    void GenerateInitialSpawns()
    {
        if (initialSpawnsAt != null)
        {
            var pool = PoolController.GetPool(data.poolGroup);

            for (int i = 0; i < initialSpawnsAt.Length && mSpawnedEntities.Count < data.maxSpawn; i++)
            {
                var pos = initialSpawnsAt[i].position; pos.z = 0f;

                Spawn(pool, pos, Quaternion.identity, null);
            }
        }
    }
Beispiel #3
0
    IEnumerator DoSpawning()
    {
        var pool = PoolController.GetPool(data.poolGroup);

        var startDelay = UnityEngine.Random.Range(data.spawnStartDelayMin, data.spawnStartDelayMax);

        if (startDelay > 0f)
        {
            for (int i = 0; i < mListeners.Length; i++)
            {
                mListeners[i].OnSpawnStart();
            }

            yield return(new WaitForSeconds(UnityEngine.Random.Range(data.spawnStartDelayMin, data.spawnStartDelayMax)));
        }

        while (mIsSpawning)
        {
            //spawn begin
            for (int i = 0; i < mListeners.Length; i++)
            {
                mListeners[i].OnSpawnBegin();
            }

            //wait for spawn ready
            while (true)
            {
                int spawnReadyCount = 0;
                for (int i = 0; i < mListeners.Length; i++)
                {
                    if (mListeners[i].OnSpawning())
                    {
                        spawnReadyCount++;
                    }
                }

                if (spawnReadyCount >= mListeners.Length)
                {
                    break;
                }

                yield return(null);
            }

            //spawn
            var spawnPos = spawnAt ? spawnAt.position : transform.position; spawnPos.z = 0f;
            var spawnRot = data.spawnIgnoreRotation ? Quaternion.identity : spawnAt ? spawnAt.rotation : transform.rotation;

            Spawn(pool, spawnPos, spawnRot, mSpawnParms);

            //spawning finished?
            while (true)
            {
                int spawnFinishCount = 0;
                for (int i = 0; i < mListeners.Length; i++)
                {
                    if (mListeners[i].OnSpawningFinish())
                    {
                        spawnFinishCount++;
                    }
                }

                if (spawnFinishCount >= mListeners.Length)
                {
                    break;
                }

                yield return(null);
            }

            bool isFull = mSpawnedEntities.Count >= data.maxSpawn;
            if (isFull)
            {
                //spawn end
                for (int i = 0; i < mListeners.Length; i++)
                {
                    mListeners[i].OnSpawnEnd();
                }

                while (mSpawnedEntities.Count >= data.maxSpawn)
                {
                    yield return(null);
                }

                //wait for a bit
                yield return(new WaitForSeconds(data.spawnFullDelay));
            }
            else
            {
                //ready up again
                for (int i = 0; i < mListeners.Length; i++)
                {
                    mListeners[i].OnSpawnReady();
                }

                yield return(new WaitForSeconds(UnityEngine.Random.Range(data.spawnDelayMin, data.spawnDelayMax)));
            }
        }

        mSpawningRout = null;
    }