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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

6407閲覧

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

kazurego7

総合スコア13

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

1クリップ

投稿2015/06/02 19:46

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

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

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

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

投稿2015/06/03 01:16

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問