【Unity】Vector3の使い方とオブジェクトの移動や回転を表現する方法


Unityを触っているとVector3を使用する機会が非常に多いです。

しかし、色々な関数や使用方法がありしっかりと理解できていない人も多いのではないでしょうか。

そこで、今回はVector3についての詳しい関数の使い方や具体的な使用例を交えながら、Vector3への理解を一層深めることになれば幸いです。

Vector3とは

Vector3を公式リファレンスから引用すると

3D ベクトルと位置の表現

This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doing common vector operations.

(このストラクチャーはUnityで3Dの位置や方向を表現するために使います。一般的なベクトル演算を実行するための関数も含まれています。)

other classes can be used to manipulate vectors and points as well. For example the Quaternion and the Matrix4x4classes are useful for rotating or transforming vectors and points.

(他のクラスを使ってベクトルや点を操作することもできます。 たとえば、QuaternionクラスとMatrix4x4クラスは、ベクトルや点の回転や変換に役立ちます。)

となっています。

簡単に言うと、Vector3は「方向」と「大きさ」の成分を持っており、Unityでは「位置」と「方向」を指定したい時、つまり主にオブジェクトの移動や回転の時に使います。

Vector3の基本的な作成方法

ここからはVector3の作成方法や関数の使い方を説明していきます。

Vector3の作成方法 – new Vector3(x,y,z)

Vector3を新規作成する場合には下記のスクリプトを使用することができます。

引数はx,y,z変数でfloat型です。

また、よく使われるVector3はStatic変数で準備してあります。

主にx,y,z軸を指定する時に使うことが多いです。

Vector3のxyz変数の変更方法

引数として設定したxyz変数を個別に編集することもできます

例えば、vec2のx変数を5.0fに変更する場合は以下のように記述します。

また、Setを使っても編集することができます。下の例は(0,0,0)→(1,1,1)に変更するものです。

Vector3の様々な関数の使い方

ベクトルの長さを扱う場合 – Vector3.magnitudeとVector3.sqrMagnitude

ベクトルの長さを抽出する時はVector3.magnitudeを使用します。

長さはx*x+y*y+z*zの平方根で算出しています。

注意点として、この平方根の計算で比較的重いので、複数のベクトルを比較する場合にはVector3.sqrMagnitudeを使用することをオススメします。

このVector3.sqrMagnitudeは平方根を求める前の値(2乗の大きさ)を返してくれるので、平方根の処理がない分magnitudeより処理が早くなります。

magnitudeで長さを求めるサンプルのスクリプトは以下です。

sqrMagnitudeで長さを比較するサンプルスクリプトは以下です。

Vector3の回転 – Quaternionを用いて

Vector3を使って回転させたい場合は、Quaterrnionと合わせることで可能です。

回転の方向は、反時計回りが正になります。

例えばvec5をz軸に60度回転するスクリプトは以下です。

上のように、*を使ってQuaternion*Vector3で回転を表現できます。

Quaternionについては詳しく説明している記事があるので、こちらもご参照ください!

【Unity】Quaternionでオブジェクトを回転させる方法

Vector3.Lerpを使ったオブジェクトの移動 – 線形補間

オブジェクトを滑らかに移動させたい場合、Vector3.Lerpを使用する場合があります。

まずLerpの説明をすると、Lerpとは2点を線形補間する関数になります。

線形補間とは、2点を結んだ直線上で2点間にある任意の点を表現することを言います。

書き方は以下になります。

【引数】
a : 始点となるベクトル位置
b : 終点となるベクトル位置
t : 両端の距離を1とした時の割合(0~1の範囲のみ)

以下のようにあるオブジェクト(Unityちゃん)をある点まで進めたい時に使用します。

スクリプトは以下になります。

スタート地点とゴール地点を設定して、そこまでの距離を算出した上で時間経過でその距離を詰めていく(近づく)というものになります。

上のスクリプトを「Move」という名前のC# Scriptを作成し、対象のオブジェクト(例の場合Unityちゃん)にアタッチします。

その後対象のオブジェクトのInspectorで「Start Position」と「Goal Position」に適切なオブジェクトを設定してあげると可能です。

以上のようにLerpは2点間で移動させたい場合に使用してください。

Vector3.Slerpを使ったオブジェクトの移動 – 球面線形補間

オブジェクトを滑らかに移動させたい場合、Slerpを使用する場合もあります。

Slerpとは球面線形補間であり、2点を球面上に存在すると仮定した上で、球面上の2点間のある点を表現するものです。

Lerpとの違いは、2点が直線状に存在するのか、それとも球面上に存在するのかという部分です。

スクリプトは以下になります。

見て分かるようにLerpとほとんど変わりません。パラメータもLerpと同様になります。

以下の動画がSlerpとLerpの違いになります。(スクリプトはVector3.Lerpで紹介したスクリプトをSlerpに変換して使っています。)

見て分かるように直線で進んでいるか、円を描いて進んでおり、どちらで表現したいかによって使い分けが必要になります。

Lerpによる移動

Slerpによる移動

 

 

 

Vector3とtransform.Rotateでオブジェクトを回転させる

少し応用的な使用方法になるので、実際に利用する際には一部改良してご利用ください。

以下のスクリプトはキー入力をもとに、オブジェクトを回転させるものです。

ゲームでオブジェクトを回転させたい場合に参考になると思います。

上のスクリプトをUnityちゃんにアタッチしてみました。

こういう感じでキー入力に合わせて自由に回転させることができます。

まとめ

今回はVector3の基本的な使い方から様々な関数、使用例について説明しました。

Vector3の概念はUnityでのゲーム作成で必ず使用するものなので、是非この記事を参考に色々と作れるようになれば嬉しいです。

他にもUnityに関する様々な記事を作っているので、興味がある方は是非ごらんください。

参考記事→)【Unity入門】ゲーム開発ができるようになる基礎知識まとめ

また、記事の中でUnityちゃんを使用していますが、Unityちゃんの使い方などもまとめているので、よかったらご参考ください。

参考記事→)Unityちゃん(Unity-Chan)をノンプログラミングで動かす!【初心者向け】

ユニティちゃんライセンス

本記事はユニティちゃんライセンス条項の元に提供されています。


この記事はいかがでしたか?よければシェアをお願いします。

A-kun

株式会社x garden CGO(Chief Growth Officer) Unityエンジニアとして日々Unityと奮闘中 自他共に認めるゲーマー Splatoon最高記録:世界6位(リグマペア) ApexLegends最高記録:5連チャンピオン