Unityに関連する記事です

<実装動画>
動画ファイルへのリンク

 以下の内容で順番に実装を進めていきます。

手順9 ーキャラクターのアニメーション遷移用のスクリプトの作成ー
12.PlayerAnimation スクリプトの作成
13.PlayerNavigationController スクリプトの修正



12.PlayerAnimation スクリプトの作成

1.設計


 プレイヤー用のキャラクターのアニメーション遷移を制御するクラスを作成します。
汎用的なクラスを作成することを目的として設計することで、プレイヤー用のキャラだけではなく、
敵キャラのアニメーションの制御にも利用することが可能です。

 そのため、各キャラクターの制御用のクラス(PlayerController など)にはアニメーション制御の処理は記述せず、
新しい専用のクラスを作成して、色々なキャラクターに対応できるような設計を行います。


2.PlayerAnimationState を作成する


 enum 型の PlayerAnimationState を作成します。

PlayerAnimationState.cs

 ← クリックすると開きます



3.<enum の列挙子と機能>


 enum(イニューム)とは C# に用意されている構造体に分類される機能の1つです。列挙(れっきょ)型と呼ばれます。

 bool 型を利用すると if 文において2つの分岐パターンを作成することができます。
ですが bool 型には true/false の2つの状態しか値として持たないため、3つ以上の状態を管理することが出来ません。

 このような、''2つ以上の情報を1つの情報源として管理する場合や、true/false では認識しにくい場合には、
enumを作成し、その種類を登録しておくことをおすすめします''。

 enum で作成する型には任意の名前を付けることが出来ます。クラスと同じです。
宣言した enum 内には任意の名前の列挙子を作成できます。数に指定はなく、日本語でも作成できます。

<今回実装した enum で作成された PlayerAnimationState 型の宣言>
/// <summary>
/// プレイヤー用のキャラクターのアニメの種類
/// </summary>
public enum PlayerAnimationState {
    Speed,
    Hit,
    Down,
    Clear,
    Idle,
    Jump,

}

 今回は、プレイヤーのアニメーションの状態を表現する方法として enum によって作成された PlayerAnimationState 型を用意しました。
Speed 〜 Jump まで、6種類の列挙子を宣言しています。これは自由に名前の変更、新しい列挙子の追加・削除ができます。



 作成した PlayerAnimationState 型は情報源、つまり、設定情報であり、この情報を実際にゲーム内で利用するためには、PlayerAnimationState 型の変数の宣言を行います。


<PlayerAnimationState 型の変数の宣言>
 public PlayerAnimationState currentPlayerAnimationState;

 以上のように enum は、enum を宣言して設定を行う部分と、それを利用するための変数の宣言の2つが必要になります。
自作した enum の PlayerAnimationState 型には、PlayerAnimationState 型内に宣言した列挙子の値を1つだけ代入することが出来ます
2つ以上の状態が代入されることはあり得ない(存在しない)ため、処理を排他的に構築する際に役立ちます。

<列挙子の代入>
  // ステート管理処理を追加
  currentPlayerAnimationState  = PlayerAnimationState.Jump;

 代入する場合には必ず、[enum の型名.列挙子名] で指定をします。列挙子名のみでの指定は出来ません。

 このように1つの変数内には、いずれかの列挙子の値が1つだけ代入できるため、
bool 型とは異なり、宣言した列挙子分の分岐を用意することが可能になります
よって、true なら/false なら、という分岐の形ではなく、現在の PlayerAnimationState の値が Jump なら / Idle なら / Clear なら、という風に、
列挙子の値に合わせて分岐が作成できます。



 enum を利用する場合、その登録してある列挙子からしか情報を指定できませんので、
例えば、文字列と異なり、指定に際して打ち間違えが発生しませんので、不備の値が入ることも防ぐことが出来ます

 以上のことから、ゲームの内容に応じた enum を考えて作成して運用します
ほかには、プレイヤーの状態用(毒、混乱、痺れとか)、アイテムの種類(消耗品、武器、防具、など)、
ゲームの状態管理(ゲーム開始前、ゲーム中、ゲーム終了)など、非常に応用が利く機能です。



 なお enum では各列挙子に自動的に整数の番号が与えられます一番上から 0 で連番になっています
今回の場合であれば、Speed には 0、Jump には 5 の数字が与えられています。

 この番号は見えない情報ですが、列挙子を int 型にキャストを行うことで取得して利用出来ます
下記の例の場合、enumValue には 1 が代入されます。

<enum の列挙子のキャスト>
 int  eventValue = (int)PlayerAnimationState.Hit;

 また、列挙子の宣言時に数字を指定して代入することも可能です。その場合には連番ではなく、指定した数値を取得出来ます。

<数字の代入の例(今回この方式は利用しません)>
public enum PlayerAnimationState {
    Speed = 10,
    Hit = 100,
    Down = 5,
    Clear = 15,
    Idle = 30,
    Jump = 1000,

}

 上記のように代入されている場合には、列挙子を int 型にキャストすると、代入してある値が取得出来ます
今回は数字の代入は行っていませんので一番上の列挙子には 0 から順番に採番されています。

 enum は自分の目的に合わせて自由に作成できます。
今後も必要に応じて作成し、プログラムを読みやすく、管理をしやすいゲーム環境を作っていくようにしましょう。


4.PlayerAnimation スクリプトを作成する


 Animator コンポーネントを活用した処理をまとめて記載しておき、アニメーションの遷移制御の専用クラスとして作成します。
このように役割を決めてクラスを作成しておくと利用方法や活用方法も明確になります。


