さくらの作業ログ

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

全然中途半端だけどいつまでもキリが良くなりそうにないので記事を書いておきたい

バトル機能を作成中です。

ドラクエ風コマンドバトルです
動作イメージ
イメージはドラクエとかのコマンドバトルで、UIのデザインは未定です。

    private async UniTask<List<Action>> PlayerAction()
    {
        List<Action> actions = new List<Action>();

        for(int i = 0; i < allies.Length; i++){
            var who = allies[i];
            actions.Add(await SelectAction(cancellationToken));
        }

        return actions;
    }
    private async UniTask<Action> SelectAction(CancellationToken cancellationToken){
        selectActionPanel.enabled = true;
        SelectActionPanel selectActionPanelComponent = selectActionPanel.GetComponent<SelectActionPanel>();
        int actionGroup =  await selectActionPanelComponent.AwaitAnyButtonClikedAsync(cancellationToken);
        Action action = new Action();
        switch(actionGroup){
            case 0:
                action = await SelectAttackTarget(cancellationToken);
                // var target = await SelectAttackTarget(cancellationToken);
                // return calculateAttackEffect();
                break;
            case 1:
                action = await SelectSkill(cancellationToken);
                // var target = await SelectSkillTarget(cancellationToken);
                // return calculateSkillEffect();
                break;
            case 2:
                var act = await SelectItem(cancellationToken);
                // var target = await SelectItemTarget(cancellationToken);
                // return calculateItemEffect();
                break;
            case 3:
                var target = await SelectDefenceTarget(cancellationToken);
                // return calculateDefenceEffect();
                break;
        }
        selectActionPanel.enabled = false;
        return action;
    }
    private async UniTask<Action> SelectSkill(CancellationToken cancellationToken)
    {
        skillPanel.enabled = true;
        SkillPanel skillPanelComponent = skillPanel.GetComponent<SkillPanel>();
        skillPanelComponent.allySelectPanel = selectTargetAllyPanel;
        SelectTargetAllyPanel selectTargetAllyPanelComponent = selectTargetAllyPanel.GetComponent<SelectTargetAllyPanel>();
        selectTargetAllyPanelComponent.setAllies(allies);
        
        skillPanelComponent.enemySelectPanel = selectTargetEnemyPanel;
        SelectTargetEnemyPanel selectTargetEnemyPanelComponent = selectTargetEnemyPanel.GetComponent<SelectTargetEnemyPanel>();
        selectTargetEnemyPanelComponent.setEnemies(enemies);
        Action act = await skillPanelComponent.AwaitAnyButtonClikedAsync(cancellationToken);
        skillPanel.enabled = false;
        return act;
    }

まず「攻撃、スキル、アイテム、防御」の四択のパネルが出る
→選択したものに合わせた次のパネルが出る(攻撃を選んだらターゲット選択、スキルを選んだらスキル選択)
→決定したらすべてのパネルを一括で閉じる

という形状にしたいので、await処理の入れ子にしています。スキルはスキルを選択してから更に対象を選択(攻撃スキルなら敵、回復スキルなら見方から対象を選択する)があるのでややこしい

今のところとりあえず表示ができればいいや~で書いてるんですが、この書き方だとターンごとにプレハブ生成しちゃってて非効率なのでそこは修正。敵味方は減る可能性があるので更新の必要があるけど、スキル自体は増えないし減らないので一旦更新なし?MPが尽きたときにどうするか未定。

そのあたりの表示の更新は敵味方の攻撃でHPとMPを減らしたり敵味方自体を減らしたりする処理が必要なので、次は残HPとMPの計算かしら。
その前にCancellationTokenを何とかした方がいいかもなー。勝つか負けるかするまで無限ループでターンを回そうとしたんですが、中身まともに作ってないので再生ボタンを押したら完全フリーズしてしまったので。
あと今の作りだと、スキルを選んでからやっぱり攻撃にしようとか、そういう戻り方ができないっぽい。