【第8回】角度から力の向きを計算するUnityチュートリアル

【第8回】角度から力の向きを計算するUnityチュートリアル

前回のチュートリアルでは、Inspectorウィンドウからメンバ変数の値を編集する方法をお送りしました。

その中で、力の向きを表すVector3型の変数も表示するようにしましたが、このままだと直感的に何度か分かりにくいですね。

なので、今回はX軸からの角度を入力できるようにして、直感的に角度を計算するチュートリアルです。

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

 

今回の目的

Inspectorウィンドウから力の向きを角度で指定できるようにします。

現状、Vector3型で直感的に分かりにくいので、スクリプト内で単位ベクトルに変換できるようにしましょ。

プロジェクトの準備

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

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

今の力の向きの設定

まずは現在のInspectorウィンドウの様子から。

プロパティの編集
値を変更できるようになった

「Force Magnitude」はこれでもよさそうだけど、「Force Direction」はVector3型になっています。これじゃ向きが分かりづらいですね。いちいち頭でsin60°はいくつで……って計算するのはめんどくさいですし。

なので、できればfloat型で60度! って指定したいところ。

そこで、新たに[SerializeField]をつけたfloatのメンバ変数を用意します。forceDirectionはInspectorに表示しないように、[SerializeField]を外しましょ。内部では使用するので、変数自体は残します。

これで保存してUnityの画面に戻ると、Inspectorウィンドウに反映されます。

Inspectorに反映
Force Angleが表示された

 

角度を自動的に計算したい

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ウィンドウでの入力できる値の範囲指定と、摩擦力の設定を行います。

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!