Unityに関連する記事です

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

 この手順では、キャラクターをキーボードを使って加速・停止させるための制御処理を実装していきます。

<実装動画>
https://gyazo.com/69bb58e74ed2938f59ab21b73fa57657

手順7 −キャラの加速・停止制御の実装−
 9.スクリプトを使って、キャラの速度を制御する◆ 歡篁漾
10.スクリプトを使って、キャラの速度を制御する −加速−



新しく学習する内容


 ・if / else 文による処理の分岐制御
 ・PhysicMaterial をスクリプトから制御する
 ・Rigidbody,freezeRotation 変数


9.スクリプトを使って、キャラの速度を制御する◆ 歡篁漾

1.設計


 ペンギンのキャラを制御するためのスクリプトを先ほど作成しました。
今回の処理も同じようにキャラの制御に関連するものですので、PlayerController スクリプトを修正して処理を追加します。

 キャラを停止させる、と一口に行っても様々な方法があります。
今回は斜面のゲームオブジェクトの BoxCollider コンポーネントをアタッチされている PhysicMaterial をスクリプトから操作を行って
摩擦が 0 の状態を変更して摩擦を発生させて、キャラの速度を低下させて停止させるようにします。

 スクリプトを使って対象となる機能を操作制御を行うためには、その機能やコンポーネントの情報を変数へと代入し、
その代入された情報を使って制御を行うようになります

 そのため、PlayerController スクリプトには、PhysicMaterial を代入するための変数を用意することになります。
変数名はなるべく情報とリンクするように命名するようにすると、変数を利用する際に分かりやすくなります。

 キーボードの下方向を押したらこの停止の処理が実行されるように設計をしたいので、Update メソッドを用意してその中でキー入力を受け付けるようにします。

 停止の処理は1つのメソッドとして用意をします。このように役割に応じてメソッド単位に分割してスクリプトに記述しておくことで
修正する際、エラーを見つける際に役立つとともに、処理を役割ごとに分担して管理出来るようになります。


2.PlayerController スクリプトを修正してキャラを停止できるようにする


 宣言フィールドには、PhysicMaterial 型の変数を SerializeField属性で用意しておきます。
このようにすることで変数の値(操作したい情報)をインスペクターから登録することが出来ます。
そしてこの変数を介することで、Dynamic Friction といった、PhysicMaterial が管理している情報を操作することが出来るようになります。

 新しくメソッドを2つ用意します。1つは Update メソッドです。この処理の中で Brake メソッドを呼び出します。
 Update メソッドは毎フレーム継続的に処理を行うメソッドであるため、Update メソッドの中で別のメソッドの呼び出しを行うと
呼び出されたメソッドも毎フレーム呼び出されている状態になります。

 Brake メソッド内には、下方向にキー入力を受け取ったら、キャラを停止させるために PhysicMaterial を操作して、摩擦を発生させることで徐々にキャラを停止させる処理を実行します。
キー入力がない状態になったら、再度摩擦を 0 に戻す処理も行うため、この制御は if /else 文として記述し、いずれか片方にだけ分岐して処理を実行させるようにします。

 ポイントとしては、Brake メソッド内では Rigidbody を利用した継続的な制御は行わないため、FixedUpdate メソッドではなく、Update メソッドを利用します
また、Brake メソッド内には if 文内に別の if 文があります。これは最初の if 文の条件を満たしたのち、次の if 文を判定する構造です。
そのため、別々の if 文のブロックにしてしまうと想定している挙動になりません{ } の位置と数を確認しながら処理を書くようにしてください
 
 こうした制御ロジックについて、処理とコメントを見ながらしっかりと学習していきましょう。


PlayerController.cs

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



 スクリプトを修正したらセーブを行い、PlayerController スクリプトがアタッチされている Penguin ゲームオブジェクトのインスペクターを確認します。
新しく SerializeField属性で宣言した pmNoFriction 変数が表示されていれば問題ありません。


Penguin ゲームオブジェクト インスペクター画像



3.Penguin ゲームオブジェクトの設定を行う


 PlayerController スクリプトの pmNoFriction 変数に PhysicMaterial の情報を登録します。
登録された PhysicMaterial をスクリプトから操作するようになりますので、操作を行いたい NoFiriction をドラッグアンドドロップしてアサインして登録します


<手順動画 NoFiriction をアサインする>
https://gyazo.com/146a0bf2a8a830ae7b239f62ac4f96d5


Penguin ゲームオブジェクト アサイン後のインスペクター画像



 これで設定は完了です。


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


 ゲームを実行して、キー入力によってキャラが徐々に停止するようになるかを確認します。

 PhysicMaterial である NoFiriction の Dynamic Friction の値がキー入力に対応して Brake メソッド内の if 文の処理が実行されて、摩擦が 0 から 1 に変化します
その結果、キャラと斜面のゲームオブジェクトのコライダー間に摩擦が生じることになり、キャラが停止します。


<実行動画>
https://gyazo.com/bfb7070c8ccc489de861c065e82fe929


 実行すると分かりますが、停止しようとすると、ゴロゴロと転がってしまって、上手く止まりませんね。問題点を検証しましょう。


5.Rigidbody.feezeRotation 変数を設定する


 Penguin ゲームオブジェクトには Rigidbody コンポーネントがアタッチされていて、物理特性を持っている状態になっています。
