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

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

ただいまの
回答率

90.52%

  • C#

    7110questions

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

  • Unity

    3992questions

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

  • C

    3686questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3450questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Unity2D

    877questions

enum型を利用した行動遷移

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 277

GOTOken

score 39

敵の行動分岐のようなものを実装しようとしました。

if(timer % 5 == 0)
 {
  //遷移する列挙型
 }


このような書き方で、時間を利用して分岐をさせようとしたのですが、switchとenumでの分岐のさせかたがわかりません。
この場合の、分岐の仕方をご教授していただけると嬉しいです。

以下が自分で組んだコードです。

    public enum AttackMove
    {
        shotoneway ,
        shotthreeway ,
        shotallway
    };
    public AttackMove attackMove;
    void Update () {


        switch (attackMove)
        {
            case AttackMove.shotoneway:
                shotone();
                break;
            case AttackMove.shotthreeway:
                shotthree();
                break;
            case AttackMove.shotallway:
                shotall();
                break;
        }
   }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

何となくenum型を誤解している気がしたので、簡単に説明します。
enum型は特に指定しなければint型と同じ処理をされます。つまり、

    public enum AttackMove
    {
        shotoneway ,
        shotthreeway ,
        shotallway
    };
    public AttackMove attackMove;
    void Update () {


        switch (attackMove)
        {
            case AttackMove.shotoneway:
                shotone();
                break;
            case AttackMove.shotthreeway:
                shotthree();
                break;
            case AttackMove.shotallway:
                shotall();
                break;
        }
   }


このコードは、

    public int attackMove;
    void Update () {


        switch (attackMove)
        {
            case 0:
                shotone();
                break;
            case 1:
                shotthree();
                break;
            case 2:
                shotall();
                break;
        }
   }


これと同じ動きです。
enum型は数字に名前を付けられる機能なのです。
この状態のコードならどこか別の場所で
attackMove = 1;とすればshotthree();に行くのが分かると思います。
なのでそれをenumに戻してあげると、
attackMove = AttackMove.shotthreeway;とすればshotthree();に行くという事になります。

これが分かれば、AttackMove.shotoneway=1というコードは不可能という事が分かります。
enumはただ数字に名前を付けただけですので、このコードは
1=1という意味になってしまいます。

またenumは数字なので、intとかと相互にキャストすることが出来ます。

int num = 1;
AttackMove move = (AttackMove)num;
num = (int)move;


こういうことが出来ます。これを使うと次のような書き方ができますが、

if(timer % 5 == 0)
{
    int current = (int)attackMove; // enumintにキャストする
    current += 1; // 1足す
    if (current >= 3) current = 0; // AttackMoveは0,1,2しかないので3になったら0に戻す
    attackMove = (AttackMove)current; // intをenumに戻す
}


もしenumの数が増減した場合危険ですのでやめましょう。
(推奨するかの様な書き方でしたので編集しました。)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/01 20:52

    enum を intにキャストして加算はできますが、危険です。
    後から、enumの項目に増減があった場合、追跡が困難。

    キャンセル

  • 2018/08/01 22:29

    はい、その通りです。申し訳ありません。回答編集しました。

    キャンセル

0

そのコードで動くと思います
あとは、attackMoveになにか値を設定してやれば。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/29 21:06

    なるほど。値を入れるというのは、
    列挙名=1,
    のような感じでしょうか??
    またif文で制御する場合、処理の書き方は
    if(式)
    AttackMove.shotoneway=1みたいな感じでしょうか??

    キャンセル

  • 2018/07/29 21:10

    attackMove = AttackMove.shotoneway; ってかんじですね
    AttackMoveでキャストすれば数字も使えます

    キャンセル

  • 2018/07/30 01:12

    なるほど。。?
    ということは、実際自分の思い描いている処理である時間が経ったらその列挙宣言名の場所にするなら
    if(時間 > 設定時間)
    {
    列挙体変数名 = 列挙体名.列挙体宣言名
    }
    というものでいいんですかね。?

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    棒グラフのそれぞれの棒にクリックするとクリックした棒に対応した処理をさせる

    前提・実現したいこと GoogleChartを使用し、棒グラフを表示させることは出来ました。 実現させたいこととしては、棒グラフの棒をクリックしたときに値ごとにアラートを表示す

  • 解決済

    switchのIntentでの遷移の仕方を教えてください

    Switchの遷移のやり方を教えてください。 できるだけ簡潔にお願いします。

  • 解決済

    switch構文で OR条件

    下記のように、case 1 とcase 2は同様の処理のため、纏めたいと思うのですが if分のように OR条件で"|"を使用することができませんでした。 同様の処理をしたいけれども

  • 解決済

    Javaでのswitch文

    Javaの勉強をしています。ここで、下のようなswitch文が出てきました。 int val = 2; switch (val){ case 1: S

  • 解決済

    公開用フラグ, 内部用フラグの共用

    C APIを設計しています。 処理自体の記述にはC++を用いています。 ある関数の引数にenum型の変数を渡します(動作モードを指定するものだと思ってください)。 ユーザーには公開

  • 解決済

    ComboBoxの値をコード上で設定をして、

    Windows, .NET, Visual Studio2015 です。 ComboBoxの値を 切り捨て、 切り上げ、 四捨五入、 とコード上で値を設定して その値に番号を与

  • 解決済

    case文の「 ... 」?

    いつもお世話になっております。 switch (keycode) { case KC_FN0 ... KC_FN31: action.c

  • 解決済

    switch文とwhile文の構成

    もしcase2だった場合繰り返さないというコードはどう書けばいいんでしょうか 今は下にあるように書いてるんですけど、それより先がわからなくて...  コード while(/*条

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

  • C#

    7110questions

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

  • Unity

    3992questions

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

  • C

    3686questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3450questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Unity2D

    877questions