pink100
@pink100

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Unityでボタンクリック時の処理の作り方

解決したいこと

初めてプログラミングについて質問するので至らぬ点があったらすみません。

Unityで2Dカードゲームを作成しようとしています。
ターン終了ボタンがクリックされた時の動きを作ろうとしているのですが、
AddListnerでのメソッドの登録が上手くいかず困っています。

ソースコードの★マークの箇所を
「 teb.onClick.AddListner(() => Debug.log("クリックされました")) 」としたときは、ボタンクリック時に
メッセージが表示されたのでクリック自体は出来るはずなのですが、なぜメソッドをリスナーに登録しようとするとうまくいかないのでしょうか?

原因や解決策が分かる方いらっしゃいましたら教えていただきたいです。
よろしくお願いいたします。

実際のソースコード

① ターン終了時処理を書きこむクラス(ゲームオブジェクトにはアタッチされない)

using UnityEngine;
using UnityEngine.UI;

/// <summary>カード選択ステート</summary>
public class BattleCardSelectState : BattleStateBase //MonoBehaviourを継承した親クラス
{
    //ターン終了ボタン
    private Button teb;

    /// <summary>
    /// コンストラクタ
    /// </summary>
    /// <param name="battleSystem">ステートの管理を行うクラス</param>
    public BattleCardSelectState(BattleSystem battleSystem) : base(battleSystem)
    {
    }

    public override void OnEnter()
    {
        Debug.Log("カード選択フェーズ開始");
        this.teb = Owner.turnEndButton;

        // ボタンを有効に設定(念のため)
        teb.interactable = true;

        // 多重登録を防ぐ(念のため)
        teb.onClick.RemoveAllListeners(); 
        
        //ボタンのクリック時処理を登録する
        teb.onClick.AddListener(OnClicked); ・・・★
    }

    // このステートから出る時の処理
    public override void OnExit()
    {
        Debug.Log("カード選択終了中");
        //teb.interactable = false;
    }

    // ボタンクリック時にしたい処理
    public void OnClicked()
    {
        Debug.Log("ターン終了ボタンクリック");
        //OnExit();
        //Owner.ChangeState(Owner.EnemyActionState);
    }
}

② 親クラス

using UnityEngine;

/// <summary> 戦闘状態の基底クラス</summary>
public class BattleStateBase : MonoBehaviour
{
    /// <summary>管理している対象 : 戦闘システム</summary>
    protected BattleSystem Owner;

    /// <summary>コンストラクタ</summary>
    /// <param name="owner">管理している対象</param>
    public BattleStateBase(BattleSystem owner)
    {
        Owner = owner;
    }

    /// <summary>その状態に入った時に呼ばれる</summary>
    public virtual void OnEnter(){}

    /// <summary>その状態の毎フレーム処理</summary>
    public virtual void OnUpdate(){}

    /// <summary>その状態から出る時に呼ばれる</summary>
    public virtual void OnExit(){}
}

③ 空のゲームオブジェクトにアタッチされる戦闘管理クラス

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>フェーズ(バトルの状態)の管理を行う</summary>
public class BattleSystem : MonoBehaviour
{   
    // フィールド
    /// <summary>現在のステート</summary>
    private BattleStateBase currentState;

    private BattleSetUpState setUpState;
    private BattleCardSelectState cardSelectState;
    private BattleEnemyActionState enemyActionState;

    // プロパティ
    public BattleSetUpState SetUpState { get => setUpState; }
    public BattleCardSelectState CardSelectState { get => cardSelectState; }
    public BattleEnemyActionState EnemyActionState { get => enemyActionState; }


    // ゲームオブジェクト用フィールド
    // ターン終了ボタン
    [SerializeField] public Button turnEndButton;

    // メソッド
    /// <summary>スタート時</summary>
    void Start()
    {
        //各種ステートを生成
        setUpState = new BattleSetUpState(this);
        cardSelectState = new BattleCardSelectState(this);
        enemyActionState = new BattleEnemyActionState(this);

        //戦闘準備ステートから始める
        ChangeState(setUpState);
    }

    /// <summary>
    /// 戦闘状態を切り替える
    /// </summary>
    /// <param name="newState"></param>
    public void ChangeState(BattleStateBase newState)
    {
        currentState = newState;
        currentState.OnEnter();
    }
}
0

No Answers yet.

Your answer might help someone💌