バトル機能を作成中です。
イメージはドラクエとかのコマンドバトルで、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を何とかした方がいいかもなー。勝つか負けるかするまで無限ループでターンを回そうとしたんですが、中身まともに作ってないので再生ボタンを押したら完全フリーズしてしまったので。
あと今の作りだと、スキルを選んでからやっぱり攻撃にしようとか、そういう戻り方ができないっぽい。