ふりかえり
前回はスキル解放機能を実装し、成長に応じてスキルを使えるようにしました。
今回はその一歩先、スキル強化機能を実装していきます!
スキル強化を実装!
敵がどんどん強くなる中、最初のスキルでは物足りない…
そんな時に役立つのがスキル強化です!
- スキルを最大Lv10まで強化
- 攻撃スキルはダメージ倍率UP
- 回復スキルは回復量UP
スキル自体の「成長」を感じられるようにして、バトルの戦略性もUP!
スクリプトの変更
SkillManagerに強化処理を実装!
- スキルごとに強化コスト、レベル上限、倍率などを管理
- 解放されていないスキルは強化できないように制限
// 指定したスキルを強化 public bool UpgradeSkill(int skillIndex, PlayerManager playerManager) { if (skillIndex < 0 || skillIndex >= skills.Count) return false; if (!skills[skillIndex].isUnlocked) return false; // 解放されていないスキルは強化不可 if (skills[skillIndex].skillLevel >= 10) return false; // レベル10まで if (playerManager.player.gold >= skills[skillIndex].upgradeCost) { playerManager.player.gold -= skills[skillIndex].upgradeCost; skills[skillIndex].skillLevel++; // スキルタイプに応じて強化 if (skills[skillIndex].skillType == SkillType.Attack) { skills[skillIndex].damageMultiplier += skills[skillIndex].damageMultiplierIncrease; } else if (skills[skillIndex].skillType == SkillType.Healing) { skills[skillIndex].healPercentage += skills[skillIndex].healPercentageIncrease; } return true; } return false; } // 指定したスキルの強化コストを取得 public int GetUpgradeCost(int skillIndex) { if (skillIndex < 0 || skillIndex >= skills.Count) return 0; if (!skills[skillIndex].isUnlocked) return 0; // 解放されていないスキルは強化不可 return skills[skillIndex].upgradeCost; } // 指定したスキルのレベルを取得 public int GetSkillLevel(int skillIndex) { if (skillIndex < 0 || skillIndex >= skills.Count) return 0; return skills[skillIndex].skillLevel; } // 指定したスキルが強化可能かどうか public bool CanUpgradeSkill(int skillIndex) { if (skillIndex < 0 || skillIndex >= skills.Count) return false; return skills[skillIndex].isUnlocked && skills[skillIndex].skillLevel < 10; }
PowerUpManagerの統合ボタンで「解放 or 強化」 を自動で判断
解放・強化の処理を統合し、UI更新やゴールド不足表示も対応!
// 強撃スキルの統合ボタン処理 public void HandleStrongAttackButton() { if (skillManager == null) return; bool isUnlocked = skillManager.IsSkillUnlocked(0); if (!isUnlocked) { // スキル解放 if (skillManager.UnlockSkill(0, playerManager)) { ShowMessage("強撃スキルを解放しました!"); } else { ShowMessage("ゴールドが足りません。"); } } else { // スキル強化 if (skillManager.UpgradeSkill(0, playerManager)) { ShowMessage("強撃スキルを強化しました!"); } else { ShowMessage("ゴールドが足りません。"); } } playerManager.playerUIManager.UpdateUI(); UpdateUI(); } // 全力攻撃スキルの統合ボタン処理 public void HandlePowerAttackButton() { if (skillManager == null) return; bool isUnlocked = skillManager.IsSkillUnlocked(1); if (!isUnlocked) { // スキル解放 if (skillManager.UnlockSkill(1, playerManager)) { ShowMessage("全力攻撃スキルを解放しました!"); } else { ShowMessage("ゴールドが足りません。"); } } else { // スキル強化 if (skillManager.UpgradeSkill(1, playerManager)) { ShowMessage("全力攻撃スキルを強化しました!"); } else { ShowMessage("ゴールドが足りません。"); } } playerManager.playerUIManager.UpdateUI(); UpdateUI(); } // ヒーリングスキルの統合ボタン処理 public void HandleHealingButton() { if (skillManager == null) return; bool isUnlocked = skillManager.IsSkillUnlocked(2); if (!isUnlocked) { // スキル解放 if (skillManager.UnlockSkill(2, playerManager)) { ShowMessage("ヒーリングスキルを解放しました!"); } else { ShowMessage("ゴールドが足りません。"); } } else { // スキル強化 if (skillManager.UpgradeSkill(2, playerManager)) { ShowMessage("ヒーリングスキルを強化しました!"); } else { ShowMessage("ゴールドが足りません。"); } } playerManager.playerUIManager.UpdateUI(); UpdateUI(); } // スキル解放・強化UIの更新 private void UpdateSkillUnlockUI() { if (skillManager == null) return; // 強撃スキルのUI更新 UpdateSkillButtonDisplay(0, strongAttackButton, strongAttackCostText, strongAttackStatusText); // 全力攻撃スキルのUI更新 UpdateSkillButtonDisplay(1, powerAttackButton, powerAttackCostText, powerAttackStatusText); // ヒーリングスキルのUI更新 UpdateSkillButtonDisplay(2, healingButton, healingCostText, healingStatusText); } // 個別スキルのボタン表示更新 private void UpdateSkillButtonDisplay(int skillIndex, Button button, TextMeshProUGUI costText, TextMeshProUGUI statusText) { if (skillManager == null) return; bool isUnlocked = skillManager.IsSkillUnlocked(skillIndex); bool canUpgrade = skillManager.CanUpgradeSkill(skillIndex); int level = skillManager.GetSkillLevel(skillIndex); var skillData = skillManager.GetSkillData(skillIndex); // ボタンの有効/無効設定 if (button != null) { if (!isUnlocked) { // 未解放状態:解放可能なら有効 button.interactable = playerManager.player.gold >= skillManager.GetUnlockCost(skillIndex); } else { // 解放済み状態:強化可能なら有効 button.interactable = canUpgrade && playerManager.player.gold >= skillManager.GetUpgradeCost(skillIndex); } } // コスト表示 if (costText != null) { if (!isUnlocked) { // 未解放状態:解放コストを表示 int unlockCost = skillManager.GetUnlockCost(skillIndex); if (skillData != null) { if (skillData.skillType == SkillType.Attack) { costText.text = $"解放コスト: {unlockCost}G (倍率: {skillData.damageMultiplier:F1}倍)"; } else if (skillData.skillType == SkillType.Healing) { costText.text = $"解放コスト: {unlockCost}G (回復量: 最大HPの{skillData.healPercentage * 100}%)"; } } else { costText.text = $"解放コスト: {unlockCost}G"; } } else { // 解放済み状態:強化コストまたは最大レベルを表示 if (canUpgrade) { int upgradeCost = skillManager.GetUpgradeCost(skillIndex); costText.text = $"強化コスト: {upgradeCost}G"; } else { costText.text = "最大レベル"; } } }
UI表示も進化!
- 解放前は「解放コスト:○○G(倍率〇倍)」など詳細表示
- 解放後は「強化コスト」表示に切り替え
- Lv10で「最大レベル」と表示
- ボタンの活性・非活性も自動管理!
動作確認
強撃スキルを解放 → 強化 と問題なく実行できました!
表示もリアルタイムに切り替わり、強化レベルがしっかり反映されます!



まとめ
今回はスキル強化機能を実装しました!
- 解放されたスキルがどんどん成長
- プレイヤーの育成感がさらにアップ
- 強敵にもスキルで立ち向かえる!
バトルがもっと楽しくなる機能です!
次回予告
次回はステージごとに出現モンスターを変化させて、
バトルの多様性と奥深さをプラスしていきます!
どうぞお楽しみに!