Unityに関連する記事です

 2回に分けて、プレイヤーのキャラクターの移動アニメ処理を実装します。
 以下の内容で順番に実装を進めていきます。


<実装動画(手順10まで実装したときのもの)>
動画ファイルへのリンク


手順10 ープレイヤーの移動と移動アニメの同期処理の実装ー

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

 ・TryGetComponent メソッドと out キーワード宣言
 ・Mathf.Approximately メソッド
 ・Animator.SetFloat メソッド
 ・Vector2.Set メソッド
 ・Vector2.Normalize メソッドを利用した正規化処理



16.PlayerController スクリプトを修正して、キャラの移動している方向を取得し、その後、移動アニメと同期させる処理を実装する

1.設計


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

 ポイントは次の点です。

 ・キャラの移動方向に合わせて、その移動方向のキャラの移動アニメが再生される

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



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


Animator コンポーネント



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



 Blend Tree の Speed 部分でキャラのアニメが値の変化に合わせて Blend Tree の Walks と Runs が自動的に切り替わったと思います。

 つまり、キャラのキー入力の情報を、Spped の部分と同期させることができれば、
そのままキャラの移動アニメにも適用することができるということになります。

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



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

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


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


 それでは実装をしてみましょう。
BlendTree の Palameter には Animator コンポーネントが持つ SetFloat メソッドを利用することで float 型の情報を送って制御することが出来ます。
そのためには Animator コンポーネントの情報を取得しておく必要がありますので、変数を用意しておくことから始めます。


PlayerController.cs

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


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


3.<TryGetComponent メソッドと out キーワード宣言>


 Unity2019.2以降に追加されたメソッドです。処理結果として bool 型で戻り値を返してくれます。
このときの処理結果というのは、指定したコンポーネントの型の取得を行い、それが取得できればtrue、取得できなければfalseが戻ります

 また out キーワードによる宣言があります。
 out キーワード宣言を行うと、out を付けた引数で指定した変数はメソッド内で必ず結果が入ることが保証されるものです。
そのため、処理結果の戻り値が true の場合には必ず、この out の後に宣言した変数内に型が代入されます

 端的にいうならば、GetComponent メソッドの処理に加えて、その処理の成否判定(コンポーネントが取得出来たか、出来なかったか)を同時に行ってくれるメソッドになります。

<実装例 
  TryGetComponent(out anim);

<実装例◆〔瓩蠱佑魍萢僉
 if (!TryGetComponent(out anim)) {
    Debug.Log("Animator 取得出来ませんでした");
  }
}

 今回は実装例,僚萢として利用しています。スクリプト内に TryGetComponent メソッドを直接記述した場合、GetComponent メソッドと同様に、
このスクリプトがアタッチしているゲームオブジェクトのコンポーネントから指定されている種類のコンポーネントを取得してます。
それを out キーワード後の anim 変数に代入しています。GetComponent メソッドのように<型引数>を指定していないのは、anime 変数によって型を推論することが可能であるためです。

 out キーワード以降にはゲームオブジェクトから取得したい型と変数を宣言します。今回のように事前に変数の宣言をしている場合には、変数のみを用意しておくことが出来ます。

 もしもこの TryGetComponent メソッドの処理結果が実行可能ならば、つまり、ゲームオブジェクトに Animator コンポーネントがアタッチされているのであれば、
out として用意した anim 変数に Animator コンポーネントの情報が代入されます''。また、true の値が、それとは別に処理結果として戻ります。

 TryGetComponent メソッドの処理結果が false の場合には Animator コンポーネントの取得ができなかったため、anim 変数は null のままで、false が処理結果として戻ります''。


 なお TryGetComponent メソッドには複数の書式があります。こちらは下記のリファレンスを参照してください。

参考
Unity公式スクリプトリファレンス
Component.TryGetComponent
https://docs.unity3d.com/ScriptReference/Component...


4.<Mathf.Approximately メソッド>


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

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

 今回のケースの場合、horizontal の値と 0.0f を比べて、horizontal の値が 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/...


5.<Animator.SetFloat メソッド>


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

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

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

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

 // 向きの制御
  anim.SetFloat("LookX", lookDirection.x);

 // 移動アニメ再生
  anim.SetFloat("Speed", lookDirection.sqrMagnitude);

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


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


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


6.<Vector2.Set メソッド>

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

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

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

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

 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/


7.<Vector2.Normalize メソッドを利用した正規化処理>

 
 正規化処理です。magnitude(マグニチュード。長さ)を1としたベクトル(単位ベクトル)を返します。戻り値は Vector3 型になります。

  // lookDirection 変数に対して正規化処理を行う
  lookDirection.Normalize();

 現在のベクトルの方向を維持したまま、magnitudeが1、あるいは0の単位ベクトルを作成することが出来ます。(ベクトルの値が小さいと0になります。)

 この正規化を行うことによって位置の遠近に関わらず、magnitude がすべて 1、あるいは 0 に統一された単位ベクトルの値となるため、
左と下の方向であれば -1右と上の方向であれば 1の値がベクトルとして作成されます。値が 0 に近い場合には 0 がベクトルとして作成されます。

 今回の実装ではこの値を BlendTree の各値として利用することにより、''BlendTree の Palameter の設定値とこの正規化された値とがリンクして
移動アニメの切り替え処理が実装''出来ています。

Unity公式スクリプト・リファレンス
https://docs.unity3d.com/ja/current/ScriptReferenc...
TechProjin様
UnityのVector3でよく使うものまとめ
https://tech.pjin.jp/blog/2016/02/16/unity_vector3...


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


 ゲームを実行前に、ヒエラルキーにあるプレイヤー用のゲームオブジェクトを選択し、Animator ビューにしておきます。
Animator コンポーネントがアタッチされているゲームオブジェクトを選択している場合、
ゲームを実行すると、そのアニメの状態に合わせてリアルタイムにアニメの遷移処理を確認することが出来るためです。

 ゲームを実行して挙動を確認します。いままでと同じように移動アニメの制御が行われていれば成功です。


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


 実装して完成、ではなくて、デバッグを行いながら修正箇所がないかどうかを考えることで、コーディング技術や設計技術を養っていくことが出来ます。



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

 次は 手順11 −Skybox と Fog の設定− です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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