ふりかえり
前回は、Unityで開発したゲームをiOSの実機でビルドして動かすところまで進めました!
自分のスマホで自作ゲームが動いているのを見ると、本当に感動しますね。作ってきた努力が一気に報われた気持ちになります!
戦闘倍速機能を実装!
今回は、クローズドテストでテスターの方からいただいたフィードバックをもとに、ゲームの改善を行っていきます。
いただいたフィードバック内容は以下の通り:
- 戦闘のテンポが悪く、やや退屈に感じる
- ステージ選択ができないため不便
- モンスターの画像がぼやけて見える
- 横画面にするとレイアウトが崩れてしまうので、固定にしてほしい
…など、たくさんの貴重なご意見をいただきました!
今回はその中でも、「戦闘のテンポが悪い」という点を改善するために、倍速機能を実装しました!
実装内容:1.5倍速・2倍速の導入
- 1.5倍速:常に使用可能
- 2倍速:広告を視聴することで、30分間だけ有効化
プレイヤーが快適にバトルを楽しめるように、スピードの切り替えボタンを設け、状況に応じて自由に変更できるようにしました。
スクリプト
今回の倍速機能は、主に以下の2つのスクリプトに分けて実装しています:
- BattleManager.cs
- BattleUIManager.cs
それぞれの役割と処理の流れを説明します。
1. BattleManager.cs:バトルの速度管理を担当
主な処理内容:
- SetBattleSpeed(float speed) → 指定された速度(0.5〜3倍)でバトルの進行速度を設定。Time.timeScale を使ってゲーム全体の時間を調整します。
- UpdateSpeed2xTimer() → 2倍速の残り時間をカウントダウンし、終了したら1倍速に自動で戻す処理です。Time.unscaledDeltaTime を使って、時間の流れに影響されずに残り時間を正確に制御します。
- HasSpeed2xTime() などのAPI群 → 2倍速の時間の管理を外部UIなどから扱いやすくするための関数です。
// 戦闘倍速を設定 public void SetBattleSpeed(float speed) { battleSpeed = Mathf.Clamp(speed, 0.5f, 3.0f); // 0.5倍から3倍の範囲に制限 Time.timeScale = battleSpeed; Debug.Log($"戦闘倍速を{battleSpeed}倍に設定しました"); } // 2倍速タイマーの更新 private void UpdateSpeed2xTimer() { if (speed2xRemainingTime > 0) { speed2xRemainingTime -= Time.unscaledDeltaTime; // Time.timeScaleの影響を受けない if (speed2xRemainingTime <= 0) { speed2xRemainingTime = 0; if (Mathf.Approximately(battleSpeed, 2.0f)) { SetBattleSpeed(1.0f); Debug.Log("2倍速の時間が切れました。1倍速に戻しました。"); } } } } // 2倍速の時間操作API public bool HasSpeed2xTime() { return speed2xRemainingTime > 0; } public float GetSpeed2xRemainingTime() { return speed2xRemainingTime; } public void AddSpeed2xTime(float seconds) { speed2xRemainingTime += seconds; } public void SetSpeed2xTime(float seconds) { speed2xRemainingTime = Mathf.Max(0, seconds); }
2. BattleUIManager.cs:UIとの連携・ボタン挙動を管理
主な処理内容:
- UpdateBattleSpeedButtons() → 現在の戦闘スピードに応じて、UI上のボタン表示や色を動的に更新します。
- ToggleBattleSpeed() → 同じボタンを押すと、該当スピードに切り替え/元に戻すようにトグル動作します。
- OnSpeed2xButtonClicked() → 広告視聴の有無によって、2倍速を有効化するか、広告表示を行うかを判断します。
// 戦闘倍速ボタンの更新 private void UpdateBattleSpeedButtons() { if (battleManager == null) return; float currentSpeed = battleManager.GetBattleSpeed(); // 1.5倍速 if (battleSpeed1_5xButton != null) { bool isActive = Mathf.Approximately(currentSpeed, 1.5f); UpdateBattleSpeedButton(battleSpeed1_5xButton, battleSpeed1_5xButtonText, "1.5x", isActive); } // 2倍速(広告必要時は色・文言変更) if (battleSpeed2xButton != null) { bool isActive = Mathf.Approximately(currentSpeed, 2.0f); bool hasSpeed2xTime = battleManager != null && battleManager.HasSpeed2xTime(); string buttonText = hasSpeed2xTime ? "2x" : "2x(広告)"; Color buttonColor = hasSpeed2xTime ? (isActive ? battleSpeedActiveColor : battleSpeedInactiveColor) : battleSpeedAdRequiredColor; UpdateBattleSpeedButtonWithColor(battleSpeed2xButton, battleSpeed2xButtonText, buttonText, isActive, buttonColor); } } // 戦闘倍速トグル(同じボタンで1倍へ戻す) public void ToggleBattleSpeed(float targetSpeed) { if (battleManager == null) return; float currentSpeed = battleManager.GetBattleSpeed(); if (Mathf.Approximately(currentSpeed, targetSpeed)) { battleManager.SetBattleSpeed(1.0f); } else { battleManager.SetBattleSpeed(targetSpeed); } } // 2倍速ボタンクリック private void OnSpeed2xButtonClicked() { if (battleManager == null) return; float currentSpeed = battleManager.GetBattleSpeed(); bool hasSpeed2xTime = battleManager.HasSpeed2xTime(); if (Mathf.Approximately(currentSpeed, 2.0f)) { battleManager.SetBattleSpeed(1.0f); return; } if (hasSpeed2xTime) { battleManager.SetBattleSpeed(2.0f); } else { ShowSpeed2xAd(); // 広告視聴で時間獲得 } }
動作確認
実際にプレイしてみたところ、1.5倍速にするだけでも戦闘アニメーションや演出のテンポが大幅に改善されました!
また、2倍速は広告を見て一時的に使用できるようにしたことで、プレイ体験とマネタイズのバランスも意識した設計になっています。
まとめ
今回は、テスターの皆さんからのご意見をもとに、戦闘のテンポ改善のための倍速機能を実装しました!
- 1.5倍速:常時使用可
- 2倍速:広告視聴で30分限定解放
この機能により、よりストレスのない快適なバトルが楽しめるようになったと思います!
次回予告
次回は、「ステージが選べないのが不便」というご意見をもとに、ステージ選択機能を実装していきます!
プレイヤーの皆さんの声に応えて、どんどん改善していけるのは本当に嬉しいです。
どうぞお楽しみに!