ふりかえり
前回はセーブ機能を実装し、ゲームの進行状態を保存・復元できるようにしました!
これで安心してプレイを続けられますね!
転生機能を実装!
今回は、いよいよ「転生」機能を実装します!
敵が強くなって先に進めなくなっても、転生して再挑戦できるようになります。
転生により以下のような変化が起こります。
転生するとリセットされる内容
- プレイヤーのレベル
- ステージ進行度
- 所持ゴールド
- ゴールド強化状態
- スキルの開放・強化状態
転生で得られるもの
- 「マナ」(現在のステージ数に応じて獲得)
- マナを使って 恒久的な強化(転生強化) が可能!
スクリプトの変更
PrestigeManager.cs
転生処理の中心は PrestigeManager.cs にまとめました。
プレイヤーやステージ、スキルの情報をリセットしつつ、転生ステータスは維持され、次回プレイに活かされます。
HP強化・攻撃力強化・防御力強化・会心率・会心ダメージなど、成長の方向性はプレイヤー次第!
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System.Collections.Generic;
public class PrestigeManager : MonoBehaviour
{
[Header("UI References")]
public GameObject prestigePanel; // 転生パネル
public Button prestigeToggleButton; // 転生パネル開閉ボタン
public TextMeshProUGUI prestigeToggleButtonText; // ボタンテキスト
[Header("転生パネル内のUI")]
public TextMeshProUGUI currentManaText; // 現在のマナ表示
public TextMeshProUGUI prestigeRewardText; // 転生報酬表示
public Button prestigeButton; // 転生実行ボタン
public TextMeshProUGUI prestigeButtonText; // 転生ボタンテキスト
[Header("マナ強化UI")]
public Transform manaUpgradeContent; // マナ強化アイテムの親オブジェクト
public GameObject manaUpgradeItemPrefab; // マナ強化アイテムのプレハブ
[Header("Manager References")]
public PlayerManager playerManager;
public StageManager stageManager;
public SkillManager skillManager;
public PowerUpManager powerUpManager;
public ArtifactManager artifactManager;
public SaveManager saveManager;
public EnemyManager enemyManager; // EnemyManagerの参照を追加
[Header("転生設定")]
public int manaPerStage = 1; // 1ステージあたりのマナ獲得量
private bool isPrestigePanelOpen = false;
private int currentMana = 0; // 現在のマナ
private List<ManaUpgradeItem> manaUpgradeItems = new List<ManaUpgradeItem>();
// マナ強化アイテムのデータ
[System.Serializable]
public class ManaUpgradeData
{
public string upgradeName;
public string description;
public int baseCost;
public float costMultiplier;
public int currentLevel;
public int maxLevel;
public StatType statType;
public float valuePerLevel;
}
public enum StatType
{
HP,
Attack,
Defense,
CriticalRate,
CriticalDamage
}
private List<ManaUpgradeData> upgradeDataList = new List<ManaUpgradeData>();
void Start()
{
InitializePrestigeSystem();
UpdatePrestigeUI();
}
// 転生システムの初期化
private void InitializePrestigeSystem()
{
// 転生パネルを初期状態で閉じる
if (prestigePanel != null)
{
prestigePanel.SetActive(false);
}
// ボタンのリスナーを設定
if (prestigeToggleButton != null)
{
prestigeToggleButton.onClick.AddListener(TogglePrestigePanel);
}
if (prestigeButton != null)
{
prestigeButton.onClick.AddListener(ExecutePrestige);
}
// マナ強化データを初期化
InitializeManaUpgradeData();
// マナ強化UIを生成
CreateManaUpgradeItems();
}
// マナ強化データの初期化
private void InitializeManaUpgradeData()
{
upgradeDataList.Clear();
// HP強化
upgradeDataList.Add(new ManaUpgradeData
{
upgradeName = "HP強化",
description = "転生時の基礎HPを増加させる",
baseCost = 1,
costMultiplier = 1.2f,
currentLevel = 0,
maxLevel = 100,
statType = StatType.HP,
valuePerLevel = 10
});
// 攻撃力強化
upgradeDataList.Add(new ManaUpgradeData
{
upgradeName = "攻撃力強化",
description = "転生時の基礎攻撃力を増加させる",
baseCost = 1,
costMultiplier = 1.3f,
currentLevel = 0,
maxLevel = 100,
statType = StatType.Attack,
valuePerLevel = 2
});
// 防御力強化
upgradeDataList.Add(new ManaUpgradeData
{
upgradeName = "防御力強化",
description = "転生時の基礎防御力を増加させる",
baseCost = 1,
costMultiplier = 1.25f,
currentLevel = 0,
maxLevel = 100,
statType = StatType.Defense,
valuePerLevel = 1
});
// 会心率強化
upgradeDataList.Add(new ManaUpgradeData
{
upgradeName = "会心率強化",
description = "転生時の基礎会心率を増加させる",
baseCost = 2,
costMultiplier = 1.4f,
currentLevel = 0,
maxLevel = 50,
statType = StatType.CriticalRate,
valuePerLevel = 0.01f
});
// 会心ダメージ強化
upgradeDataList.Add(new ManaUpgradeData
{
upgradeName = "会心ダメージ強化",
description = "転生時の基礎会心ダメージ倍率を増加させる",
baseCost = 3,
costMultiplier = 1.5f,
currentLevel = 0,
maxLevel = 30,
statType = StatType.CriticalDamage,
valuePerLevel = 0.1f
});
}
// マナ強化アイテムUIを生成
private void CreateManaUpgradeItems()
{
if (manaUpgradeContent == null || manaUpgradeItemPrefab == null) return;
// 既存のアイテムをクリア
foreach (Transform child in manaUpgradeContent)
{
Destroy(child.gameObject);
}
manaUpgradeItems.Clear();
// 新しいアイテムを生成
for (int i = 0; i < upgradeDataList.Count; i++)
{
GameObject itemObj = Instantiate(manaUpgradeItemPrefab, manaUpgradeContent);
ManaUpgradeItem item = itemObj.GetComponent<ManaUpgradeItem>();
if (item != null)
{
item.Initialize(upgradeDataList[i], this);
manaUpgradeItems.Add(item);
}
}
}
// 転生パネルの開閉
public void TogglePrestigePanel()
{
isPrestigePanelOpen = !isPrestigePanelOpen;
if (prestigePanel != null)
{
prestigePanel.SetActive(isPrestigePanelOpen);
}
if (prestigeToggleButtonText != null)
{
prestigeToggleButtonText.text = isPrestigePanelOpen ? "転生パネルを閉じる" : "転生パネルを開く";
}
if (isPrestigePanelOpen)
{
UpdatePrestigeUI();
}
}
// 転生UIの更新
private void UpdatePrestigeUI()
{
if (currentManaText != null)
{
currentManaText.text = $"現在のマナ: {currentMana}";
}
if (prestigeRewardText != null && stageManager != null)
{
int currentStage = stageManager.GetCurrentStage();
int manaReward = currentStage * manaPerStage;
prestigeRewardText.text = $"転生報酬: {manaReward}マナ (ステージ{currentStage})";
}
// マナ強化アイテムの更新
foreach (var item in manaUpgradeItems)
{
item.UpdateDisplay();
}
}
// 転生を実行
public void ExecutePrestige()
{
if (stageManager == null || playerManager == null) return;
int currentStage = stageManager.GetCurrentStage();
int manaReward = currentStage * manaPerStage;
// マナを獲得
currentMana += manaReward;
// 転生による初期化
ResetForPrestige();
// 転生ステータスを適用
ApplyPrestigeStats();
// セーブデータを更新
if (saveManager != null)
{
saveManager.SaveGameData();
}
// UIを更新
UpdatePrestigeUI();
// 転生パネルを閉じる
TogglePrestigePanel();
Debug.Log($"転生完了!{manaReward}マナを獲得しました。");
}
// 転生による初期化
private void ResetForPrestige()
{
// ステージ進行度をリセット
if (stageManager != null)
{
stageManager.SetStageProgress(1, 0);
}
// 敵をリセット(新しい敵を生成)
if (enemyManager != null)
{
enemyManager.SetupNewEnemyForStage(1);
}
// プレイヤーのレベルをリセット
if (playerManager != null && playerManager.player != null)
{
playerManager.player.level = 1;
playerManager.player.exp = 0;
playerManager.player.expToNextLevel = 10;
playerManager.player.currentHP = playerManager.player.maxHP;
}
// スキルをリセット
if (skillManager != null)
{
foreach (var skill in skillManager.skills)
{
skill.skillLevel = 0;
skill.isUnlocked = false;
skill.currentCooldown = 0;
}
}
// G強化をリセット
if (playerManager != null && playerManager.player != null)
{
playerManager.player.gPowerUpHP = 0;
playerManager.player.gPowerUpAttack = 0;
playerManager.player.gPowerUpDefense = 0;
playerManager.player.gPowerUpCriticalRate = 0f;
playerManager.player.gPowerUpCriticalDamage = 0f;
}
// 転生ステータスをリセット
if (playerManager != null && playerManager.player != null)
{
playerManager.player.prestigePowerUpHP = 0;
playerManager.player.prestigePowerUpAttack = 0;
playerManager.player.prestigePowerUpDefense = 0;
playerManager.player.prestigePowerUpCriticalRate = 0f;
playerManager.player.prestigePowerUpCriticalDamage = 0f;
}
// Gをリセット(ダイヤは保持)
if (playerManager != null && playerManager.player != null)
{
playerManager.player.gold = 0;
}
// アーティファクトは保持(転生ステータスとして)
// アーティファクトの効果は引き続き適用される
}
// 転生ステータスを適用
private void ApplyPrestigeStats()
{
if (playerManager == null || playerManager.player == null) return;
// 転生ステータスを計算
int prestigeHP = 0;
int prestigeAttack = 0;
int prestigeDefense = 0;
float prestigeCriticalRate = 0f;
float prestigeCriticalDamage = 0f;
foreach (var upgradeData in upgradeDataList)
{
switch (upgradeData.statType)
{
case StatType.HP:
prestigeHP += (int)(upgradeData.currentLevel * upgradeData.valuePerLevel);
break;
case StatType.Attack:
prestigeAttack += (int)(upgradeData.currentLevel * upgradeData.valuePerLevel);
break;
case StatType.Defense:
prestigeDefense += (int)(upgradeData.currentLevel * upgradeData.valuePerLevel);
break;
case StatType.CriticalRate:
prestigeCriticalRate += upgradeData.currentLevel * upgradeData.valuePerLevel;
break;
case StatType.CriticalDamage:
prestigeCriticalDamage += upgradeData.currentLevel * upgradeData.valuePerLevel;
break;
}
}
// 基礎ステータスを初期値に戻す
playerManager.player.baseMaxHP = 100;
playerManager.player.baseAttack = 10;
playerManager.player.baseDefense = 0;
playerManager.player.baseCriticalRate = 0.1f;
playerManager.player.baseCriticalDamageMultiplier = 2.0f;
// 転生ステータスをPlayerDataに適用
playerManager.player.prestigePowerUpHP = prestigeHP;
playerManager.player.prestigePowerUpAttack = prestigeAttack;
playerManager.player.prestigePowerUpDefense = prestigeDefense;
playerManager.player.prestigePowerUpCriticalRate = prestigeCriticalRate;
playerManager.player.prestigePowerUpCriticalDamage = prestigeCriticalDamage;
// 現在HPを最大値に設定
playerManager.player.currentHP = playerManager.player.maxHP;
}
// マナ強化を実行
public bool TryUpgradeWithMana(ManaUpgradeData upgradeData)
{
int cost = CalculateUpgradeCost(upgradeData);
if (currentMana >= cost && upgradeData.currentLevel < upgradeData.maxLevel)
{
currentMana -= cost;
upgradeData.currentLevel++;
// 転生ステータスを再適用
ApplyPrestigeStats();
// UIを更新
UpdatePrestigeUI();
// セーブデータを更新
if (saveManager != null)
{
saveManager.SaveGameData();
}
Debug.Log($"{upgradeData.upgradeName}をレベル{upgradeData.currentLevel}に強化しました。");
return true;
}
return false;
}
// 強化コストを計算
private int CalculateUpgradeCost(ManaUpgradeData upgradeData)
{
return Mathf.RoundToInt(upgradeData.baseCost * Mathf.Pow(upgradeData.costMultiplier, upgradeData.currentLevel));
}
// 現在のマナを取得
public int GetCurrentMana()
{
return currentMana;
}
// マナを設定(セーブデータロード用)
public void SetCurrentMana(int mana)
{
currentMana = mana;
UpdatePrestigeUI();
}
// マナ強化データを取得
public List<ManaUpgradeData> GetUpgradeDataList()
{
return upgradeDataList;
}
// マナ強化データを設定(セーブデータロード用)
public void SetUpgradeDataList(List<ManaUpgradeData> dataList)
{
upgradeDataList = dataList;
CreateManaUpgradeItems();
}
}
ManaUpgradeItem.cs
ManaUpgradeItem.cs では、マナを使った強化のUI処理を実装。
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class ManaUpgradeItem : MonoBehaviour
{
[Header("UI References")]
public TextMeshProUGUI upgradeNameText;
public TextMeshProUGUI descriptionText;
public TextMeshProUGUI levelText;
public TextMeshProUGUI costText;
public Button upgradeButton;
public TextMeshProUGUI upgradeButtonText;
private PrestigeManager.ManaUpgradeData upgradeData;
private PrestigeManager prestigeManager;
public void Initialize(PrestigeManager.ManaUpgradeData data, PrestigeManager manager)
{
upgradeData = data;
prestigeManager = manager;
UpdateDisplay();
// ボタンのリスナーを設定
if (upgradeButton != null)
{
upgradeButton.onClick.AddListener(OnUpgradeButtonClicked);
}
}
public void UpdateDisplay()
{
if (upgradeData == null) return;
// 名前と説明を設定
if (upgradeNameText != null)
{
upgradeNameText.text = upgradeData.upgradeName;
}
if (descriptionText != null)
{
descriptionText.text = upgradeData.description;
}
// レベルを表示
if (levelText != null)
{
levelText.text = $"レベル: {upgradeData.currentLevel}/{upgradeData.maxLevel}";
}
// コストを計算して表示
int cost = CalculateUpgradeCost();
if (costText != null)
{
costText.text = $"コスト: {cost}マナ";
}
// ボタンの状態を更新
UpdateButtonState(cost);
}
private int CalculateUpgradeCost()
{
return Mathf.RoundToInt(upgradeData.baseCost * Mathf.Pow(upgradeData.costMultiplier, upgradeData.currentLevel));
}
private void UpdateButtonState(int cost)
{
if (upgradeButton == null || upgradeButtonText == null) return;
bool canUpgrade = prestigeManager.GetCurrentMana() >= cost && upgradeData.currentLevel < upgradeData.maxLevel;
upgradeButton.interactable = canUpgrade;
if (upgradeData.currentLevel >= upgradeData.maxLevel)
{
upgradeButtonText.text = "最大レベル";
}
else if (canUpgrade)
{
upgradeButtonText.text = "強化";
}
else
{
upgradeButtonText.text = "マナ不足";
}
}
private void OnUpgradeButtonClicked()
{
if (prestigeManager != null)
{
bool success = prestigeManager.TryUpgradeWithMana(upgradeData);
if (success)
{
UpdateDisplay();
}
}
}
}
Unityでの設定
1. PrestigeManagerの設定
1-1. PrestigeManagerスクリプトをGameObjectにアタッチ
1-2. PrestigeManagerの参照設定
InspectorのPrestigeManagerコンポーネントで以下を設定:
Manager References
- Player Manager: 既存のPlayerManagerオブジェクトをドラッグ&ドロップ
- Stage Manager: 既存のStageManagerオブジェクトをドラッグ&ドロップ
- Skill Manager: 既存のSkillManagerオブジェクトをドラッグ&ドロップ
- Power Up Manager: 既存のPowerUpManagerオブジェクトをドラッグ&ドロップ
- Artifact Manager: 既存のArtifactManagerオブジェクトをドラッグ&ドロップ
- Save Manager: 既存のSaveManagerオブジェクトをドラッグ&ドロップ
転生設定
- Mana Per Stage: 1(デフォルト値)

