ふりかえり
前回はストーリー表示機能を実装しました!
ステージを進めることで物語が自然と解放されていく仕組みにより、プレイヤーに「もっと先を見たい!」という動機を与えることができました。
記録機能を実装
今回はプレイ記録を蓄積・表示する機能を実装しました!
冒険を振り返ったり、実績に近い楽しみ方を提供することで、プレイヤーのやり込み意欲を高める狙いがあります。
記録する項目は多岐にわたり、バトル・資源獲得・強化・ステージ進行・レアモンスター遭遇など、幅広いプレイ要素に対応しています。
記録する要素は
- 総プレイ時間: ゲームをプレイした総時間
- 転生回数: 転生を実行した総回数
- 死亡回数: プレイヤーが死亡した総回数
- 与えた最大ダメージ: 一度の攻撃で与えた最大ダメージ値
- 受けた最大ダメージ: 一度の攻撃で受けた最大ダメージ値
- 与えた総ダメージ: これまでに与えたダメージの総量
- 受けた総ダメージ: これまでに受けたダメージの総量
- 倒した敵の総数: これまでに倒した敵の総数
- 連続勝利数: 連続で勝利した最大回数
- 連続敗北数: 連続で敗北した最大回数
- クリティカルヒット回数: クリティカルヒットを出した総回数
- 獲得したゴールド総量: これまでに獲得したゴールドの総額
- 獲得したダイヤ総量: これまでに獲得したダイヤの総数
- 獲得した経験値総量: これまでに獲得した経験値の総量
- 使用したゴールド総量: これまでに使用したゴールドの総額
- 使用したダイヤ総量: これまでに使用したダイヤの総数
- 獲得したアーティファクト数: これまでに獲得したアーティファクトの総数
- 強化したアーティファクト回数: アーティファクトを強化した総回数
- 使用した回復薬数: 回復薬を使用した総回数
- 到達した最大ステージ: これまでに到達した最高ステージ
- クリアしたステージ数: クリアしたステージの総数
- レアモンスター遭遇回数: レアモンスターに遭遇した回数
- レアモンスター討伐回数: レアモンスターを倒した回数
- スキル使用回数: 各スキルを使用した総回数
- G強化実行回数: G強化を実行した総回数
- マナ強化実行回数: マナ強化を実行した総回数
- 最大強化レベル: 各強化で到達した最大レベル
- 最高レベル到達: これまでに到達した最高レベル
- 最大所持ゴールド: 一度に所持した最大ゴールド数
- 最大所持ダイヤ: 一度に所持した最大ダイヤ数
です!
スクリプトの変更
Record Manager.cs
RecordManager.csは、プレイ中に自動で記録を更新し、保存・表示する中核スクリプトです。
主な処理の流れは以下の通り:
1. データ構造の定義
RecordDataというクラスを用いて、全記録項目をひとまとめに管理しています。保存時はこのクラスごとシリアライズされます。
2. ゲーム中の自動更新
各種ゲームイベントに対応したRecord○○()というメソッドが多数用意されており、
たとえば敵を倒したときにRecordEnemyDefeated()を呼び出せば、討伐数や連勝記録が自動更新されます。
3. データ保存と読み込み
外部プラグイン「Easy Save 3(ES3)」を使用して、プレイデータを保存・復元しています。
これにより、アプリを閉じても記録が持続されます。
4. UIへの反映
Scroll View内のTextMeshProUGUIに、記録内容をフォーマットして表示しています。
時間は「00:00:00」形式で見やすく整形され、ゴールドやダメージなどの数値もカンマ区切りで読みやすくなっています。
using UnityEngine; using UnityEngine.UI; using TMPro; using System; public class RecordManager : MonoBehaviour { [Header("記録表示UI")] public ScrollRect recordScrollRect; // 記録表示用のスクロールビュー public TextMeshProUGUI recordContentText; // 記録内容表示用のテキスト [Header("Manager References")] public PlayerManager playerManager; public SaveManager saveManager; // 記録データクラス [System.Serializable] public class RecordData { // 基本統計 public float totalPlayTime = 0f; // 総プレイ時間(秒) public int prestigeCount = 0; // 転生回数 public int deathCount = 0; // 死亡回数 // 戦闘記録 public int maxDamageDealt = 0; // 与えた最大ダメージ public int maxDamageReceived = 0; // 受けた最大ダメージ public long totalDamageDealt = 0; // 与えた総ダメージ public long totalDamageReceived = 0; // 受けた総ダメージ public int totalEnemiesDefeated = 0; // 倒した敵の総数 public int maxConsecutiveWins = 0; // 連続勝利数 public int maxConsecutiveLosses = 0; // 連続敗北数 public int criticalHitCount = 0; // クリティカルヒット回数 // 獲得記録 public long totalGoldEarned = 0; // 獲得したゴールド総量 public int totalDiamondEarned = 0; // 獲得したダイヤ総量 public long totalExpEarned = 0; // 獲得した経験値総量 public long totalGoldSpent = 0; // 使用したゴールド総量 public int totalDiamondSpent = 0; // 使用したダイヤ総量 public int totalArtifactsObtained = 0; // 獲得したアーティファクト数 public int totalArtifactUpgrades = 0; // 強化したアーティファクト回数 public int totalHealingPotionsUsed = 0; // 使用した回復薬数 // ステージ・進行記録 public int maxStageReached = 1; // 到達した最大ステージ public int totalStagesCleared = 0; // クリアしたステージ数 public int rareMonsterEncounters = 0; // レアモンスター遭遇回数 public int rareMonsterDefeated = 0; // レアモンスター討伐回数 // スキル・強化記録 public int totalSkillUses = 0; // スキル使用回数 public int totalGPowerUps = 0; // G強化実行回数 public int totalManaUpgrades = 0; // マナ強化実行回数 public int maxUpgradeLevel = 0; // 最大強化レベル public int maxLevelReached = 1; // 最高レベル到達 // 特殊記録 public int maxGoldHeld = 0; // 最大所持ゴールド public int maxDiamondHeld = 0; // 最大所持ダイヤ } private RecordData records = new RecordData(); private float sessionStartTime; private int currentConsecutiveWins = 0; private int currentConsecutiveLosses = 0; void Start() { sessionStartTime = Time.time; LoadRecords(); UpdateRecordDisplay(); } void Update() { // プレイ時間を更新 records.totalPlayTime += Time.deltaTime; } // 記録を保存 public void SaveRecords() { if (saveManager != null) { ES3.Save("RecordData", records, saveManager.saveFileName); Debug.Log("記録データを保存しました"); } } // 記録を読み込み public void LoadRecords() { if (saveManager != null) { records = ES3.Load("RecordData", saveManager.saveFileName, new RecordData()); Debug.Log("記録データを読み込みました"); } } // 記録表示を更新 public void UpdateRecordDisplay() { if (recordContentText == null) return; string recordText = "=== プレイヤー記録 ===\n\n"; // 基本統計 recordText += "【基本統計】\n"; recordText += $"総プレイ時間: {FormatTime(records.totalPlayTime)}\n"; recordText += $"転生回数: {records.prestigeCount}回\n"; recordText += $"死亡回数: {records.deathCount}回\n\n"; // 戦闘記録 recordText += "【戦闘記録】\n"; recordText += $"与えた最大ダメージ: {records.maxDamageDealt:N0}\n"; recordText += $"受けた最大ダメージ: {records.maxDamageReceived:N0}\n"; recordText += $"与えた総ダメージ: {records.totalDamageDealt:N0}\n"; recordText += $"受けた総ダメージ: {records.totalDamageReceived:N0}\n"; recordText += $"倒した敵の総数: {records.totalEnemiesDefeated:N0}体\n"; recordText += $"連続勝利数: {records.maxConsecutiveWins}回\n"; recordText += $"連続敗北数: {records.maxConsecutiveLosses}回\n"; recordText += $"クリティカルヒット回数: {records.criticalHitCount:N0}回\n\n"; // 獲得記録 recordText += "【獲得記録】\n"; recordText += $"獲得したゴールド総量: {records.totalGoldEarned:N0}G\n"; recordText += $"獲得したダイヤ総量: {records.totalDiamondEarned:N0}個\n"; recordText += $"獲得した経験値総量: {records.totalExpEarned:N0}EXP\n"; recordText += $"使用したゴールド総量: {records.totalGoldSpent:N0}G\n"; recordText += $"使用したダイヤ総量: {records.totalDiamondSpent:N0}個\n"; recordText += $"獲得したアーティファクト数: {records.totalArtifactsObtained}個\n"; recordText += $"強化したアーティファクト回数: {records.totalArtifactUpgrades}回\n"; recordText += $"使用した回復薬数: {records.totalHealingPotionsUsed}個\n\n"; // ステージ・進行記録 recordText += "【ステージ・進行記録】\n"; recordText += $"到達した最大ステージ: {records.maxStageReached}ステージ\n"; recordText += $"クリアしたステージ数: {records.totalStagesCleared}ステージ\n"; recordText += $"レアモンスター遭遇回数: {records.rareMonsterEncounters}回\n"; recordText += $"レアモンスター討伐回数: {records.rareMonsterDefeated}回\n\n"; // スキル・強化記録 recordText += "【スキル・強化記録】\n"; recordText += $"スキル使用回数: {records.totalSkillUses:N0}回\n"; recordText += $"G強化実行回数: {records.totalGPowerUps}回\n"; recordText += $"マナ強化実行回数: {records.totalManaUpgrades}回\n"; recordText += $"最大強化レベル: {records.maxUpgradeLevel}レベル\n"; recordText += $"最高レベル到達: {records.maxLevelReached}レベル\n\n"; // 特殊記録 recordText += "【特殊記録】\n"; recordText += $"最大所持ゴールド: {records.maxGoldHeld:N0}G\n"; recordText += $"最大所持ダイヤ: {records.maxDiamondHeld}個\n"; recordContentText.text = recordText; } // 時間をフォーマット(時:分:秒) private string FormatTime(float seconds) { int hours = Mathf.FloorToInt(seconds / 3600); int minutes = Mathf.FloorToInt((seconds % 3600) / 60); int secs = Mathf.FloorToInt(seconds % 60); return $"{hours:00}:{minutes:00}:{secs:00}"; } // 記録更新メソッド群 public void RecordPrestige() { records.prestigeCount++; SaveRecords(); UpdateRecordDisplay(); } public void RecordDeath() { records.deathCount++; currentConsecutiveWins = 0; currentConsecutiveLosses++; if (currentConsecutiveLosses > records.maxConsecutiveLosses) { records.maxConsecutiveLosses = currentConsecutiveLosses; } SaveRecords(); UpdateRecordDisplay(); } public void RecordDamageDealt(int damage) { records.totalDamageDealt += damage; if (damage > records.maxDamageDealt) { records.maxDamageDealt = damage; } SaveRecords(); } public void RecordDamageReceived(int damage) { records.totalDamageReceived += damage; if (damage > records.maxDamageReceived) { records.maxDamageReceived = damage; } SaveRecords(); } public void RecordEnemyDefeated() { records.totalEnemiesDefeated++; currentConsecutiveWins++; currentConsecutiveLosses = 0; if (currentConsecutiveWins > records.maxConsecutiveWins) { records.maxConsecutiveWins = currentConsecutiveWins; } SaveRecords(); } public void RecordCriticalHit() { records.criticalHitCount++; SaveRecords(); } public void RecordGoldEarned(int amount) { records.totalGoldEarned += amount; SaveRecords(); } public void RecordDiamondEarned(int amount) { records.totalDiamondEarned += amount; SaveRecords(); } public void RecordExpEarned(int amount) { records.totalExpEarned += amount; SaveRecords(); } public void RecordGoldSpent(int amount) { records.totalGoldSpent += amount; SaveRecords(); } public void RecordDiamondSpent(int amount) { records.totalDiamondSpent += amount; SaveRecords(); } public void RecordArtifactObtained() { records.totalArtifactsObtained++; SaveRecords(); } public void RecordArtifactUpgrade() { records.totalArtifactUpgrades++; SaveRecords(); } public void RecordHealingPotionUsed() { records.totalHealingPotionsUsed++; SaveRecords(); } public void RecordStageReached(int stage) { if (stage > records.maxStageReached) { records.maxStageReached = stage; } SaveRecords(); } public void RecordStageCleared() { records.totalStagesCleared++; SaveRecords(); } public void RecordRareMonsterEncounter() { records.rareMonsterEncounters++; SaveRecords(); } public void RecordRareMonsterDefeated() { records.rareMonsterDefeated++; SaveRecords(); } public void RecordSkillUse() { records.totalSkillUses++; SaveRecords(); } public void RecordGPowerUp() { records.totalGPowerUps++; SaveRecords(); } public void RecordManaUpgrade() { records.totalManaUpgrades++; SaveRecords(); } public void RecordUpgradeLevel(int level) { if (level > records.maxUpgradeLevel) { records.maxUpgradeLevel = level; } SaveRecords(); } public void RecordLevelReached(int level) { if (level > records.maxLevelReached) { records.maxLevelReached = level; } SaveRecords(); } public void RecordMaxGoldHeld(int amount) { if (amount > records.maxGoldHeld) { records.maxGoldHeld = amount; } SaveRecords(); } public void RecordMaxDiamondHeld(int amount) { if (amount > records.maxDiamondHeld) { records.maxDiamondHeld = amount; } SaveRecords(); } // 記録データを取得(他のスクリプトから参照用) public RecordData GetRecords() { return records; } // 記録データをリセット(全データ削除用) public void ResetRecords() { records = new RecordData(); currentConsecutiveWins = 0; currentConsecutiveLosses = 0; sessionStartTime = Time.time; SaveRecords(); UpdateRecordDisplay(); Debug.Log("RecordManagerのデータがリセットされました。"); } }
Unityでの設定
空のGameObjectにRecord Manager.csをアタッチします。
RecordManagerをアタッチしたGameObjectのInsoector上で記録を表示するためのScroll ViewとText、それと各種必要なObjectをアタッチします。

UIはこのような画面になりました!

動作確認
記録は「記録」メニューから確認可能で、スクロール付きのウィンドウにカテゴリごとに整理されて表示されます。
「戦闘記録」「資源獲得」「スキル使用」「レアモンスター遭遇」など、実績画面のような達成感があります!

まとめ
今回は「記録機能」を実装しました!
- プレイヤーの冒険の軌跡が可視化される
- 自己ベスト更新や実績のような達成感が得られる
- 今後の「実績機能」や「ランキング機能」にも応用可能
と、モチベーションアップに非常に効果的なシステムです。
記録の見せ方やUI演出を工夫することで、自己成長を感じやすいゲーム体験を提供できると実感しました。
進捗
今回はメニューの記録機能の追加をしました!
- (済)オート戦闘:ボタン操作なしでもバトルが進むようにする。
- (済)オートスキル発動:スキルも自動で発動する機能。
- (済)UIのブラッシュアップ:デザインとレイアウトを整えて見やすくする。
- (済)ステージ数の拡充(最低20):遊びごたえを高めるためにボリュームアップ。
- 復活機能(広告視聴):ゲームオーバー時、広告視聴で復活できる仕組み。
- 広告報酬でダイヤ獲得:無課金でもダイヤが手に入る仕組み。
- (済)G強化・アーティファクト・転生の拡張:各システムにさらなる深みを持たせる。
- (済)回復薬の追加:ステージを進めやすくする。
- アニメーションの追加:ゲーム画面にもっと動きを持たせる。
- (済)レアモンスターの追加:わくわく感を追加する。
- 放置要素の追加:プレイしていない時間も強くなる。
- (仮済)メニューの内容追加:ストーリー、記録、ガイドなどプレイヤーが遊びやすくする。
次回予告
次回は「ガイド機能」を実装予定!
初心者でも困らず進められる、親切設計を目指します!
お楽しみに!