Unityに関連する記事です

 2回の手順に分けて、キャラの移動に合わせて、移動アニメを同期させる制御処理を実装します。
例えば、キャラが右方向に移動している場合には、移動アニメも右を向いているものを再生させるようにします。


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


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

手順7 ープレイヤーキャラの移動アニメの同期ー
12.PlayerController スクリプトを修正し、プレイヤーキャラの移動の方向と移動アニメを同期させる



 新しい学習内容は、以下の通りです。

 ・Mathf.Approximately メソッド
 ・Vector2.Set メソッド
 ・Vector2.Normalize メソッド
 ・Animator.SetFloat メソッド



12.PlayerController スクリプトを修正し、プレイヤーキャラの移動の方向と移動アニメを同期させる

1.設計


 実装動画を確認してみてください。そのような挙動を行うためにはどうすればよいか、考えてみましょう。

 ポイントは次の点です。

 ・キー入力を行うと、その方向のキャラの移動アニメが再生される
 ・キー入力を止めて停止した場合、正面に戻るのではなく、今まで移動していた方向の移動アニメがそのまま再生される

 今回は実装していませんが、停止中のアニメを用意して足踏みを止めるようにしてもいいと思います。



 Animator こちらにて製作したアニメの遷移処理は、ゲームオブジェクトの Animator コンポーネント内にある Controller プロパティの部分で制御されています。
このコンポーネントは複数の画像をまとめてヒエラルキーにドラッグアンドドロップした際には、自動的に追加されます。


Animator コンポーネント



 Controller プロパティに登録されている情報が、先ほど Blend Tree などを設定した情報になります。
そのため、この Controller を変更することによって、異なるアニメの遷移を行うようになります。
 
 また Animator ビューの Parameters に設定した情報を操作するためにも、この Animator コンポーネントが必要になりますので、
アニメの制御を行う場合には、この Animator コンポーネントをスクリプト内で変数に取得して、それを利用するという方法で制御を行います。



 移動に際してキー入力は InputManager の機能を利用して、Horizontal、Vertical の値から移動するための値を取得しています。
この情報を活用して、「現在プレイヤーキャラが向いている方向」の情報を設定出来るようにします。

 上下左右の方向がありますので、Vector2 型の変数を用意して、水平方向と垂直方向の情報を代入できるようにすれば
上下左右の方向に対応出来るようになります。

 この値を利用して、移動アニメの方向も制御するようにします。

 Blend Tree の部分でキャラのアニメが値の変化に合わせて上下左右の方向に切り替わったと思います。
その部分の制御に、この値を利用し、例えば右方向( Vector2 (1, 0) )の値が取得出来た場合には、その値を Blend Tree の値と同期させることにより、
移動アニメを右方向を向いて歩いているアニメに切り替えるようにします。


<Blend Tree と Parameter>
動画ファイルへのリンク


 動画を観るとわかりますが、インスペクターの Parameter を操作してキャラのアニメが切り替わると
Blend Tree の中にある Look X と Look Y の値が一緒に動いていることがわかります。
つまり、キャラの向いている方向の情報を、Parameter の Look X と Look Y の部分と同期させることができれば、
キー入力をそのままキャラの移動アニメにも適用することができるということになります。

 これが今回の移動アニメとキャラの移動とを同期させるロジックになります。



 プレイヤーキャラの制御は PlayerController スクリプトにおいて行っていますので、
以上の制御処理を PlayerController スクリプトに実装して、キャラの移動と移動アニメとを同期させていきます。

 今回は実装例をそのまま掲載していますが、今後、自分で移動アニメなどの実装を行う場合も、同じような考え方で実装が出来ます。
どの処理とどの処理がつながっているのか、Unity の制御をどのようにすればスクリプトから行えるようになるのか、
設計の考え方、ロジックの作り方を覚えていって、自分のゲームにも活用できるようにしてください。


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


 設計で考えた内容とロジックを元にして、キャラの現在の方向の取得と、
その方向に合わせた移動アニメの再生の制御処理を実装します。


PlayerController.cs

 <= クリックすると開きます。


 スクリプトを修正したらセーブをします。


3.<Mathf.Approximately メソッド>


 bool 型の戻り値を持つメソッドです。
 2つの float 値を比較し、それらが互いに小さな値 (Epsilon) の範囲内にある場合に true で返します。