PlayerAnimation.cs

 ← クリックすると開きます



<Animator.SetFloat() メソッド、Animator.SetBool() メソッド、Animator.SetTrigger() メソッド>


 Unityのアニメーションは、Animatorクラスによって様々なアニメーションの制御が行えます。

Unity公式スクリプトリファレンス
Animator



 今回はアニメーションの遷移のために、SetBoolメソッド、SetFloatメソッド、SetTriggerを利用し、遷移の条件をこのメソッドの引数に指定してアニメーションの遷移を行っています。

 各メソッドの引数にはそれぞれ型の指定が異なりますが、いずれも第1引数は string 型です。この部分には、パラメータで設定した文字列を指定します。
文字列ですので大文字小文字は区別されます。パラメータに登録した文字列をこの第1引数に指定することでパラメータのもつ情報を変更することが出来ます。
そして、パラメータの値を変更する内容を第2引数に指定します。例えば、SetBoolであれば、第1引数に bool 型のパラメータである Idle の文字列を指定し、第2引数に true や false を指定します。

  // 待機状態のアニメの再生を止めて、走るアニメの再生への遷移を行う
  anim.SetBool("Idle", false);
  anim.SetFloat("Speed", 0.5f);

 //  走るアニメの再生を止めて、待機状態のアニメの再生への遷移を行う
  anim.SetFloat("Speed", 0.0f);
  anim.SetBool("Idle", true);

 こうすることで、このパラメータの値をスクリプトから書き換えることができます。その結果として、条件が合致したアニメーションに遷移することが出来ます。



 今回は第1引数について文字列での直接記述(リテラル表記)ではなく、
enum の PlayerAnimationState 型を指定し、それを ToString メソッドを利用して string 型にキャストしています。
このようにすることで、文字列を直接書き込んで打ち間違えをしてしまう、エラーの可能性を排除しています。

<今回の実装例>
 anim.SetFloat(PlayerAnimationState.Speed.ToString(), speed);

 anim.SetBool(nextAnimState.ToString(), isChange);

  anim.SetTrigger(nextAnimState.ToString());

 特に複数人で作業をおこなう場合には極力、文字列を直接書き込むことは避けた方がよいでしょう。
またメソッドの引数を利用した実装を設計することで、変数を上手く活用した設計(変数の値によって自動的に分岐化させること)が出来ます。


パラメータとSet〜メソッドの関連性



パラメータとSet〜メソッドの関連性



<実行動画 スクリプトからパラメータの値を変更し、条件を満たしたアニメーションを遷移させる>
https://gyazo.com/faedc20577029997b12cf44479da64dd


<参考サイト>
Unity公式スクリプトリファレンス
SetFloat


Unity公式スクリプトリファレンス
SetBool


Unity公式スクリプトリファレンス
SetTrigger



PlayerAnimation スクリプトをアタッチする


 ヒエラルキーにあるプレイヤー用のゲームオブジェクトに PlayerAnimation スクリプトをドラッグアンドドロップしてアタッチします。
アタッチした際には必ずゲームオブジェクトを選択し、インスペクターを見てアタッチされていることを確認します。


<応用 複数のクラスの記述>


 1つのスクリプト・ファイルの中に複数のクラスを合わせて作成することも出来ます。

 今回であれば、PlayerAnimation クラスと同じスクリプトの中に PlayerAnimationState を作成することも出来ます。
記述する順番に優劣はありません。


PlayerAnimation.cs

 ← クリックすると開きます


 ファイルは1つになりますが、この書き方であっても、同じ機能が利用できます。

 他にも入れ子のクラスなど、スクリプトには色々な記述の方法があります。
覚えておくといいでしょう。


13.PlayerNavigationController スクリプトの修正

1.設計


 先ほど作成した PlayerAnimation クラスを利用するため、すでに作成してある PlayerNavigationController クラスの修正を行います。
この機能を追加することで、キャラの状態とアニメーションとを同期させて、ゲーム内での整合性を取れるようにしていきます。
例えば、移動している際には移動用のアニメーションを再生させ、停止しているときには停止用のアニメーションをループ再生させる、という具合です。


2.PlayerNavigationController スクリプトを修正する


 PlayerAnimation 型の新しい変数を宣言します。
同じ種類のアクセス修飾子は並べて記述するようにし、種類ごとにまとめることで、可読性を高めます。


PlayerNavigationController.cs

 ← クリックすると開きます。



3.<Summary(サマリー)機能>


 関数(メソッド)やクラスを作成し終わりましたら、必ずその関数やクラスの説明を書くように心がけましょう。書く場所は関数名、あるいはクラス名の1行上の部分です。
半角スラッシュを3個連続で記述すると説明用のコメントであるサマリー(概要)が自動的に記述されます。

 別の記事で詳しく解説していますので、そちらを確認しておいてください。


 => 知っておきたい豆知識


4.ゲームを実行して動作を確認する


 デバッグの用意を行い、ゲームを実行して動作を確認します。

 どのような状態になっていればよいのか、正しい挙動を理解した上でデバッグを行うように心がけます
今回の場合であれば、アニメーションの遷移の確認を行いたいので、Game ビューでの確認だけではなく
Animator ビューも一緒に見れるようにして、ステートへのトランジション(PlayerAnimation クラスによる Animator コンポーネントの制御)も確認します。


<実装動画 Game ビュー>
動画ファイルへのリンク


<実装動画◆Animator ビュー>
動画ファイルへのリンク



 以上でこの手順は終了です。

 => 次は 手順10 −カメラの追従機能− です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます