30歩目 スキル強化を実装! Unityで1日1ステップ!ノンフィールドRPG開発日記

1日1歩開発日記

ふりかえり

前回はスキル解放機能を実装し、成長に応じてスキルを使えるようにしました。

今回はその一歩先、スキル強化機能を実装していきます!

スキル強化を実装!

敵がどんどん強くなる中、最初のスキルでは物足りない…

そんな時に役立つのがスキル強化です!

  • スキルを最大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で「最大レベル」と表示
  • ボタンの活性・非活性も自動管理!

動作確認

強撃スキルを解放 → 強化 と問題なく実行できました!

表示もリアルタイムに切り替わり、強化レベルがしっかり反映されます!

まとめ

今回はスキル強化機能を実装しました!

  • 解放されたスキルがどんどん成長
  • プレイヤーの育成感がさらにアップ
  • 強敵にもスキルで立ち向かえる!

バトルがもっと楽しくなる機能です!

次回予告

次回はステージごとに出現モンスターを変化させて、

バトルの多様性と奥深さをプラスしていきます!

どうぞお楽しみに!

タイトルとURLをコピーしました