2. 転生パネルのUI作成
2-1. ScrollViewの設定
- ManaUpgradeScrollViewを選択
- Scroll Rectの設定:
- Content: Viewport/Contentをドラッグ&ドロップ
- Horizontal: チェックを外す
- Vertical: チェック済み
- Movement Type: Elastic
- Elasticity: 0.1
2-2. Viewportの設定
- Viewportを選択
- Rect Transformの設定:
- Anchor: Stretch-Stretch
- Left, Right, Top, Bottom: 0
- Maskコンポーネントの設定:
- Show Mask Graphic: チェックを外す
2-3. Contentの設定
- Contentを選択
- Rect Transformの設定:
- Content Size Fitterを追加:
- Vertical Fit: Preferred Size
- Vertical Layout Groupを追加:
- Padding: Top=10, Bottom=10
- Spacing: 10
- Child Force Expand Width: チェック済み
- Child Force Expand Height: チェックを外す
3. ManaUpgradeItemPrefabの作成
3-1. プレハブの基本構造
- Hierarchyで右クリック → UI → Panel
- 名前を「ManaUpgradeItemPrefab」に変更
3-2. プレハブ内のUI要素を作成
3-3. ManaUpgradeItemスクリプトのアタッチ
- ManaUpgradeItemPrefabを選択
- Add Component → Scripts → ManaUpgradeItemを選択
3-4. ManaUpgradeItemの参照設定
InspectorのManaUpgradeItemコンポーネントで以下を設定:
- Upgrade Name Text: UpgradeNameTextをドラッグ&ドロップ
- Description Text: DescriptionTextをドラッグ&ドロップ
- Level Text: LevelTextをドラッグ&ドロップ
- Cost Text: CostTextをドラッグ&ドロップ
- Upgrade Button: UpgradeButtonをドラッグ&ドロップ
- Upgrade Button Text: UpgradeButtonのTextMeshProUGUIをドラッグ&ドロップ

