【第8回】角度から力の向きを計算するUnityチュートリアル
- 2018.04.12
- Unityチュートリアル
- Unity, チュートリアル
前回のチュートリアルでは、Inspectorウィンドウからメンバ変数の値を編集する方法をお送りしました。
その中で、力の向きを表すVector3型の変数も表示するようにしましたが、このままだと直感的に何度か分かりにくいですね。
なので、今回はX軸からの角度を入力できるようにして、直感的に角度を計算するチュートリアルです。
前回のチュートリアルはこちらから。
今回の目的
Inspectorウィンドウから力の向きを角度で指定できるようにします。
現状、Vector3型で直感的に分かりにくいので、スクリプト内で単位ベクトルに変換できるようにしましょ。
プロジェクトの準備
前回のチュートリアルで作成したプロジェクトをそのまま使います。
このページに先にたどり着いた方は、チュートリアルの初回から追っていただけるといいかもしれません。
今の力の向きの設定
まずは現在のInspectorウィンドウの様子から。
「Force Magnitude」はこれでもよさそうだけど、「Force Direction」はVector3型になっています。これじゃ向きが分かりづらいですね。いちいち頭でsin60°はいくつで……って計算するのはめんどくさいですし。
なので、できればfloat型で60度! って指定したいところ。
そこで、新たに[SerializeField]をつけたfloatのメンバ変数を用意します。forceDirectionはInspectorに表示しないように、[SerializeField]を外しましょ。内部では使用するので、変数自体は残します。
これで保存してUnityの画面に戻ると、Inspectorウィンドウに反映されます。
角度を自動的に計算したい
float型の角度をInspectorから設定し、向きを表す単位ベクトルに変換しましょ。
昔懐かし物理の時間を思い出してもらいましょうか。初期位置からボールが飛び出す方向に矢印を引いた時、力の大きさを1とすれば、X軸方向の成分はcosθ、Y軸方向の成分はsinθで表せました。
ここで、θはforceAngleと対応しています。とすると、forceAngleを使ってcosとsinを出してあげれば力の方向を導けそうですね。
スクリプトにするとこんな感じ。
前回からの変更点は、以下の通り。
- CalcForceDirection()を追加
- Update()からCalcForceDirection()を呼ぶ
CalcForceDirection()は力の向きを計算するメソッドです。Inspectorウィンドウで指定されたforceAngleを元にforceDirectionに値を設定しています。
cos、sinを計算するために、数学的計算を行うMathfクラスを使用しています。この中では角度ではなくラジアンで計算するため、Mathf.Deg2Radをかけてラジアンに変換しています。
X-Y軸での運動を考えているため、Z軸方向の成分は0とします。
Update()の中でCalcForceDirection()を呼ぶことで、Inspectorで値が変更された時にすぐ力の向きを計算することができます。
ゲームを実行して確認
スクリプトを保存してUnityに戻ったらゲームを実行して確認してみましょ。実行時にforceMagnitudeを14に設定しています。実は以前のforceDirectionは√2倍くらい大きかったんです。今回の計算で大きさが1になるのでこれをベースに計算するといい感じ。規格化は大事です。
これで角度を指定してボールを飛ばすことができるようになりました。
やってみて気付いた人もいるかもしれませんが、135度とかにすると後ろに飛びます。Inspectorウィンドウからfloat型で直接値を入れるようになっているため、今の段階だとどの方向へも飛ばせちゃうんですよねぇ。
この後ゲームらしくするために、0から90度の範囲で入力できるようにしましょうか。
あと、着地して転がって行った後に、止まらず転がり続けるのも気になります。ゴルフっぽいゲームで球が止まらないとか、ゲームにならないよ……。
次はこの辺りを設定してみましょ。
まとめ
今回は角度を数字で指定して力の向きを算出するチュートリアルでした。ゲーム作成のチュートリアルというよりは物理とか数学のチュートリアルのような気もしますが、Mathfは便利なので慣れておくと超お役立ち。
次回はInspectorウィンドウでの入力できる値の範囲指定と、摩擦力の設定を行います。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【第7回】ハードコードにさよならバイバイ! Inspectorから値を変更する 2018.04.11
-
次の記事
【第9回】Inspectorで入力値の範囲を設定するチュートリアル 2018.04.12
コメントを書く