Unityに関連する記事です

 プレイヤーの移動機能を実装します。

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

手順4 ープレイヤーの移動機能の実装ー



 ・SerializeField 属性
 ・TryGetComponent メソッドと out キーワード宣言
 ・Input.GetAxis メソッド
 ・FixedUpdate メソッド
 ・Rigidbody.velocity 変数



1.設計


 プレイヤーの移動については、まずは左右方向のみの移動を行う形で実装を行います。

 発展編では、指定したレーン上を左右移動させることで、ゲーム画面の奥行を利用した左右移動を行えるようにします。

 まずは最初にプレイヤーの分身となる3Dキャラクターのゲームオブジェクトをゲーム画面に配置します。
その後、移動用のスクリプトを作成して、プレイヤーの移動を実装します。


2.プレイヤー用のゲームオブジェクトのインポートと配置を行う

 
 プレイヤー用ゲームオブジェクトを作成します。

 アセットストアや、無料の3Dモデルサイトなどからゲームに利用したいキャラクターのモデルをダウンロードして、Unity にインポートします。

 今回の制作例では、Unity 公式キャラクターである UnityChan のデータを利用しています。
そちらを利用する場合には、下記の公式サイトより、必要なデータをダウンロードして Unity へインポートしてください。

UNITY-CHAN! OFFICIAL WEBSITE
https://unity-chan.com/

 
 色々な種類の Unity ちゃんのモデルや、他のキャラクターのモデルもありますので、自分の世界観に見合ったものを利用しましょう。


ノーマル



デフォルメ



ローポリ




 続いて、Sceneビュー 内にインポートしたゲームオブジェクトをドラッグアンドドロップして配置します。
ヒエラルキーに設置してもいいです。

 Unity ちゃんの場合には、Prefabs フォルダ内にある Unitychan ゲームオブジェクトをドラッグアンドドロップしてください。
それ以外のアセットの場合にも大体 Prefabs フォルダがあり、その中に用意されているモデルのゲームオブジェクトを利用するといいでしょう。


ファイルのパス
Assets/UnityChan/Prefabs/unitychan.prefab
 

フォルダ画像



インスペクター画像




3.プレイヤー用のゲームオブジェクトの設定を行う


 ヒエラルキーでプレイヤー用のゲームオブジェクトを選択し、インスペクターに情報を表示します。
物理演算を利用するため、インスペクターの一番下にある Add Component ボタンを押下して、Rigidbody コンポーネントと CapsuleCollider コンポーネントを追加します。


参考例 インスペクター画像



 上記画像の補足としまして、Unitychan のモデルによっては SpringManager コンポーネントや、Auto Blink コンポーネントといったものがアタッチされている場合もありますが、
これらはなくても問題ありません。アタッチされている場合には、そのまま初期設定のままで問題ありません。

 また、Transform コンポーネントの Position の値については、自分がゲーム内に配置した位置情報が設定されていますので、
この画像のインスペクターの値にする必要はありません。(あくまでも参考例です。)



 続いて、追加したコンポーネントの設定を行います。

 Rigidbody コンポーネント内にある Constraints の設定を行い、物理演算時にゲームオブジェクトが自分の力で回転してしまわないように
Freeze Rotation の各項目(X、Y、Z)にチェックを入れます。Freeze Position の方ではないため、気を付けてください。

 CapsuleCollider コンポーネント内の Edit Collider のボタンを押すと、Sceneビュー 内にコライダーが可視化されて、ドラッグアンドドロップでサイズを変更出来るようになります。
キャラのモデルに合った形状に調整を行ってください。


4.PlayerController クラスを作成する


 プレイヤーの情報を管理するためのスクリプトとして PlayerController クラスを作成します。
このスクリプト内に移動の処理を記述し、プレイヤーを制御します。

 スクリプトを作成していく際には、先々のことを考えて、事前にフォルダを作成し、その中にスクリプトを作成していくことをお勧めします。

 Assets フォルダ内で右クリックをしてメニューを開くと、Create => Folder というコマンドがありますので、そちらで新しいフォルダを作成できます。
Scripts のようなわかりやすいでフォルダを作成し、そのフォルダの中で再度右クリックをしてメニューを開き、Create => C# Script を選択して
スクリプトを作成し、名前を PlayerController に変更してください。


フォルダ作成




PlayerController.cs

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



5.<SerializeField 属性>


 変数の宣言に合わせて宣言できる、属性情報と呼ばれるものの1つです。変数の宣言の前に [ ] 付きで書かれた内容が属性情報となります。

 今回利用している属性は SerializeField という属性情報です。この機能は、インスペクター上に変数を表示させる、というものです。

 主に private 修飾子とセットで用いられ、アサインをインスペクター上で可能にするものの、変数の参照先が外部のスクリプトにない(publicの必要がない)場合に利用します。

 たとえば ButtonコンポーネントやTextコンポーネントといった、アサインはするものの、その変数の利用先が他のスクリプトにはないようなもの、には利用しやすいです。

 今回はプレイヤーの移動速度を設定するための変数の宣言に属性情報を付与しています。
