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

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

ただいまの
回答率

90.12%

ゲームのキャラクターの状態遷移がしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 3,083

kazurego7

score 11

現在、Unityを用いたゲーム開発で、キャラクターの状態によって行動が変わるようにしたいのですが、私のゲーム構成が途中(未熟)なため、キャラクターの状態が追加されたり遷移の条件が変わってしまったりして、上手く状態遷移を表すことができません。
状態遷移について、何か良い書籍や資料(回路ではなく概念)、ツールなどがあれば教えてほしいです。


自分の中での解決策が順に、
1. swith,ifでひたすら分岐する
⇒状態と遷移が増えると、キャラクターのクラスが爆発する
2. CharacterStateクラスがある。
フィールドには、状態の種類、状態保持変数
メソッドには、状態遷移
状態遷移では、遷移の条件に合うと状態保持変数に次の状態を代入する
キャラクターの方で、状態保持変数の値で条件分岐し行動する
⇒現在のコード、結局switchとifで分岐
3. StateクラスとTransitionクラスとがある
それぞれ具体クラスから継承される。
Transitonクラスは遷移を表し、NextStateと、Predicateをフィールドに持つ
NextStateは、次の状態
Predicateは、遷移の条件
Stateクラスは状態を表し、TransitonListと、Nowをフィールドに持つ
TransitionListは、いくつかのTransitionオブジェクトのリスト
Nowはプロパティで、TransitionListのPredicateからマッチするものを選び、Transitionオブジェクトの保持するStateのNowを返す。マッチしなければ、自分を返す。
⇒状態遷移図が作れる。State.Nowで評価されていない入力や時間を条件として最新の状態が返ってくるようにできそう。

3.は、状態遷移図をそのままクラスにしてみたものですが、不勉強もあって、これで良いのか、これに何かもっと必要でないか、これ以外にもっと良い方法がないか、と分からない状態が続いています。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

デザインパターンでいうSTATEパターンを使うとすっきりした形で実装できると思います。
最初のうちは冗長に感じられますが、今後状態の追加等が発生することが予想されるのであれば、状態の追加が割合楽にできます。

書かれている内容からいまいち読み取れない部分があるのですが、解決策3.が近いでしょうか。

今回の要件にしたがうと
1)キャラクター動作のインターフェースを定義する(例:run()だとかjump()だとか)
2)これらすべてのインターフェースを持つ基底クラスを作り、状態によって変化する動作は派生クラスで実装する
3)状態によってどの派生クラスを使うかを決定する処理を作る

といったところでしょう。3)の処理は状態遷移図の内容によってどのクラスに持たせるのが効果的か変わってくると思います。複数の状態で同じ派生クラスを使いまわすのであれば、独立させた方がいいですし、各状態に対して一つの派生クラスが割り当てられるのであれば、派生クラス内に次の状態を決める処理を持たせるのも手です。

お勧めの書籍についてですが、デザインパターンの解説本としてはオブジェクト指向における再利用のためのデザインパターンをお勧めします。

ただ、この本はサンプルはC++で書かれているため、C#のサンプルが欲しい場合C#デザインパターンという本もあるようです(私は未読ですが書評によるとこの本自体はあまり良い評価ではないようです。あくまでサンプルを入手できるという意味で紹介しています)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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