そのため、コライダー間の摩擦が 0 の間は問題ありませんが、摩擦が発生すると、その影響によって物理演算によりキャラが斜面に引っかかって回転しまっている状態です。

 Penguin ゲームオブジェクトの Rigidbody コンポーネントをインスペクターより確認してください。


Rigidbody コンポーネントの設定



 設定項目の中に、FreezeRotation という情報があります。
https://docs.unity3d.com/ja/current/ScriptReferenc...


 この設定は各軸に対してそれぞれ用意されており、チェックをいれた軸に関しては、回転情報に対して物理特性による修正が入らなくなります
つまり、本来であれば摩擦によって回転する部分の計算を無視してくれるようになります。

 今回はこちらの設定を利用して摩擦が生じても、キャラが回転しないようにします。
3つあるすべての軸にチェックを入れてください。


FreezeRotation 設定後



 以上で Rigidbody コンポーネントの設定は完了です。 


6.<問題点の改善についての考え方>


 ゲーム製作にはトライ&エラーがつきものです。これから開発を行っていくにあたり、1回ですべてうまくいくケースは稀でしょう。
 
 問題点がどこにあるのかを見つけるために、1つずつチェックしていって問題点の切り分けを行います。
そして徐々に問題箇所がしぼられてきますので、その中で問題となる場所を見つけてください。

 問題点が見つかったら、どのように改善を行うかを考えます。処理には影響する範囲があります。
例えば、1つの処理の問題を修正してみたら、別の部分でエラーが3つも出てしまった、なんてことはよくある話です。

 修正しようとしている処理が、どの部分にまで影響を与えるのか、修正しようとする処理が関連する処理も一緒に確認しておくことが求められます。


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


 FreezeRotation に設定を行ったので、摩擦が生じるようになってもキャラが回転しなくなったはずです。
ゲームを実行して、同じように下方向のキー入力を行ってキャラを停止させてみてください。


<実行動画 摩擦 1>
https://gyazo.com/69bb58e74ed2938f59ab21b73fa57657


 キー入力を止めた場合、Brake メソッド内の else 側の処理が実行されるようになりますので、
再度、NoFiriction の Dynamic Friction の値が 0 に戻り、コライダー間の摩擦がなくなり、再びキャラが滑り始めます。


<実行動画 摩擦 0>
https://gyazo.com/198d17836406a663c61ea4416b8a029c

 
 処理を実装したら、必ず、スクリプトが操作を行っている情報を確認します
今回は NoFiriction を操作していますので、NoFiriction を選択してインスペクターでどのように制御されているかを必ず自分の目で確認しましょう

 インスペクターで確認ができない情報などは、Debug.Log をスクリプトに用意して、Console ビューに表示して、内部的な動きを確認しましょう。
実行した処理の結果を見て、エラーの修正を行ったりすることが常に求められますので、こういった処理の内容を把握する方法を覚えてください。

 問題なく処理が実装できていたら、続いてはキャラを加速させる処理を実装していきます。


10.スクリプトを使って、キャラの速度を制御する −加速−

1.設計


 続いて、キャラの速度を加速する処理を実装します。
停止した状態を解除すると、キャラは徐々に滑り始めますが、それがトップスピードに乗るまでには時間がかかります。
この手順では、キー入力を行うことで、キャラを急加速してすぐにトップスピードにします。

 先ほどはキー入力の下方向を利用しており、上方向は空いていますので、同じように Update メソッド内でキー入力を受け付けて
上方向を押した場合に、キャラを加速させる処理を実行して加速を行います。

 こちらも加速用の処理を1つのメソッドにまとめて記述しておいて、それを Update メソッド内で毎フレームごとに呼び出しを行い、常にキー入力を受け付ける状態にしておきます。


2.PlayerControoler スクリプトを修正してキャラを加速できるようにする


 宣言フィールドには加速させる値を設定するための変数を用意します。
速度を操作する情報が velocity の値になるため、値を変更するための代入処理を行うためには、同じ型で変数を用意する必要があります。
そのため、加速速度の値は float 型で宣言を行います。これは velocity の各軸の値が float 型によって管理されているためです。
public 修飾子を付けて宣言することでインスペクターから設定出来るようにします。

 新しいメソッドは加速処理を行う Accelerate メソッドを用意して、この中でキー入力を判定し、加速の処理を実行します。
このメソッドでは Rigidbody の velocity の値を継続的に制御する処理を行いたいため、Move メソッドと同じように FixedUpdate メソッド内で呼び出すようにします。


PlayerController.cs

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



 スクリプトを修正したらセーブを行い、PlayerController スクリプトがアタッチされている Penguin ゲームオブジェクトのインスペクターを確認します。
新しく SerializeField属性で宣言した accelerationSpeed 変数が表示されていれば問題ありません。


Penguin ゲームオブジェクト インスペクター画像



3.Penguin ゲームオブジェクトの設定を行う


 accelerationSpeed 変数に加速する値を設定します。移動速度の2倍くらいを基準に考えて設定してください。
ここでは 6 を設定しています。


Penguin ゲームオブジェクト 設定後のインスペクター画像



 これで設定は完了です。


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


 設定が終了しましたので、ゲームを実行して動作に問題がないか、実装できているかを確認していきます。
滑っている際にはさほどわかりませんので、一度停止をさせてから、上方向を入力して加速してみましょう。


<実行動画>
https://gyazo.com/ae3b868e1fe6de50f42cb3830442bfda


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

 => 次は 手順8 −Skybox の設定− です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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