原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】公転させる、そしてカメラで追いかける

f:id:Karvan:20200211210306p:plain

 

4連休にした

月曜日に有休を取得して4連休となったは良いものの、時間を持て余してサッカーゲームFIFA20でプレミアリーグを1シーズン過ごした皆さんこんにちは。「休みは休むためにあるんだから別に良い」と心の中で言い訳してたら最終日の夕方になってた。

 

公転

それほど頻繁ではないのですが、ゲームを制作しているとオブジェクトを「別のオブジェクトを中心にして」周るような移動をさせたいケースが出てきます。公転運動ってやつですね。

Unityでは標準でTransformに公転移動のメソッドが用意されています。

 

RotateAround(Vector3 中心座標, Vector3 回転軸, float 回転角度)

中心座標にはWorld座標を指定します。
回転軸はVector3で指定しますが、Y軸周りに回すならVector3.up、Z軸周りに回すならVector3.forwardを指定すれば良いです。
回転角度にはdegreeの値で指定します。

 

これをUpdate関数内で実行すれば指定した回転軸周りを回り続けてくれます。

 

f:id:Karvan:20200211203417g:plain

こんな感じ、上の動画ではRotateAroundの公転と同時にtransform.LookAtを使用してカーソルの向きが中心のオブジェクトを向くようにしています。 

// 公転原点オブジェクトのWorld座標取得
Vector3 orbitOrigin = OriginObj.transform.position;

// 公転
transform.RotateAround(orbitOrigin, Vector3.up, Angle*Time.deltatime);

// 公転原点オブジェクトの方を向く
transform.LookAt(OriginObj.transform);

 

このようにオブジェクトを公転させるだけなら簡単に実装できますが、公転しているオブジェクトをカメラで追従させる場合はちょっと工夫が必要です。

 

カメラで追従する

通常、アクションゲームやTPSなどではPlayerの後方(上方)にカメラが設置されていて、Playerの移動に合わせてカメラも移動していきます。

 

この追従処理の簡単な実装方法として、最初にカメラの座標と目標となるオブジェクトの座標の差分(ベクトルの差分)を求めて、

f:id:Karvan:20200211204003p:plain

 

目標オブジェクトが移動するたびに、目標オブジェクトの座標にベクトルの差分を加えてカメラの座標を求める方法があります。

f:id:Karvan:20200211204032p:plain

 

しかしこの方法はあくまで目標オブジェクトが平面上を平行移動する場合のみで、今回のように目標オブジェクトが公転するような場合ではカメラの座標を求めることができません。

何故なら、最初に求めたベクトルの差分はWorld空間での座標系(World座標)でのベクトル差分ですが、公転するオブジェクトを中心に考えた場合、カメラがあるべき位置は公転原点を原点としたLocal空間での座標系(Local座標)での後方(上方)となるので、ベクトルの和算をする前に「ベクトルの差分」の座標を変換する必要があるからです。

 

f:id:Karvan:20200211204146p:plain

90度ぐらい公転した後のカメラ位置、目標オブジェクトのほぼ真横にある。

 

座標の変換

このWorld空間、Local空間での座標の変換(ベクトルの変換)についてもUnityの標準でTransformVectorというメソッドが用意されています。
今回の場合は目標オブジェクトのLocal空間でのベクトル差分をWorld空間のベクトルに変換します。 

Transform Target;

// ベクトル差分をWorld空間のベクトルに変換 Vector3 distance = Target.TransformVector(deltaVector);

 

これを目標オブジェクトの座標に加えたものがカメラの座標となります。

CameraObj.transform.position = Target.position + Target.TransformVector(deltaVector);


後は絶えずカメラが公転原点の方を向くように回転させておけば公転運動するオブジェクトを追従するカメラの動作処理が実装できます。

 

f:id:Karvan:20200211205120g:plain

目標のオブジェクトの公転運動に合わせて、また、前後に移動してもそれに合わせてカメラが追従できていることが分かります。


ちなみに公転運動は原点となるオブジェクトが移動してもそれに合わせて公転することができます。

 

f:id:Karvan:20200211205735g:plain

 

RotateAroundで簡単に公転運動が実装できることは分かりましたが、DOTweenには用意されてないんだよなぁ・・・。

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。