さくらの作業ログ

今度は三日坊主にしないといいな

行動選択パネルをひとつひとつキャンセルしたい

イメージ図

前回の状態がこう

あと今の作りだと、スキルを選んでからやっぱり攻撃にしようとか、そういう戻り方ができないっぽい。

だったところから、とりあえず戻れるようにはしました。しかし、「スキルを選んでから→やっぱり攻撃にしよう」の戻り方はできましたが、「スキルを選んで→使うスキルも選んでから→やっぱり攻撃にしよう」になるとうまくいきません。

    public async UniTask<Action> AwaitAnyButtonClickOrCancelAsync(CancellationToken cancellationToken)
    {
        m_cancellationTokenSource = new CancellationTokenSource();
        playerCancellationToken = m_cancellationTokenSource.Token;

        CancellationTokenSource linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource (cancellationToken, playerCancellationToken);

        var (index, result1) = await UniTask.WhenAny(AwaitAnyButtonClickedAsync(linkedTokenSource.Token), waitKeyDown());

        Debug.Log($"index: {index}");
        Debug.Log($"result1: {result1}");

        return new Action();
    }

引数として渡ってくる cancellationToken はゲームマネージャの this.GetCancellationTokenOnDestroy() の値です。これにプレイヤー入力監視用の playerCancellationToken をくっつけて次に渡しています。

理想形

現在の状態

CancellationTokenを使いまわしているのでそれはそうなんですが、これどうしたらいいのかわかりません。

このキャンセル処理がこうなんですが

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Debug.Log(GetType().Name);
            m_cancellationTokenSource?.Cancel();
            m_cancellationTokenSource = null;
        }
    }

これがスキルを選択するパネルと効果対象を選択するパネルはともかくほかのパネルも全部反応する。disabledになっているものまで全部反応する。なんでや!!!!!!!!
disableになってるものが反応するのはさすがに納得いかない。disableにしただけで非表示になるのも納得できないのに(# ゚Д゚)

全部のパネルでこの Input.GetKeyDown(KeyCode.Escape) が発火してしまうので全部キャンセルされてしまっている様子。

cancellationTokenSourceを破棄してみたり作り直してみたりもしたんですが、挙動変わらず。これでも操作できるといえばできるけど、UIの挙動としてはいまいち。やっぱり一個ずつキャンセルしたい。

現在の状態は以下 github.com