移動速度の情報をインスペクターに表示させることにより、移動速度の調整にあたり、
スクリプト内でその都度書き直さなくてもよいようにする目的で利用しています。


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


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

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

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

<実装例 
  private Rigidbody rb;

  TryGetComponent(out rb);

<実装例◆〔瓩蠱佑魍萢僉
if(col.gameObject.TryGetComponent(out Rigidbody rigid)) {

   // 処理を書く
}

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

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

 実装例△両豺腓蓮△發靴發海 TryGetComponent メソッドの処理結果が実行可能ならば、つまり、ゲームオブジェクトに Rigidbody コンポーネントがアタッチされているのであれば、
out として用意した rigid 変数に Rigidbody コンポーネントの情報が代入されます''。また、true の値が、それとは別に処理結果として戻ります。
out に用意した変数が事前に宣言されている変数の場合(例えば rb 変数)には、宣言されていた変数に代入されます。
この辺りは変数のスコープを考えて実装を行う必要があります。

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


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

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


7.<Input.GetAxis メソッド>


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


 => Input.GetAxisメソッドとInputManagerの関連性


8.<FixedUpdate メソッド>


 Rigidbody による物理演算の処理を継続的に処理する場合には、Update メソッドではなくて FixedUpdate メソッドを利用して設計を行います。

 FixedUpdate メソッドは初期設定では 0.02秒(1秒間に50回)ごとの固定フレームレートで、物理演算の処理の更新を行う直前に自動的に呼びだされるメソッドです。

 Update メソッドはゲームオブジェクト等の動作のレンダリング前毎フレーム呼び出されますので、
処理の実行タイミングフレームの呼び出しが固定かどうかが Update メソッドと FixedUpdate メソッドの違いです。

 以上のことから、FixedUpdate メソッドは物理挙動の更新の直前に呼ばれるメソッドであるため、物理演算の処理を行うことに適していますので
Rigidbody コンポーネントを利用した物理演算を用いた移動処理については、FixedUpdate メソッドにて行うようにしています。


参考サイト
SamuraiBlog 様
【Unity入門】Updateメソッドとは?FixedUpdateとの違いも徹底解説!
https://www.sejuku.net/blog/49382
かめくめ 様
UnityのUpdateとFixedUpdate、LateUpdateメソッドについて
https://gametukurikata.com/basic/update


9.<Rigidbody.velocity 変数>


 velocity(ベロシティ)とはRigidbodyクラスの持つ情報の1つで、各軸(x,y,z)の速度ベクトルを表しています。
ゲームオブジェクトが停止している場合、velocityの値はすべて 0 です。(velocity = 0, 0, 0)

  // 移動方向にスピードを掛けて移動
  rb.velocity = new Vector3(horizontal * moveSpeed, rb.velocity.y, 0);

 x 軸については、キー入力の値と moveSpeed 変数の計算結果が入り、その軸の方向へ移動を行います。
y 軸は velocity 変数の y の値が指定されていますので、重力に影響がある場合にはマイナス方向への速度が入り、
その結果、地面に向かって落下を行っています。
z 軸については移動する対象の軸ではないため、常に 0 を代入しています。

 処理の直後に Debug.Logメソッドを入れておくことで、Console ビューを通じて、この velocity の値の動きを観察することができます。
キー入力を行いながら、どのような処理になっているかを確認してみましょう。


参考サイト
Unity公式スクリプトリファレンス
Rigidbody-velocity
https://docs.unity3d.com/ja/current/ScriptReferenc...
SamuraiBlog 様
【Unity入門】Rigidbodyで自在に移動!velocityの活用方法!
https://www.sejuku.net/blog/55084


10.プレイヤー用のゲームオブジェクトに PlayerController スクリプトをアタッチする


 ヒエラルキーにあるプレイヤー用のゲームオブジェクトに、先ほど作成した PlayerController スクリプトをドラッグアンドドロップしてアタッチします。

 ヒエラルキーのプレイヤー用のゲームオブジェクトを選択し、インスペクターを表示して、PlayerController スクリプトがアタッチされていることを確認します。

 MoveSpeed 変数の値はインスペクターより調整できます。この値がプレイヤー用のゲームオブジェクトの移動速度の値になりますので、適宜調整をお願いします。


<インスペクター画像>



 以上で設定は完了です。


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


 キー入力を行った際に、プレイヤーが実際に移動するか、動作確認(デバッグ)を行います。

 ゲームを実行し、矢印キーの左右、あるいはA か D キーを押し続けてください。
指定した方向に移動すれば、制御は成功です。
現時点ではカメラはプレイヤーを追従しませんので、プレイヤーのみが移動する制御になります。


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


 正常に動作した場合、それで終わり、ではなくて、プログラムを読み直し、
どのような処理によって、今回の移動の制御が行われているかを、しっかりと読み解けるようにしてください。



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

 => 次は 手順5 ーカメラの追従機能の実装ー です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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