あまりにも暇すぎてUnityでゲーム作ってみた件⑥(&物理と内積と距離の話)

  • by

動かしたい

動かしましょう。動かしますよ!

では、プレイヤーの移動のコード。

Update()は毎フレーム呼ばれるところということで、遅延したくない入力を待たせるようにしてます。

何か入力されてればinput_vがtrueになるよー、と。

ということでこのスクリプトの中身はFixedUpdate()内です。

カメラ位置の話()の時に散々カメラ方向のベクトルは求めまくってるので、そこの説明は割愛します。

基本はそのカメラ方向ベクトルの向きにRigidbodyで力を加えていくという流れ。

カメラ方向ベクトルは今回は”tangent”って名前。コロコロ変わって分かりづらいなぁと反省。

Rigidbodyで色々試してたんだけど、どうも力を加えすぎると突拍子もないヤバい挙動になるし、速度出すぎて第三宇宙速度に簡単に到達するので速度制限設けました。15行目。

プレイヤーのRigidbody.velocity.sqrMagnitudeを見て、その値が2500を超えたら力加えないよ!っていう条件。

二乗の意味って?

ところでこのsqrMagnitude。

これはベクトルの長さの二乗なんですが、なぜ二乗?と。

同じベクトル同士で内積を取ると、(\(\vec{a}=(x,y,z)\)として…)

$$\vec{a}\cdot\vec{a} = x×x + y×y + z×z$$

ああ~ピタゴラスの定理で見たことあるぅ~

\(x\)と\(y\)と\(z\)はそれぞれがそれぞれと直角に交わってる…ということは…

はい!\(\vec{a}\cdot\vec{a}\)は長さ(の二乗)なんですね~

本来の長さは\(\vec{a}\cdot\vec{a}\)のルートを取らなくちゃいけませんね~

…しかし!ルート、平方根の計算って重いんです。でも内積は要素を掛けて足すだけ。

あと、\(a,b≧0\)として、「\(a^2 < b^2\)」なら「\(a < b\)」とという性質もあるし。

というわけで、マジでベクトルの長さじゃないとダメなんだ!ってとき以外は内積をどうにかするだけでいいんですな。

で、同じベクトル同士の内積にVector3.Dotを使って…とかしなくても、

sqrMagnitudeで内積が出せるわけですな。便利便利。

ということで、速度が50未満でしか力を加えない、として速度を制御してます。

中心に向かって押さえつける

つぎ。20~23行目ですが、

「速度について、地面の接方向成分がちょっとでも増えたら…」

「向心力掛けまっせ!」

って意味です。向心力?

回転運動するのに必要な力ですよ!

遠心力は回転運動をやめようとする方向にかかっている(ように見える)力で、
これと同じ大きさの力を反対向きにかけてやれば回転運動を続けるんですねぇ!

それが向心力。

向心力の方向は、地面の法線ベクトル方向(のマイナス方向だけど)にかかるので、

遠心力の大きさ(スカラー)を法線ベクトルにかけて中心向きにしてやればOK、という式が22行目ですな。

押さえ込んでるなら速度制限いらなくね…?と思ったけどゲームバランスのため!そう!バランス!

⑦へすすむ

⑤へもどる

introへ

更新情報をプッシュ通知
させることが出来ます。

よろしければm(__)m

↓この記事をシェア!↓