Пример #1
0
    /// <summary>
    /// 1D 隨機產生。
    /// </summary>
    /// <param name="holeArray">1D陣列產生方式</param>
    /// <param name="spawnTime">產生間隔時間</param>
    public IEnumerator SpawnByRandom(string miceName, sbyte[] holeArray, float spawnTime, float intervalTime, float lerpTime, int spawnCount, bool isSkill)
    {
        // < = > test OK
        int _tmpCount = 0;

        int[]        _rndPos   = new int[spawnCount];
        List <sbyte> _holeList = new List <sbyte>(holeArray);

        for (int i = 0; i < spawnCount; i++)
        {
            int rndNum = UnityEngine.Random.Range(0, _holeList.Count);
            _rndPos[i] = _holeList[rndNum];
            _holeList.RemoveAt(rndNum);
        }

        for (int item = 0; item < spawnCount; item++)
        {
            if (item / _rndPos.Length == 1)   // =13 = 歸零
            {
                spawnCount -= item;
                item        = 0;
            }
            yield return(new WaitForSeconds(spawnTime));

            if (hole[_rndPos[item] - 1].GetComponent <HoleState>().holeState == HoleState.State.Open)
            {
                GameObject clone = poolManager.ActiveObject(miceName);
                if (clone != null)
                {
                    clone.transform.gameObject.SetActive(false);
                    hole[_rndPos[item] - 1].GetComponent <HoleState>().holeState = HoleState.State.Closed;
                    _miceSize = hole[_rndPos[item] - 1].transform.GetChild(0).localScale / 10 * miceSize;                 // Scale 版本
                    clone.transform.parent        = hole[_rndPos[item] - 1].transform;                                    // hole[-1]是因為起始值是0
                    clone.transform.localPosition = Vector2.zero;
                    clone.transform.localScale    = hole[_rndPos[item] - 1].transform.GetChild(0).localScale - _miceSize; // 公式 原始大小分為10等份 10等份在減掉 要縮小的等份*乘洞的倍率(1.4~0.9) => 1.0整份-0.2份*1(洞口倍率)=0.8份
                    clone.transform.gameObject.SetActive(true);
                    clone.transform.GetChild(0).SendMessage("Play");
                    spawnTime = Mathf.Lerp(spawnTime, 0f, lerpTime);
                    _tmpCount++;

                    if (_tmpCount - spawnCount == 0)
                    {
                        yield return(new WaitForSeconds(intervalTime));

                        goto Finish;
                    }
                }
                else
                {
                    Debug.Log("Object Pool hasn't Object");
                }
            }
            else
            {
                Debug.Log("Closed!");
            }
        }
        Finish :;
        if (!isSkill)
        {
            Global.spawnFlag = true;
        }
    }