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

1日1歩開発日記

ふりかえり

前回はゴールドを使ってステータスを強化できるようにし、育成の楽しみが生まれました!

スキルを実装!

今回は、戦略性を深める「スキル機能」を実装していきます!

実装内容

スキルを使うことで、通常攻撃とは違った強力な行動が可能になります。

今回は「強撃(攻撃力×1.5)」というスキルを実装し、クールタイム付きで使用できるようにします。

スクリプトの変更:SkillManager.cs

スキルを実装するために新たにSkillManager.csを作成しました。

  • スキル発動時、一定ターン使用不可になる「クールタイム」機能を管理
  • スキルボタンの状態(押せる/押せない)や、クールタイム中のオーバーレイ表示を制御
  • スキルのダメージは 攻撃力 × 1.5 として計算
using UnityEngine;
using UnityEngine.UI;
using System;

public class SkillManager : MonoBehaviour
{
    public int skillCooldown = 5; // クールタイム(ターン数)
    private int currentCooldown = 0; // 現在のクールタイム残り

    // クールタイム表示用のUI要素(Inspectorで設定可能)
    [SerializeField] private Button skillButton;
    [SerializeField] private Image skillButtonImage;
    [SerializeField] private Image cooldownOverlay; // クールタイム表示用のオーバーレイ

    // クールタイム更新イベント
    public event Action<float> OnCooldownChanged;

    void Start()
    {
        // 初期化時にクールタイム表示を更新
        UpdateCooldownDisplay();
    }

    // UI参照を設定するメソッド(PlayerUIManagerから呼ばれる)
    public void SetUIReferences(Button button, Image buttonImage, Image overlay)
    {
        // 既にInspectorで設定されている場合は上書きしない
        if (skillButton == null) skillButton = button;
        if (skillButtonImage == null) skillButtonImage = buttonImage;
        if (cooldownOverlay == null) cooldownOverlay = overlay;
        
        // 設定後にクールタイム表示を更新
        UpdateCooldownDisplay();
    }

    // スキルが使用可能かどうか
    public bool CanUseSkill()
    {
        return currentCooldown <= 0;
    }

    // スキルを使用したときに呼ぶ
    public void UseSkill()
    {
        currentCooldown = skillCooldown;
        UpdateCooldownDisplay();
    }

    // ターン終了時に呼ぶ(1ターン経過)
    public void OnTurnEnd()
    {
        if (currentCooldown > 0)
        {
            currentCooldown--;
            UpdateCooldownDisplay();
        }
    }

    // 残りクールタイムを取得
    public int GetCurrentCooldown()
    {
        return currentCooldown;
    }

    // 強撃スキルのダメージ計算
    public int CalculateSkillDamage(int playerAttack)
    {
        return Mathf.CeilToInt(playerAttack * 1.5f);
    }

    // クールタイム表示の更新
    private void UpdateCooldownDisplay()
    {
        float cooldownProgress = 0f;
        
        if (skillCooldown > 0)
        {
            cooldownProgress = (float)currentCooldown / skillCooldown;
        }

        // ボタンの有効/無効を設定
        if (skillButton != null)
        {
            skillButton.interactable = currentCooldown <= 0;
        }

        // オーバーレイの表示を更新
        if (cooldownOverlay != null)
        {
            cooldownOverlay.fillAmount = cooldownProgress;
            cooldownOverlay.gameObject.SetActive(currentCooldown > 0);
        }

        // イベントを発火
        OnCooldownChanged?.Invoke(cooldownProgress);
    }
} 

PlayerUIManager.cs

PlayerUIManager.csでスキルのクールタイムを可視化するためのオーバーレイの設定をします。

// スキルクールタイム表示の初期設定
    private void SetupSkillCooldownDisplay()
    {
        if (skillCooldownOverlay != null)
        {
            // オーバーレイの初期設定
            skillCooldownOverlay.type = Image.Type.Filled;
            skillCooldownOverlay.fillMethod = Image.FillMethod.Vertical;
            skillCooldownOverlay.fillOrigin = (int)Image.OriginVertical.Top;
            skillCooldownOverlay.color = new Color(0, 0, 0, 0.7f); // 半透明の黒
            skillCooldownOverlay.fillAmount = 0f;
            skillCooldownOverlay.gameObject.SetActive(false);
        }
    }

    // スキルクールタイム変更時の処理
    private void OnSkillCooldownChanged(float cooldownProgress)
    {
        if (skillCooldownOverlay != null)
        {
            // アニメーション付きでクールタイム表示を更新
            skillCooldownOverlay.DOFillAmount(cooldownProgress, 0.2f)
                .SetEase(Ease.OutQuad);
        }
    }

Unityでの設定

スキルボタンを作成  Canvas内にスキル用のButtonを作成し、子オブジェクトとしてクールタイム表示用のImageを追加。

オーバーレイのSourceImageに適当な画像を設定し、Inspectorで以下の設定を行います。

  • Image Type: Filledに変更
  • Fill Method: Verticalに変更
  • Fill Origin: Topに変更
  • Fill Amount: 1に設定
  • Color: アルファ値を0.7に設定

新規GameObjectを作成し、SkillManager.csをドラッグ&ドロップします。そしてInspector上でButtonなどをアタッチします。

動作確認

斧のアイコンがスキルです。

スキルをクリックするとゴブリンに敵に大ダメージ!

その後、オーバーレイが現れ、クールタイム中であることが視覚的に分かります!

まとめ

今回は「スキル機能」を実装しました!

戦闘に戦略性が加わり、強敵相手にも手応えのあるバトルが楽しめるようになりました!

次回予告

次回はスキルの種類を増やしたいと思います!

お楽しみに!

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