ふりかえり
前回はスキル解放機能を実装し、成長に応じてスキルを使えるようにしました。
今回はその一歩先、スキル強化機能を実装していきます!
前回の投稿はこちら↓
スキル強化を実装!
敵がどんどん強くなる中、最初のスキルでは物足りない…
そんな時に役立つのがスキル強化です!
- スキルを最大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で「最大レベル」と表示
- ボタンの活性・非活性も自動管理!
動作確認
強撃スキルを解放 → 強化 と問題なく実行できました!
表示もリアルタイムに切り替わり、強化レベルがしっかり反映されます!



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



