Beispiel #1
0
 void Update()
 {
     if (!initialized)
     {
         return;
     }
     enemy_remaining.Value = EnemyService.remainig();
     //Debug.Log("enemy_remaining.Value" + enemy_remaining.Value.ToString());
 }
Beispiel #2
0
        public static void startSpawn()
        {
            // ゲームステージサービスから敵の数もらう
            int enemy_num = GameStageService.status("enemy_num");

            // スポーン中なら現在のスポーンを中止
            stopSpawn();

            Debug.Log("EnemyService.startSpawn()");

/*
 *          // 1秒に1回、x回まで処理する(敵の出現数が上限を超えてたら待つ)
 *          spawn_disposable = Observable.Interval(System.TimeSpan.FromSeconds(1)).Take(enemy_num).Subscribe(y => {
 *              // ランクに合わせて敵を生成
 *              EnemyEntity enemy = EnemyService.create();
 *              // 左から出るか前から出るかを決定
 *              SpawnerPoint point = EnemyService.random_pos();
 *              // 敵オブジェクトに設定
 *              EnemyService.set_direction(enemy, point);
 *              // 出撃
 *              EnemyService.activate(enemy);
 *          });
 */
            int spawn_count = 0;

            // (敵の出現数が上限を超えてたら待つ)が出来ていないので修正必要
            // スポーンタイマーは基本的に無制限に動作するようにし、動作内で敵を上限まで出現させたかどうか判定させる
            // 出現済みで生きてる敵の数を数えて、出現上限に達していたら次まで待つ
            // 出現済みで生きてる敵の数が出現上限数以下で、かつ生成上限にまだ達していなければ敵を生成
            spawn_disposable = Observable.Interval(System.TimeSpan.FromSeconds(1)).Subscribe(x => {
                // 生成上限に達していたら終了
                if (enemy_num <= spawn_count)
                {
                    return;
                }
                spawn_count += 1;

                // アクティブな敵が出現上限に達していたら終了
                if (spawn_limit <= GameObject.FindGameObjectsWithTag("Enemy").Length)
                {
                    return;
                }

                // ランクに合わせて敵を生成
                EnemyEntity enemy = EnemyService.create();
                // 左から出るか前から出るかを決定
                SpawnerPoint point = EnemyService.random_pos();
                // 敵オブジェクトに設定
                EnemyService.set_direction(enemy, point);
                // 出撃
                EnemyService.activate(enemy);
            });
        }
        async public static void game_over()
        {
            // プレイヤー操作禁止
            Time.timeScale = 0f;

            // 画面フェードを有効化(有効な間はuGUIのボタンが押せないので注意)
            GuiService.fadeEnable();

            // 画面を半フェード
            await GuiService.fadeBacground(0.5f);

            // ゲームオーバー表示
            GuiService.showGameOver();

            MessageBroker.Default.Publish <PlaySe>(new PlaySe {
                name = "GameOver"
            });

            await in_fade(game_over_room_adjust, game_over_strength_adjust, game_over_nums_adjust);

            // 敵を全部消す
            EnemyService.destroyEnemy();

            // プレイヤー復帰
            Time.timeScale = 1f;
            await PlayerService.respawn();

            Time.timeScale = 0f;

            // GameOver表示クリア
            GuiService.hideGameOver();

            // 画面のフェードを戻す
            await GuiService.fadeBacground(0f);

            // 画面フェードを無効化
            GuiService.fadeDisable();

            // ドア開ける

            // 敵スポーン開始
            EnemyService.startSpawn();

            // プレイヤー操作再開
            Time.timeScale = 1f;
        }
        async public static void next(int add_strength, int add_num)
        {
            // プレイヤー操作禁止
            Time.timeScale = 0f;

            // 画面フェードを有効化(有効な間はuGUIのボタンが押せないので注意)
            GuiService.fadeEnable();

            // 画面を半フェード
            await GuiService.fadeBacground(0.5f);

            // ステージクリア表示
            GuiService.showStageClear(_room_clear_count);

            MessageBroker.Default.Publish <PlaySe>(new PlaySe {
                name = "RoomClear"
            });

            await in_fade(default_clear_add, add_strength, add_num);

            // RoomClear表示クリア
            GuiService.hideStageClear();

            // 画面のフェードを戻す
            await GuiService.fadeBacground(0f);

            // 画面フェードを無効化
            GuiService.fadeDisable();

            // ドア開ける

            // 敵スポーン開始
            EnemyService.startSpawn();

            // プレイヤー操作再開
            Time.timeScale = 1f;
        }
        public static IEnumerator in_fade(int add_clear_count, int add_strength, int add_num)
        {
            // 操作があるまで待つ
            while (!Input.GetMouseButtonUp(0) && !Input.GetKeyUp(KeyCode.Space) && !Input.GetKeyUp(KeyCode.Return))
            {
                yield return(null);
            }

            // 画面をフルフェード
            yield return(GuiService.fadeBacground(1f));

            Time.timeScale = 1f;

            // プレイヤー再初期化
            PlayerService.reset();
            yield return(new WaitForEndOfFrame());

            // BGMチェック
            MessageBroker.Default.Publish <BgmCheck>(new BgmCheck());
            yield return(null);

            // 次のステージ情報更新
            _room_clear_count += add_clear_count;
            if (_room_clear_count < 1)
            {
                _room_clear_count = 1;
            }

            _enemy_strength += add_strength;
            if (_enemy_strength < 1)
            {
                _enemy_strength = 1;
            }

            _enemy_num += add_num;
            if (_enemy_num < 1)
            {
                _enemy_num = 1;
            }

            // ドア閉める

            // NextRoomのエフェクトを消去
            EffectService.nextRoomOff();
            yield return(new WaitForEndOfFrame());

            // 地面に落ちてる装備品を削除
            ItemEquipService.ClearTarget();
            ItemEquipService.destroyEquipItem();
            yield return(new WaitForEndOfFrame());

            // 家具配置範囲再初期化
            EffectiveFloorService.reset();

            // 家具再初期化
            FieldObjectService.reset();
            yield return(new WaitForEndOfFrame());

            // 敵削除
            EnemyService.destroyEnemyDead();
            yield return(new WaitForEndOfFrame());

            // リセット後の状態を保存
            MessageBroker.Default.Publish <SaveDataSave>(new SaveDataSave());
            yield return(new WaitForEndOfFrame());

            Time.timeScale = 0f;
        }