Exemple #1
0
    static IEnumerator update(EntryHolder entries, SpawnInfo spawnInfo)
    {
        spawnInfo.group.spawns.notifyBegin();


        SpawnState state = new SpawnState();

        state.totalWeight = entries.sumWeight();


        for (state.spawned = 0; state.spawned < spawnInfo.targetMemberCount; state.spawned++)
        {
            do
            {
                yield return(new WaitForSeconds(spawnInfo.intervalTime));

                // グループ内に空きがなければ回り続ける
            }while(spawnInfo.group.memberCount >= spawnInfo.group.maxStayCapacity);


            var ent = spawnInfo.getEntry(ref state, ref spawnInfo, ref entries);

            var act = spawnInfo.spawn(ent.definition, ref state, ref spawnInfo);

            act.character = ent.ch;

            spawnInfo.group.enter(act);
        }


        spawnInfo.group.spawns.notifyEnd();
    }
Exemple #2
0
    /// <summary>
    /// キャラクター生成を開始する。
    /// </summary>
    /// <param name="group">生まれた敵の属するグループ</param>
    ///
    /// <param name="spawn">敵出現位置を決める関数</param>
    ///
    /// <param name="getEntry">敵種類を決める関数</param>
    ///
    static public void beginSpawn(ref EntryHolder entries, ref SpawnInfo spawnInfo)
    {
        spawnInfo.tfCenter = spawnInfo.tfCenter ?? spawnInfo.group.tf;

        spawnInfo.getEntry = spawnInfo.getEntry ?? EntryGetterDefines.getEntryByWeight;

        spawnInfo.spawn = spawnInfo.spawn ?? SpawnDefines.spawnOnGround;

        GM.startCoroutine(update(entries, spawnInfo));
    }
Exemple #3
0
        /// <summary>
        /// 重みを生成数と解釈して、定常的に生成する。
        /// </summary>
        static public EntryUnit getEntryInOrder(ref SpawnState state, ref SpawnInfo spawnInfo, ref EntryHolder entries)
        {
            var ent = entries[state.entryIndex];

            if (++state.entryCounter > ent.weight)
            {
                if (++state.entryIndex > entries.length)
                {
                    state.entryIndex = 0;
                }

                state.entryCounter = 0;
            }

            return(ent);
        }
Exemple #4
0
        /// <summary>
        /// キャラクター定義エントリが、重み付きランダム値で選択される。
        /// </summary>
        static public EntryUnit getEntryByWeight(ref SpawnState state, ref SpawnInfo spawnInfo, ref EntryHolder entries)
        {
            var rvalue = Random.value * state.totalWeight;

            var limit = 0.0f;

            for (var i = entries.length; i-- > 1;)
            {
                limit += entries[i].weight;

                if (rvalue < limit)
                {
                    return(entries[i]);
                }
            }

            return(entries[0]);
        }