質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • C#

    9053questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    5514questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

switch文の繰り返し処理方法

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,552

TKM_waiwai

score 10

Unityでの制作で、switch文を使う場面があるのですがcase1を実行したらそのままcase2を実行するようにしたいです。
case2が実行されたらまたcase1に戻りそのまま交互を繰り返すをいった形にするにはどうしたら良いでしょうか。
下記のは、現段階のswitch文辺りのソースです。

かなりの初心者ですみません。

public void Move()
{
int i = 1;

switch(i)
{
case 1:
   //キャラが動くための処理
   Debug.Log("動いた");
   break;

case 2:
   Debug.Log("待機");
   break;

default:
   Debug.Log("例外エラー");
   break;
}
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

0

多分、キャラの状態遷移を作りたいということだと思うのでその方向で回答します。
Unity Stateパターンで状態管理の実装
上記URLのコード部分はひとまず読み飛ばして、下の方にある動画を見てみてください。
やりたい事がこんな感じで、コードを読んで自分でも書けそうと思ったら、
そのまま上記のURLを参考に作ってみてください。
Stateパターン使って書けるならその方がいいです。

ただ、やっぱりStateパターンは初心者のうちはちょっと難易度が高いかと思います。
一応、Stateパターンを使わないで簡単にキャラの状態を管理するやり方も紹介します。
下記のコードはMoveを呼び出す度に移動←→待機に切り替わります。

int state = 0; //状態を保持しておくメンバ変数を作っておく
public void Move()
{
switch(state)
{
case 1:
   //キャラが動くための処理
   Debug.Log("動いた");
   state = 2; // 次にMoveが実行される時は待機になる
   break;

case 2:
   Debug.Log("待機");
   state = 1; // 次にMoveが実行される時は移動になる
   break;

default:
   Debug.Log("例外エラー");
   break;
}


追記:
すいません、参考URLのコード、よく見たらRx使ってますね。
RxはStateパターンとは全く関係ない(無くても全く問題ない)ですし、
さらに難易度が上がるだけなので、初心者の方には全く優しくない例でした。
ただ、普通に便利なので、いずれはRxを勉強してみるのもいいと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/14 10:20

    親切にありがとうございました!
    参考にさせてもらいます!

    キャンセル

0

必ずcase1を実行したらそのままcase2を実行する
というだけならば、case1のbreakを消す&iの値を2にする
1に戻るというのは次のイベント(Move)で期待するべきだと考えます
どうしても繰り返したいというのであれば、switch文を捨てましょう。むいている関数ではありません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

breakをしなければいくはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こうでしょうか これだとエラーが出ますが
public void Move()
{
int i = 1;

while(true){

switch(i)
{
case 1:
//キャラが動くための処理
Debug.Log("動いた");

case 2:
Debug.Log("待機");
if(i==2){
i=1;
}
break;

default:
Debug.Log("例外エラー");
break;
}

}

}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

おそらくゲーム制作だと思うので、case1「動いた」、そのままcase2「待機」にしたいというのは、
1ループ目:動いた、2ループ目:待機
になっているのが、望ましいのではないかと想定し、サンプルソースを記載しました。
しかし、以下の内容では、永久に、「動いた→待機→動いた→待機」を繰り返すだけで、
別の動きを入力する余地がありません。
別の動きを入力したいのであれば、
Move関数の上の階層で、無限ループを作成し、
入力→Move→入力→Moveを繰り返す案を考えた方がいいと思います。

public void Move()
{
    int i = 1;

    //無限ループで問題ない?
    while(){

        switch(i)
        {
        case 1:
            //キャラが動くための処理
            Debug.Log("動いた");
            i = 2;
            break;

        case 2:
            Debug.Log("待機");
            i = 1;
            break;

        default:
            Debug.Log("例外エラー");
            break;
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C#

    9053questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    5514questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。