【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を新規作成する場合には下記のスクリプトを使用することができます。
1 |
var vec1 = new Vector3(1.0f, 2.0f, 3.0f); |
引数はx,y,z変数でfloat型です。
また、よく使われるVector3はStatic変数で準備してあります。
主にx,y,z軸を指定する時に使うことが多いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//Vector3(0,0,0) Vector3 v0 = Vector3.zero; //Vector3(1,0,0) Vector3 v1 = Vector3.right; //Vector3(-1,0,0) Vector3 v2 = Vector3.left; //Vector3(0,1,0) Vector3 v3 = Vector3.up; //Vector3(0,-1,0) Vector3 v4 = Vector3.down; //Vector3(0,0,1) Vector3 v5 = Vector3.forward; //Vector3(0,0,-1) Vector3 v6 = Vector3.back; //Vector3(1,1,1) Vector3 v7 = Vector3.one; |
Vector3のxyz変数の変更方法
引数として設定したxyz変数を個別に編集することもできます。
例えば、vec2のx変数を5.0fに変更する場合は以下のように記述します。
1 2 |
var vec2 = new Vector3(1f, 2f, 3f); vec2.x = 5.0f; |
また、Setを使っても編集することができます。下の例は(0,0,0)→(1,1,1)に変更するものです。
1 2 |
<span class="pl-en">Vector3</span> <span class="pl-smi">vec2</span> <span class="pl-k">=</span> <span class="pl-smi">Vector3</span>.<span class="pl-smi">zero</span>; <span class="pl-smi">vec</span>.<span class="pl-en">Set</span>(<span class="pl-c1">1f</span>, <span class="pl-c1">1f</span>, <span class="pl-c1">1f</span>); |
Vector3の様々な関数の使い方
ベクトルの長さを抽出する時はVector3.magnitudeを使用します。
長さはx*x+y*y+z*zの平方根で算出しています。
注意点として、この平方根の計算で比較的重いので、複数のベクトルを比較する場合にはVector3.sqrMagnitudeを使用することをオススメします。
このVector3.sqrMagnitudeは平方根を求める前の値(2乗の大きさ)を返してくれるので、平方根の処理がない分magnitudeより処理が早くなります。
magnitudeで長さを求めるサンプルのスクリプトは以下です。
1 2 3 4 5 6 7 |
public class magSample : MonoBehaviour { void Start() { Vector3 vec3 = new Vector3(1.0f, 2.0f, 3.0f); float length = vec3.magnitude; } } |
sqrMagnitudeで長さを比較するサンプルスクリプトは以下です。
1 2 3 4 5 6 7 8 9 10 11 |
public class sqrMagSample : MonoBehaviour { public float distance = 3.0f; void Start() { Vector3 vec4 = new Vector3(1.0f, 1.0f, 1.0f); float sqrLength = vec4.sqrMagnitude; if(sqrLength < distance * distance){ Debug.Log("原点からvec4までの長さが、原点からdistanceよりも短いです") } } } |
Vector3の回転 – Quaternionを用いて
Vector3を使って回転させたい場合は、Quaterrnionと合わせることで可能です。
回転の方向は、反時計回りが正になります。
例えばvec5をz軸に60度回転するスクリプトは以下です。
1 2 |
Vector3 vec5 = new Vector3.right; var vec5 = Quaternion.Euler (<span class="synConstant">0f</span>, 0<span class="synConstant">f</span>, 60<span class="synConstant">f</span>) * vec5; |
上のように、*を使ってQuaternion*Vector3で回転を表現できます。
Quaternionについては詳しく説明している記事があるので、こちらもご参照ください!
Vector3.Lerpを使ったオブジェクトの移動 – 線形補間
オブジェクトを滑らかに移動させたい場合、Vector3.Lerpを使用する場合があります。
まずLerpの説明をすると、Lerpとは2点を線形補間する関数になります。
線形補間とは、2点を結んだ直線上で2点間にある任意の点を表現することを言います。
書き方は以下になります。
1 |
Vector3.Lerp(a,b,t); |
【引数】
a : 始点となるベクトル位置
b : 終点となるベクトル位置
t : 両端の距離を1とした時の割合(0~1の範囲のみ)
以下のようにあるオブジェクト(Unityちゃん)をある点まで進めたい時に使用します。
スクリプトは以下になります。
スタート地点とゴール地点を設定して、そこまでの距離を算出した上で時間経過でその距離を詰めていく(近づく)というものになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { //スタートとゴールの設定 public Transform StartPosition; public Transform GoalPosition; // スピードの設定 public float speed = 1.0f; //2点間の距離を入れる private float distance_two; void Start() { //二点間の距離を代入 distance_two = Vector3.Distance(StartPosition.position, GoalPosition.position); } void Update() { // 現在の位置 float present_Location = (Time.time * speed) / distance_two; // オブジェクトの移動 transform.position = Vector3.Lerp(StartPosition.position, GoalPosition.position, present_Location); } } |
上のスクリプトを「Move」という名前のC# Scriptを作成し、対象のオブジェクト(例の場合Unityちゃん)にアタッチします。
その後対象のオブジェクトのInspectorで「Start Position」と「Goal Position」に適切なオブジェクトを設定してあげると可能です。
以上のようにLerpは2点間で移動させたい場合に使用してください。
Vector3.Slerpを使ったオブジェクトの移動 – 球面線形補間
オブジェクトを滑らかに移動させたい場合、Slerpを使用する場合もあります。
Slerpとは球面線形補間であり、2点を球面上に存在すると仮定した上で、球面上の2点間のある点を表現するものです。
Lerpとの違いは、2点が直線状に存在するのか、それとも球面上に存在するのかという部分です。
スクリプトは以下になります。
1 |
Vector3.Slerp(a,b,t); |
見て分かるようにLerpとほとんど変わりません。パラメータもLerpと同様になります。
以下の動画がSlerpとLerpの違いになります。(スクリプトはVector3.Lerpで紹介したスクリプトをSlerpに変換して使っています。)
見て分かるように直線で進んでいるか、円を描いて進んでおり、どちらで表現したいかによって使い分けが必要になります。
Lerpによる移動
Slerpによる移動
Vector3とtransform.Rotateでオブジェクトを回転させる
少し応用的な使用方法になるので、実際に利用する際には一部改良してご利用ください。
以下のスクリプトはキー入力をもとに、オブジェクトを回転させるものです。
ゲームでオブジェクトを回転させたい場合に参考になると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Rotation : MonoBehaviour { Rigidbody rigidBody; int speed = 10; void Start() { rigidBody = GetComponent<Rigidbody>(); } void Update() { RotateObject(); } void RotateObject() { //Aキーを押すとZ軸を軸にして時計回りに回転する if (Input.GetKey(KeyCode.A)) { transform.Rotate(Vector3.up * speed); } //Dキーを押すとZ軸を軸にして反時計回りに回転する if (Input.GetKey(KeyCode.D)) { transform.Rotate(Vector3.down * speed); } //Wキーを押すとX軸を軸にして時計回りに回転する if (Input.GetKey(KeyCode.W)) { transform.Rotate(Vector3.right * speed); } //Sキーを押すとX軸を軸にして時計回りに回転する if (Input.GetKey(KeyCode.S)) { transform.Rotate(Vector3.left * speed); } } } |
上のスクリプトをUnityちゃんにアタッチしてみました。
こういう感じでキー入力に合わせて自由に回転させることができます。
まとめ
今回はVector3の基本的な使い方から様々な関数、使用例について説明しました。
Vector3の概念はUnityでのゲーム作成で必ず使用するものなので、是非この記事を参考に色々と作れるようになれば嬉しいです。
他にもUnityに関する様々な記事を作っているので、興味がある方は是非ごらんください。
参考記事→)【Unity入門】ゲーム開発ができるようになる基礎知識まとめ
また、記事の中でUnityちゃんを使用していますが、Unityちゃんの使い方などもまとめているので、よかったらご参考ください。
参考記事→)Unityちゃん(Unity-Chan)をノンプログラミングで動かす!【初心者向け】
本記事はユニティちゃんライセンス条項の元に提供されています。
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!