

はじめまして。  
先月からUnityを勉強し始め、一通り終わったためにRPGの戦闘シーンを作ろうと試みているところです。

以下、質問内容になります。

＜ゲームの仕様（質問における前提条件）＞  
・味方キャラクターは3人（A、B、C)、敵キャラクターは1人(D)。  
・攻撃の順番はA→B→C→D

【質問内容】

今回、if文、switch文、for文を用いて以下のプログラムを作りました。

[code]

    void Update(){
     for(n=1;n<5;n++){
      switch(n){
       case 1:
        if(Input.GetKeyDown(KeyCode.P)){
         Debug.Log("A attack");
         break;
        }
       case 2:
        if(Input.GetKeyDown(KeyCode.P)){
         Debug.Log("B attack");
         break;
        }
       case 3:
        if(Input.GetKeyDown(KeyCode.P)){
         Debug.Log("C attack");
         break;
        }
       case 4:
        if(Input.GetKeyDown(KeyCode.P)){
         Debug.Log("D attack");
         break;
        }
      }
     }
    }
    
[/code]

理想としては、まずAの戦闘ターンでPボタンを押すとAが攻撃。  
その後Bの戦闘ターンでPボタンを押すとBが攻撃。CとDが後に続く・・・という流れです。

しかしながら、実際にプログラムを実行すると、Pボタンを押すと、ABCD全てのcaseが実行されてしまい、Console画面には"各キャラ
attack"が表示されてしまいました。

これを各キャラクターの処理を一つずつ実行したいのですが、どうかご教授いただけないでしょうか？

【対処法？】

この対処法をネット上で調べた結果、Console.ReadKey();やConsoleKeyInfoを用いるとのことだったのですが、試したところエラーが出てしまい行き詰まってしまいました。  
（エラー内容は"All compiler errors have to be fixed before you can enter playmode!）

以上、宜しくお願い致します。


CC BY-SA 4.0
2019-01-06T16:17:12.890
51763
2022-05-03T14:08:50.783
2019-01-06T23:15:30.903
19110
31693
question
c# unity3d unity2d
RPGゲームの戦闘シーンにおいて、ターン制の攻撃を実現したいです。


とりあえず質問に記載されているスクリプトの動きについて説明します。  
`Update()`は毎フレーム呼ばれる関数なので、この関数の中に書いた処理は毎フレーム実行されることになります。  
質問者さんのスクリプトでは、`Update()`の中で`for`文を呼んでいるので、`switch(n)
~`の全ての`case`は毎フレームで全て実行されることになります。  
`Input.GetKeyDown()`はキーが押された瞬間の１フレームの間ずっと`true`なので、  
このスクリプトではA~Dの全てのケースが実行されてしまうわけです。

また、対処法についてですがUnityではConsole.ReadKey()という関数は用いません。  
エラーが出ているのは存在しない関数(正確にはConsoleが存在しない)を呼び出そうとしているからでしょう。

質問者さんが実現したいターン制のシステムには現在の形だと難しいかと思います。  
「Unity ターン制バトル」などで検索していただくと、わかりやすい記事がいくつか見つかると思うので是非検討してみてください。


CC BY-SA 4.0
2019-01-08T03:58:07.350
51815
2019-01-08T03:58:07.350
31396
51763
answer


メンバ変数で現在のアタックステータス(誰が攻撃しているのか)を保持して、pボタンを押すごとにステータスを変化させてみたらどうでしょうか？

例えば、下記のようなコードでどうでしょうか。

[code]

    private int n = 1;
    
    void Update(){
      if(Input.GetKeyDown(KeyCode.P)){
        switch(n){
          case 1:
            Debug.Log("A attack");
            break;
          case 2:
            Debug.Log("B attack");
            break;
          case 3:
            Debug.Log("C attack");
            break;
          case 4:
            Debug.Log("D attack");
            break;
        }
        n++;
      }
    }
    
[/code]


CC BY-SA 4.0
2019-01-10T10:09:50.810
51863
2019-01-10T10:09:50.810
29533
51763
answer