周回要素は、SRPGのリプレイ性を高めます。
引き継ぎや隠し要素を実装すれば、何度でも楽しめます。
この記事では、設計方法を詳しく解説します。
✨ この記事でわかること
- データ引き継ぎシステムの実装
- 難易度アップシステムの実装
- 隠し要素解放システムの実装
- 周回報酬システムの実装
- 実装例とコード

周回要素は、データ引き継ぎから始めましょう。レベルやアイテムを引き継げば、リプレイ性が高まります。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
データ引き継ぎシステムの実装

データ引き継ぎは、周回時にデータを保持します。
実装方法を紹介します。
引き継ぎデータ構造
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
using UnityEngine; using System.Collections.Generic; [System.Serializable] public class CarryOverData { public int playCount = 0; // 周回回数 public List<UnitData> units = new List<UnitData>(); public List<ItemData> items = new List<ItemData>(); public int totalPlayTime = 0; public HashSet<string> unlockedEvents = new HashSet<string>(); } [System.Serializable] public class UnitData { public string unitID; public int level; public int attack; public int defense; public List<SkillData> learnedSkills = new List<SkillData>(); } public class CarryOverSystem : MonoBehaviour { private CarryOverData carryOverData = new CarryOverData(); public void SaveCarryOverData() { // 現在のデータを保存 carryOverData.playCount++; // ユニットデータを保存 List<Unit> playerUnits = UnitManager.Instance.GetPlayerUnits(); carryOverData.units.Clear(); foreach (var unit in playerUnits) { UnitData data = new UnitData { unitID = unit.unitID, level = unit.level, attack = unit.attack, defense = unit.defense, learnedSkills = new List<SkillData>(unit.learnedSkills) }; carryOverData.units.Add(data); } // JSONで保存 string json = JsonUtility.ToJson(carryOverData, true); PlayerPrefs.SetString("CarryOverData", json); PlayerPrefs.Save(); } public void LoadCarryOverData() { if (PlayerPrefs.HasKey("CarryOverData")) { string json = PlayerPrefs.GetString("CarryOverData"); carryOverData = JsonUtility.FromJson<CarryOverData>(json); } } public void ApplyCarryOverData() { // 引き継ぎデータを適用 foreach (var unitData in carryOverData.units) { Unit unit = UnitManager.Instance.GetUnit(unitData.unitID); if (unit != null) { unit.level = unitData.level; unit.attack = unitData.attack; unit.defense = unitData.defense; unit.learnedSkills = new List<SkillData>(unitData.learnedSkills); } } } } |
このコードで、データ引き継ぎが実装できます。
レベル、ステータス、スキルを引き継げます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
難易度アップシステムの実装

難易度アップシステムは、周回時に難易度が上昇します。
実装方法を紹介します。
難易度上昇システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class NewGamePlusSystem : MonoBehaviour { public CarryOverSystem carryOverSystem; public DifficultySystem difficultySystem; public void StartNewGamePlus() { CarryOverData data = carryOverSystem.GetCarryOverData(); int playCount = data.playCount; // 難易度を上昇 float difficultyMultiplier = 1.0f + (playCount * 0.1f); // 周回ごとに10%上昇 difficultySystem.SetDifficultyMultiplier(difficultyMultiplier); // 引き継ぎデータを適用 carryOverSystem.ApplyCarryOverData(); Debug.Log($"New Game+開始(周回{playCount}回目、難易度{difficultyMultiplier:F1}倍)"); } public void AdjustEnemyStatsForNewGamePlus(Unit enemy, int playCount) { float multiplier = 1.0f + (playCount * 0.1f); enemy.maxHP = Mathf.RoundToInt(enemy.maxHP * multiplier); enemy.currentHP = enemy.maxHP; enemy.attack = Mathf.RoundToInt(enemy.attack * multiplier); enemy.defense = Mathf.RoundToInt(enemy.defense * multiplier); } } |
このコードで、難易度アップが実装できます。
周回ごとに難易度が上昇します。

難易度アップは、周回ごとに10%上昇が標準です。高すぎると難しすぎ、低すぎると意味がありません。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
隠し要素解放システムの実装

隠し要素解放は、周回時に新しい要素が解放されます。
実装方法を紹介します。
隠し要素管理システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
[System.Serializable] public class HiddenElement { public string elementID; public string elementName; public int unlockCondition; // 解放条件(周回回数など) public bool isUnlocked = false; } public class HiddenElementSystem : MonoBehaviour { public List<HiddenElement> hiddenElements = new List<HiddenElement>(); public CarryOverSystem carryOverSystem; public void CheckUnlockConditions() { CarryOverData data = carryOverSystem.GetCarryOverData(); int playCount = data.playCount; foreach (var element in hiddenElements) { if (!element.isUnlocked && playCount >= element.unlockCondition) { UnlockElement(element); } } } void UnlockElement(HiddenElement element) { element.isUnlocked = true; Debug.Log($"隠し要素解放: {element.elementName}"); // 解放処理 ApplyUnlockedElement(element); } void ApplyUnlockedElement(HiddenElement element) { switch (element.elementID) { case "secret_character": // 隠しキャラクターを追加 UnitManager.Instance.AddSecretCharacter(); break; case "secret_stage": // 隠しステージを解放 StageManager.Instance.UnlockSecretStage(); break; case "secret_skill": // 隠しスキルを解放 SkillManager.Instance.UnlockSecretSkill(); break; } } } |
このコードで、隠し要素解放が実装できます。
周回回数に応じて、要素が解放されます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
周回報酬システムの実装

周回報酬は、周回時に報酬が与えられます。
実装方法を紹介します。
報酬システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public class ReplayRewardSystem : MonoBehaviour { public CarryOverSystem carryOverSystem; public InventorySystem inventorySystem; public void GiveReplayRewards() { CarryOverData data = carryOverSystem.GetCarryOverData(); int playCount = data.playCount; // 周回報酬を計算 int rewardGold = playCount * 1000; // 周回ごとに1000ゴールド int rewardExp = playCount * 100; // 周回ごとに100経験値 // 報酬を付与 inventorySystem.AddGold(rewardGold); // 全ユニットに経験値を付与 List<Unit> units = UnitManager.Instance.GetPlayerUnits(); foreach (var unit in units) { unit.currentExp += rewardExp; } Debug.Log($"周回報酬: ゴールド{rewardGold}、経験値{rewardExp}"); } public void GiveCompletionRewards(bool isFirstClear) { if (isFirstClear) { // 初回クリア報酬 inventorySystem.AddItem("first_clear_reward", 1); } else { // 周回報酬 GiveReplayRewards(); } } } |
このコードで、周回報酬が実装できます。
周回回数に応じて、報酬が与えられます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実装例:完全な周回要素システム

実際に使える、完全な周回要素システムの実装例を紹介します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using UnityEngine; public class CompleteReplaySystem : MonoBehaviour { [Header("システム")] public CarryOverSystem carryOverSystem; public NewGamePlusSystem newGamePlus; public HiddenElementSystem hiddenElements; public ReplayRewardSystem rewards; public void OnGameClear() { // 引き継ぎデータを保存 carryOverSystem.SaveCarryOverData(); // 隠し要素をチェック hiddenElements.CheckUnlockConditions(); // 報酬を付与 rewards.GiveCompletionRewards(false); } public void StartNewGamePlus() { // New Game+を開始 newGamePlus.StartNewGamePlus(); // 引き継ぎデータを適用 carryOverSystem.ApplyCarryOverData(); } } |
このコードで、完全な周回要素システムが実装できます。
データ引き継ぎ、難易度アップ、隠し要素、報酬を統合しています。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
よくある質問(FAQ)

Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
まとめ

周回要素は、データ引き継ぎから始めましょう。
引き継ぎや隠し要素を実装すれば、リプレイ性が高まります。
✅ 今日から始める3ステップ
- ステップ1:データ引き継ぎシステムを実装する(所要3時間)
- ステップ2:難易度アップシステムを実装する(所要2時間)
- ステップ3:隠し要素解放システムを実装する(所要2時間)
本格的にUnityを学びたい方は、Unity入門の森で実践的なスキルを身につけましょう。
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント