【第9回】Inspectorで入力値の範囲を設定するチュートリアル

【第9回】Inspectorで入力値の範囲を設定するチュートリアル

前回のチュートリアルでは、Inspectorウィンドウから角度を設定すると、斜方投射の力の向きが自動的に計算される処理を実装しました。

角度はfloatで入力できますが、現在の状態では後ろや下向きにも設定できてしまうので、ゲーム的にはちょっと微妙。なので、前方の0度から90度の範囲で値を入力できるようにしましょ。

また着地後、転がっていったときに摩擦力が少なすぎてボールが止まらないので、その設定も行います。

前回のチュートリアルはこちらから。

 

今回の目的

Inspectorウィンドウで斜方投射の角度を入力する際、0度から90度の範囲で値を入力できるようにします。

また、回転の抵抗力を設定して、転がり続けるボールが止まるようにします。

プロジェクトの準備

前回のチュートリアルで作成したプロジェクトをそのまま使います。

このページに先にたどり着いた方は、チュートリアルの初回から追っていただけるといいかもしれません。

入力値の範囲を決める

まずはInspectorウィンドウで入力値の範囲を決めてみましょ。

『Sphere』オブジェクトを選択し、そこにアタッチされているSphereBoosterのスクリプトを見てみます。今の状態だと、自由に値を入力できるようになっていますね。

floatの入力
floatならどんな値も入る

「Force Magnitude」はいいとして、「Force Angle」は決められた範囲で入力されるようにしたいなぁ。

それを実現するためには、[SerializeField]のように、Attributeを追加します。入力する値の範囲を決めるのは、Range Attribute。既に[SerializeField]が存在するので、そこに追加します。以下の書き方は全て動作確認済み。

個人的にはカンマ区切りが好きなので、一番上を採用。[]で分けるのもあり。

Range Attributeの中では最小値と最大値を定義する必要があるので、それぞれ0f, 90fとしています。Attributeを追加してコンパイルすると、Inspectorでは以下のように表示されます。

スライダーで表示
0fから90fまでのスライダーが表示

スライダーが表示され、この範囲で値を設定できるようになりました。スライダーの右には直接数字を入力できますが、試しに「180」と入れてみても最大値である90に戻されます。逆に負の値を入れれば最小値の0に戻ります。

これを使えば、後ろ向きに飛んでいくこともないでしょう。OK。

 

回転の抵抗力の設定

今の状態だと、角度を60度くらいにしてボールを飛ばしたときに、そろそろ止まっても良さそう、といったところでも止まらずに転がり続けてしまいます。

実は『Sphere』オブジェクトの抵抗力の設定がもうひとつ必要なんです。

物理特性マテリアルの中では摩擦力の設定を行なっていますが、『Sphere』オブジェクトのRigidbodyコンポーネントの中でも数字をいじらないといけません。

その対象は『Angular Drag』、回転運動に対する抵抗です。

Rigidbodyの設定
Angular Dragに注目

 

似たような名前で『Drag』もありますが、こちらは運動全体に抵抗がかかってきます。今回のケースだと、ボールが空中に打ち出されたときに、空気抵抗を受けたような運動をします。

風のあるところでこの値を増やす、なんて使い方ができますが、今回は0のままにしておきます。軌道が複雑になるからしょうがないね。

回転運動に関してですが、このボールは地面に着地した後に回転運動を始めます。実は飛び上がっている間は回転していないのでした。実際にゲームを実行して、TransformコンポーネントのRotationに注目してみると分かりやすいです。

今回の目的では、地面に落ちた後、摩擦によってボールが止まる様子を表現したいので、この『Angular Drag』の値を増加させれば良さそうです。値が大きいほど、回転運動の減衰が大きくなります。

実験的に『Sphere』オブジェクトをDuplicateし、『Angular Drag』の値を変えてみました。画面奥の『Sphere』から0.05, 1, 2と設定して、同時に飛ばして比較しています。ここはあくまで実験なのでチュートリアルの手順として実装しなくてOKです。

AngularDragの比較
ああっ! 0.05だと奈落の底へ……!

 

実験結果から『Angular Drag』の値を増加させないと止まってくれないことが分かりました。止まったように見えても、『Angular Drag』が1だと微小レベルで動き続けて止まるまでに時間がかかります。

そのため、2ぐらいに設定しておくのがいいかな。

AngularDragを設定
AngularDragを2に設定するのだポッター

 

これで、地面を転がり続けることがなくなりました。例えば、氷の上を転がる時にはこの『Angular Drag』の値を小さくすくと、すぃーっと滑っていく様子が見られるので、うまくスクリプトから操作するといいかも。

球だと地面との摩擦が大きくないので、こういった設定が必要になります。立方体だと、面同士の摩擦がガッツリ働くんですけどねぇ。

まとめ

今回はInspectorウィンドウから入力できる値の範囲設定と、球体の回転の抵抗力を設定するチュートリアルでした。

Inspectorでの範囲設定で出てきたAttributeの話は、詳しく突っ込むと深みにハマるので、[SerializeField]と[Range]あたりを使いこなせれば大丈夫だと思います。

また、球体における回転の抵抗力は引っかかる初心者が多いような気がします。「摩擦さんサボってないで働け!」と何度突っ込んだことか。そう、私も引っかかった初心者です。

飛ばす->転がって止まる、まで出来たので、次は止まったところまでの飛距離を画面に表示してみましょ。

アセット作ってます!

CTA-IMAGE

Unityでの開発に役立つアセットを作っています。

3DダンジョンRPGを開発するスピードを200%加速するAssetや、ファンタジーRPGのダンジョンを彩るパーツを取り揃えています。

特に3DダンジョンRPGのゲームを1から作るのは結構時間がかかります。ダンジョン部分の作成はこうしたアセットを使って、開発をブーストさせてみませんか?