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(); }
/// <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)); }
/// <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); }
/// <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]); }