Unity勇者の冒険の書

Unityで学んだことや便利なものなど作ったら紹介します

【Unity勇者の奮闘記】Unityで物理の勉強2(最高点に達した時の座標を求める)

こんちは。
前回は上に飛ばしたときに最高点に達した時の時間を求めました。

lightgive.hatenadiary.jp


今回は最高点に達したときの座標を求めてみます。
今回も物理の公式を使います。
というか毎回使います。

まず、Y座標については、鉛直投げ上げの公式の

y = v0t - {\frac{1}{2}}gt^2

を使います。

v0…初速
t …経過時間(秒)
g …重力加速度

として、初速と重力加速度については決まっているので、
頂点に達した時間を求めます。
これは前回の方法で求る事が出来ます。

時間 = 初速 / 重力加速度 ですね。

このtを鉛直投げ上げの公式に当てはめてみると、こんな感じになります。

var t = vec.y / (-Physics.gravity.y);

これでtを求める事が出来たので、続けて公式に当てはめてみます。

var y = transform.position.y+ (vec.y * t) - 0.5f * (-Physics.gravity.y) * Mathf.Pow(t, 2.0f);

最初にtransform.position.yを足しているのは、鉛直投げ上げの公式の初速を加えるyの位置が0スタートになっているからです。

これで、yの値は求められることが出来たので、あとは残りのx,zの座標を求めていきます。

xやzは、yと違って重力は関係無く等速直線運動なので、単純に時間×速度で求められます。ですので、

var x = transform.position.x + (vec.x * t);
var z = transform.position.z + (vec.z * t);

これで最高地点に達した時の座標が求められます。
では、前回の時の様に実験してみます。

前回、コルーチンでDebug.Break()で停止していましたが少し時間がずれていたようなので、今回はUpdateでカウントしてから停止するように変更して、誤差がないように試してみました。(ほんの若干の誤差だけど)

あと、ダミーの透明な球体を予測位置に配置し、誤差を求めるようにしました。
スフィアにアタッチしているスクリプトです。


結果、こんな感じになりました。

テスト
●一回目
f:id:LightGive:20171027163615g:plain
●二回目
f:id:LightGive:20171027163620g:plain
●三回目
f:id:LightGive:20171027163624g:plain


10回ほどテストしましたが、
一番大きい誤差で0.16554
一番小さい誤差で0.02354でした。

これは、一番大きい誤差の状態です。
f:id:LightGive:20171027163628g:plain
大きい誤差と言ってもこの程度なので、当たり判定がシビアでなければ結構ゲームで使えると思います。

では。('_')