3-5. プレハブの作成
- ManaUpgradeItemPrefabをProjectウィンドウのPrefabsフォルダにドラッグ&ドロップ
- HierarchyのManaUpgradeItemPrefabを削除
4. SaveManagerの設定
4-1. PrestigeManagerの参照追加
- SaveManagerオブジェクトを選択
- InspectorのSaveManagerコンポーネントでPrestige ManagerにPrestigeManagerをドラッグ&ドロップ
5. SettingsManagerの設定
5-1. PrestigeManagerの参照追加
- SettingsManagerオブジェクトを選択
- InspectorのSettingsManagerコンポーネントでPrestige ManagerにPrestigeManagerをドラッグ&ドロップ
5-2. 転生ステータス表示用UIの作成
SettingsManagerのパネル内に転生ステータス表示用のTextMeshProUGUI要素を追加:
5-3. SettingsManagerの参照設定
InspectorのSettingsManagerコンポーネントで以下を設定:
転生ステータス
- Prestige HP Text: PrestigeHPTextをドラッグ&ドロップ
- Prestige Attack Text: PrestigeAttackTextをドラッグ&ドロップ
- Prestige Defense Text: PrestigeDefenseTextをドラッグ&ドロップ
- Prestige Critical Rate Text: PrestigeCriticalRateTextをドラッグ&ドロップ
- Prestige Critical Damage Text: PrestigeCriticalDamageTextをドラッグ&ドロップ
動作確認
Playボタンを押してゲームを開始します。
転生パネル開閉ボタンをクリックしてパネルが開くことを確認
転生パネル内のマナ強化アイテムが表示されることを確認
現在ステージ4なので転生したらマナを4獲得できます!

転生後、ステージが1に戻り、レベルやGがリセットされています!

G強化やスキルの解放などもリセットされています。

転生を実行してマナを4獲得しました!

そのマナを使用し、強化もできました!

まとめ
今回はゲームにとって重要な「転生(Prestige)」システムを実装しました!
これにより、進行が詰まっても「マナ強化」によって確実に成長できます。
どんどん転生して、限界を突破していきましょう!
次回予告
次回からは、ゲームバランスやUIの調整などを行っていよいよ完成形に近づけていきます!
お楽しみに!