厳密な値ではなく「大体等しいかどうか」を判断するようなケースで利用できます。

  if (!Mathf.Approximately(horizontal, 0.0f) || !Mathf.Approximately(vertical, 0.0f)) {
   // 処理
  }

 今回のケースの場合、horizontal(vertical) の値と 0.0f を比べて、horizontal(vertical) の値が 0.0 f ではないか、0.0f に近い値でなければ、false になります
その場合に、if 文内の処理が実行されることになります。つまり、キー入力された値が 0 に近い値でなければ移動していると考えて、if 文内の処理を行うようにしています。
これは float 型のように細かく動く、浮動小数点の値の場合、特定値(0.046303f などの値)を1つとして限定することが難しいためです。
float 型の値を条件式として比較する場合には注意してください。


参考サイト
Unity公式スクリプトリファレンス
Mathf.Approximately
https://docs.unity3d.com/ja/current/ScriptReferenc...
Qiita @Hirai0827 様
全Unity使いはMathfのリファレンスを読め
https://qiita.com/Hirai0827/items/c8bc643c0bcfe5ca...
藍と淡々 様
【Unity】知って得するMathfクラス
http://megumisoft.hatenablog.com/entry/2015/08/29/...


4.<Vector2.Set メソッド>

 
 指定した Vector2 構造体に対して、引数に指定した x, y の値を代入することができるメソッドです。

  // 向いている方向を更新
  lookDirection.Set(horizontal, vertical);

 処理的には下記と同じになります。

  // 向いている方向を更新
  lookDirection = new Vector2(horizontal, vertical);

 Set メソッドの方が、新たに new Vector2 を宣言して値を代入するよりも処理が早い処理になります。
また Transform.position の代入にも利用できます。

  transform.position.Set(x, y, z);


参考サイト
Unity公式スクリプトリファレンス
Vector2.Set
https://docs.unity3d.com/ja/current/ScriptReferenc...
ゲームの作り方 れー@DKRevel 様
UnityのVector3の使い方【スクリプト解説】
https://dkrevel.com/unity-explain/vector3/


5.<Vector2.Normalize メソッド>


 引数に指定した Vector2 構造体のもつ magnitude(ベクトルの平方根の長さ) の値を 1 としたベクトルを作成し、 Vector2 型の情報として戻します。
正規化されたときベクトルは、同じ方向は維持したままで、長さが 1.0 のものが作成されます。
ベクトルが小さすぎる場合、正規化されたものは 0 ベクトルとして返されます。

  // 正規化
  lookDirection.Normalize();

 今回のケースでは、Vector2 型の lookDirection 変数の magnitude の値を正規化して、ベクトルを作成しています。
そのため、左と下の方向であれば -1、右と上の方向であれば 1 の値がベクトルとして作成されます。値が 0 に近い場合には 0 がベクトルとして作成されます。


参考サイト
Unity公式スクリプトリファレンス
Vector2.Normalize
https://docs.unity3d.com/ja/current/ScriptReferenc...
ぱふの自由帳 様
【Unity】ベクトルを正規化する
https://pafu-of-duck.hatenablog.com/entry/2018/02/...


6.<Animator.SetFloat メソッド>


 Unityのアニメーションは、Animatorクラスによって様々なアニメーションの制御が行えます。
Unity公式スクリプトリファレンス
Animator
https://docs.unity3d.com/ja/current/ScriptReferenc...

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

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

 例えば、SetFloatであれば、第1引数に float 型のパラメータである "Look X" の文字列を指定し、第2引数に float 型の値を指定します。

  // キー入力の値と Blend Tree で設定した移動アニメ用の値を確認し、移動アニメを再生
  anim.SetFloat("Look X", lookDirection.x);
  anim.SetFloat("Look Y", lookDirection.y);

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


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


参考サイト
Unity公式スクリプトリファレンス
SetFloat
https://docs.unity3d.com/ja/current/ScriptReferenc...


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


 スクリプト内の処理の流れを確認しておきましょう。
どのようなロジックで制御が行われているのか、しっかりと内容を理解して深めておいてください。


実行動画
動画ファイルへのリンク


 ヒエラルキーの Player ゲームオブジェクトを選択して Animator ビューを確認することで
現在の Animator の制御がリアルタイムで確認できます。Blend Tree の Look X と Look Y の部分に
Parameter に設定されている Look X と Look Y の値が代入されていれば制御出来ています。
この制御を Animator クラスの SetFloat メソッドによって行っています。


実行動画
動画ファイルへのリンク


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

 次は 手順8 −プレイヤーキャラの移動範囲の制限− です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

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

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

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

private



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

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