UnityのVector3の使い方【スクリプト解説】

script thumbnail

このページはUnityのVector3について解説していきます。

<Vector3とは>

3つの数字を表すのに使用されます。

本来はX,Y,Zから成るベクトルを表すものなのですが、3つであれば何でもよく、位置だったり、ベクトルだったり、行列だったり、色だったり、様々なものに使用されます。

Vector3

X,Y,Zからなる3つの数字を扱う構造体

<注意!>
C#のVector3とは別物です。(機能としてはほぼ一緒だけど)
その為、関数名とか変数名とかが微妙に違うので注意してください。

・UnityEngine.Vector3
・System.Numerics.Vector3

という2種類のVector3が存在します。

using System.Numerics;

とさえ書かなければ混合することはないと思いますので、特別何かしなければUnity側のVector3を使用していると思ってください。また、このサイト以外で使用方法を検索される際にはC#のVector3なのかUnityのVector3なのか混同しないよう注意してください。

<Vector3のスクリプトの使い方>

名前空間UnityEngine
struct
クリックすると展開します

back

後ろを表します。Vector3(0, 0, -1)と同じ意味です。

新たにVector3をnewするより早いのでよく使用されます。

型 Vector3型

○ 使い方
後ろ向きの方向を取りたい時に使用します。ただし、ゲームオブジェクトの後ろではなく、ワールド空間での後ろである点について注意してください。

//ゲームオブジェクトをワールド座標で後ろの方向に移動させる
transform.position += Vector3.back;

down

下を表します。Vector3(0, -1, 0)と同じ意味です。

新たにVector3をnewするより早いのでよく使用されます。

型 Vector3型

○ 使い方
下向きの方向を取りたい時に使用します。ただし、ゲームオブジェクトの下ではなく、ワールド空間での下である点について注意してください。

//ゲームオブジェクトをワールド座標で下の方向に移動させる
transform.position += Vector3.down;

forward

前を表します。Vector3(0, 0, 1)と同じ意味です。

新たにVector3をnewするより早いのでよく使用されます。

型 Vector3型

○ 使い方
前向きの方向を取りたい時に使用します。ただし、ゲームオブジェクトの前ではなく、ワールド空間での前である点について注意してください。

//ゲームオブジェクトをワールド座標で前の方向に移動させる
transform.position += Vector3.forward;

left

左を表します。Vector3(-1, 0, 0)と同じ意味です。

新たにVector3をnewするより早いのでよく使用されます。

型 Vector3型

○ 使い方
左向きの方向を取りたい時に使用します。ただし、ゲームオブジェクトの左ではなく、ワールド空間での左である点について注意してください。

//ゲームオブジェクトをワールド座標で左の方向に移動させる
transform.position += Vector3.left;

negativeInfinity

マイナス無限を表します。

Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity)と同じ意味です。

型 Vector3型

○ 使い方
マイナスの無限を使用したい場合に使用します。ゲームオブジェクトを一時的に消したいけどメモリには残しておきたい、スクリプトは動かしておきたいなどの時にゲームオブジェクトをアクティブ状態を保ちつつ遥か彼方に追放するなど、少し変わった用途で使われることが多いです。

//ゲームオブジェクトを遥か彼方に追放します。(すぐに元に戻すならSetActive(false)にするより早い為)
transform.position = Vector3.negativeInfinity;

one

1を表します。Vector3(1, 1, 1)と同じ意味です。

新たにVector3をnewするより早いのでよく使用されます。

型 Vector3型

○ 使い方
計算に使われることが多いです。Vector3.one * ○○ など、newして確要素にわざわざ書くより簡単で短く書くことができるので便利な変数として使用されます。

//ゲームオブジェクトの大きさを1.1倍にします。
transform.localScale = Vector3.one * 1.1f;

positiveInfinity

無限を表します。

Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity)と同じ意味です。

型 Vector3型

○ 使い方
無限を使用したい場合に使用します。ゲームオブジェクトを一時的に消したいけどメモリには残しておきたい、スクリプトは動かしておきたいなどの時にゲームオブジェクトをアクティブ状態を保ちつつ遥か彼方に追放するなど、少し変わった用途で使われることが多いです。

//ゲームオブジェクトを遥か彼方に追放します。(すぐに元に戻すならSetActive(false)にするより早い為)
transform.position = Vector3.positiveInfinity;

right

右を表します。Vector3(1, 0, 0)と同じ意味です。

新たにVector3をnewするより早いのでよく使用されます。

型 Vector3型

○ 使い方
右向きの方向を取りたい時に使用します。ただし、ゲームオブジェクトの右ではなく、ワールド空間での右である点について注意してください。

//ゲームオブジェクトをワールド座標で右の方向に移動させる
transform.position += Vector3.right;

up

上を表します。Vector3(0, 1, 0)と同じ意味です。

新たにVector3をnewするより早いのでよく使用されます。

型 Vector3型

○ 使い方
上向きの方向を取りたい時に使用します。ただし、ゲームオブジェクトの上ではなく、ワールド空間での上である点について注意してください。

//ゲームオブジェクトをワールド座標で上の方向に移動させる
transform.position += Vector3.up;

zero

ゼロを表します。Vector3(0, 0, 0)と同じ意味です。

新たにVector3をnewするより早いのでよく使用されます。

型 Vector3型

○ 使い方
何かしら3つの数字で表されたものを初期化したりする時に使われたりします。

//ゲームオブジェクトの位置をワールド座標で(0,0,0)に移動させる
transform.position = Vector3.zero;

magnitude

ベクトルの長さを表します。

読み取り専用です。(x2+y2+z2) の平方根を返します。

型 float型

○ 使い方
ベクトルの長さを測る為に使用するので計算の様々なところで使用します。かなり使用頻度の高い変数なので覚えておきましょう。Unityではよく距離を表すのに使用されます。

Debug.Log("このオブジェクトは原点から" + transform.position.magnitude + "の距離にいます。");

normalized

ベクトルの長さ1の状態になるように正規化します。

ベクトルが短すぎる場合0ベクトルが返ります。読み取り専用です。

型 Vector3型

○ 使い方
ベクトルを正規化したい場合に使用します。正規化した値は様々な計算で使用することがあるので覚えておきましょう。Unityではよくベクトルの方向を表すのに使われます。

Debug.Log("このオブジェクトは原点から見て"+ transform.position.normalized +"の方角に存在します。");

sqrMagnitude

ベクトルの 2 乗の長さを返します。

読み取り専用です。x2+y2+z2を返します。

型 float型

○ 使い方
magnitudeを使うより早い為、わざとこちらを使用して、比較対象の方を2乗することが多いです。計算過程で平方根を省いても大丈夫だったりする場合によく使われます。

if(transform.localPosition.sqrMagnitude <= 2*2)
{
 Debug.Log("このオブジェクトは親オブジェクトから距離2以内にいます);
}

配列[]

x,y,zを配列からアクセスできます。

Vector3の各要素を格納する配列です。
[0]=x,[1]=y,[2]=zです。

型 float型

○ 使い方
forループ内で使用するなど配列の強みが生きやすいところで使われます。いちいちx,y,zと指定しなくていい便利機能です。

//ゲームオブジェクトの現在位置を各種値ごとにログに出します。
for(int i = 0; i < 3; ++i)
{
 Debug.Log(transform.position[i]);
}

x,y,z

Vector3の各種要素です。

読み取り専用です。

型 float型

○ 使い方
各種要素の読み書きができる為、非常によく使う変数です。x,y,zの数値を直接変えたい時に便利です。

//現在のx座標をログに表示します。
Debug.Log(transform.position.x);

1. xに入る値(float)
2. yに入る値(float)
3. zに入る値(float)

1. xに入る値(float)
2. yに入る値(float)

引数2の入れ方をした場合、zは0として扱われます。

○ 使い方
new した時に値を突っ込みます。

//Vector3を生成します。
Vector3 v = new Vector3(1.1f,1.1f,1.1f);

Equals

このVector3と等しいのか比較します。

==とほぼ同じですが、計算の方法が違います。

Vector3の各要素はfloat型のため、比較する際に計算時の誤差により本来「等しいとしたい値」が等しくないものとして扱われることがあります。

==の方が計算精度が粗く、Equalsの方がやや精度が高いです。つまり、このEqualsを使うと「ほぼ同じ」でもfalseになる可能性もあります。

1. 比較対象 : object型

戻り値(返り値)

等しいかどうか : bool型

○ 使い方
あまり使わない方がいい関数です。ビシッと同じになる場合はいいですが、計算途中で割り算など無限少数が発生するものを使っている場合は非奨励です。自分でしきい値を決めて、C#を拡張した方がいい気がします。

//基本的に非奨励な比較。
if(transform.position.Equals(Vector3.one))
{
 Debug.Log("このオブジェクトは1,1,1の位置にいます");
}

Set

このVector3に値をセットします。新たにnewして代入するより早い為、値を変える際はこれを使うことが多いです。

1. x : float型
2. y : float型
3. z : float型

戻り値(返り値)

なし

○ 使い方
すでにインスタンス化されているVector3に対して値を入れたい時に使用すると便利です。Update毎に値を破棄して更新する場合、newで突っ込むより、これで値を上書きした方がメモリとCPUに優しいです。

それとあまり知られていませんが、transform.positionの値を直弄りできない為、transform.position = new Vector3(x,y,z);
としがちですが、Setを使用するといいと思います。

transform.position.Set(1.1f,1.1f,1.1f);

ToString

(x,y,z)が文字列で返ってきます。()もついてきます。

なし

戻り値(返り値)

string型に直したVector3 : string型

○ 使い方
主にログに値を表示したい時に使用します。

Debug.Log(transform.position.ToString());

Angle

2つのベクトルの角度を求めます

1. 基準となるベクトル : Vector3型
2. 目標となるベクトル : Vector3型

戻り値(返り値)

2つのベクトルの角度 : float型

○ 使い方
2つのベクトルの角度を求めたい時に使用します。例えばオブジェクトの向きの角度などを求めることができます。

float f = Vector3.Angle(transform.forward,目標となるゲームオブジェクト.transform.forward);
//0度で同じ方向を向いているので、誤差5度くらいの余裕を持つと
if(f > -5.0f && f < 5.0f)
{
  Debug.Log("2つのオブジェクトはだいたい同じ向きを向いています");
}

ClampMagnitude

ベクトルの長さを指定し、その長さを越えるベクトルを指定した長さにして返します。

1. 元となるベクトル : Vector3型
2. ベクトルの長さ : float型

戻り値(返り値)

指定した長さ以下のベクトル : Vector3型

○ 使い方
ベクトルの長さを調整したい場合に使用します。これ以上進んで欲しくないとか制限をかけたい場合などに使用するといいと思います。

//オブジェクトの位置を原点から1.1以上離れないようにする
Vector3 v = Vector3.ClampMagnitude(transform.position,1.1f);
transform.position = v;

Cross

2つのベクトルの外積です。

1. 外積をA→×B→とするとA→のベクトル : Vector3型
2. 外積をA→×B→とするとB→のベクトル : Vector3型

戻り値(返り値)

2つのベクトルの外積 : Vector3型

○ 使い方
ベクトルの外積を求めたい場合に使用します。外積は例えば、法線ベクトルを計算して出す場合などに使用します。また、2つベクトルと垂直方向を求めたい時など、色々な事に使われます。

//自身と目標となるゲームオブジェクトに対して垂直な方向を求めます。
Vector3 v = Vector3.Cross(transform.position,目標となるゲームオブジェクト.transform.position).normalized;

Distance

2つのベクトルの距離を求めます。

これは(基準となるベクトルー目標となるベクトル).magnitudeと書くのと同じです。

1. 基準となるベクトル : Vector3型
2. 目標となるベクトル : Vector3型

戻り値(返り値)

2つのベクトルの距離 : float型

○ 使い方
2つのベクトルの距離を求めたい場合に使用します。オブジェクト同士の距離を求めたい場合などに便利です。

//オブジェクト同士の距離を求めます。
float f = Vector3.Distance(transform.position,目標となるゲームオブジェクト.transform.position);

Dot

2つのベクトルの内積です。

1. ベクトル1 : Vector3型
2. ベクトル2 : Vector3型

戻り値(返り値)

2つのベクトルの内積 : float型

○ 使い方
2つのベクトルの内積を求めたい場合に使用します。物理演算などである一定の方向に対する力の大きさなどを求めたい場合に使用します。

float f = Vector3.Dot(transform.position,Vector3.forward);
Debug.Log("このオブジェクトは前方向のみの移動で考えると" + f + "進んでいます。");

Lerp

2つのベクトルを0〜1の間で補間し、正規化します。

1. 基準となるベクトル : Vector3型
2. 目標となるベクトル : Vector3型
3. 0〜1の補間係数 : float型

戻り値(返り値)

2つのベクトルを0〜1の間で補間し、正規化した値 : Vector3型

○ 使い方
2つのベクトルの間の位置を取りたい場合に便利です。また、Update内で使う事によって、最初速く、目標に近くにつれてゆっくりになるなどの表現が可能です。

//自分を目標となるゲームオブジェクトに現在の位置から10%近づけます。
Vector3 v = Vector3.Lerp(trasform.position,目標となるゲームオブジェクト.transform.position,0.1f);
transform.position = v;

LerpUnclamped

2つのベクトルを補間し、正規化します。この時、補間は1以上を指定することができます。1以上を指定すると目標のベクトルを通り過ぎます。例えば2を入れると基準から目標へのベクトルの2倍の長さのベクトルになります。

1. 基準となるベクトル : Vector3型
2. 目標となるベクトル : Vector3型
3. 補間係数 : float型

戻り値(返り値)

2つのベクトルを補間し、正規化した値 : Vector3型

○ 使い方
2つのベクトルの間の位置を取りたい場合に便利です。また、Update内で使う事によって、最初速く、目標に近くにつれてゆっくりになるなどの表現が可能です。

//自分を目標となるゲームオブジェクトに現在の位置から110%近づけます。
//(目標のゲームオブジェクトを10%通り過ぎます)
Vector3 v = Vector3.LerpUnclamped(trasform.position,目標となるゲームオブジェクト.transform.position,1.1f);

Max

2つのベクトルの各成分を比較して、各成分の大きい方を取得した新たなベクトルを生成します。

1. ベクトル1 : Vector3型
2. ベクトル2 : Vector3型

戻り値(返り値)

各成分の大きい方を取得した新たなベクトル : Vector3型

○ 使い方
2つのベクトルの大きい成分を取得したい場合に使用します。

Vector3 v = Vector3.Max(Vector3.right,Vector3.up);
//vは(1,1,0)になる

Min

2つのベクトルの各成分を比較して、各成分の小さい方を取得した新たなベクトルを生成します。

1. ベクトル1 : Vector3型
2. ベクトル2 : Vector3型

戻り値(返り値)

各成分の小さい方を取得した新たなベクトル : Vector3型

○ 使い方
2つのベクトルの小さい成分を取得したい場合に使用します。

Vector3 v = Vector3.Max(Vector3.right,Vector3.up);
//vは(0,0,0)になる

MoveTowards

基準となる位置から特定の位置へ向かうベクトルと生成します。最高移動距離を設定でき、それ以上は移動しません。短い距離を指定してUpdateで呼べば移動を表現できます。また、最高移動距離にマイナスの値を入れると反対方向に向かいます

1. 基準となる位置ベクトル : Vector3型
2. 目標となる位置ベクトル : Vector3型
3. 最高移動距離 : float型

戻り値(返り値)

基準となる位置から特定の位置へ向かうベクトル : Vector3型

○ 使い方
基準となる位置から特定の位置へ向かうベクトルを取得したい場合に使用します。これで得た値を掛け算する事によって、現在地から目標までの区間を表すことができます。

Vector3 v = Vector3.MoveTowards(trasform.position,目標となるゲームオブジェクト.transform.position,1.1f);
for(int i = 0; i < 10; ++i)
{
  //現在地から目標までの位置を10分割します
  Debug.Log(v * 0.1f * i);
}

Normalize

ベクトルの長さ1の状態になるように正規化します。

ベクトルが短すぎる場合0ベクトルが返ります。

1. 正規化したいベクトル : Vector3型

戻り値(返り値)

長さを1に正規化されたベクトル : Vector3型

○ 使い方
ベクトルの長さが1であるということは計算する際に便利なので、様々なところで使用します。例えば内積の計算などで片方のベクトルを1にすれば他のベクトルがその方向にどれだけの成分があるか調べることができます。

//原点から見た自分自身の方向です。
Vector3 v = Vector3.Normalize(transform.position);

OrthoNormalize

渡したベクトルを正規化し、それと直行する単位ベクトルとそれら2つの外積を返します。

OrthoNormalize Vector

1. 正規化したいベクトル : Vector3型(参照渡し)
2. 直交する単位ベクトルが入るVector3 : Vector3型(参照渡し)

引数2
1. 正規化したいベクトル : Vector3型(参照渡し)
2. 直交する単位ベクトルが入るVector3 : Vector3型(参照渡し)
3. ↑2つの外積が入るVector3 : Vector3型(参照渡し)

戻り値(返り値)

なし

○ 使い方
一つのベクトルから3つの直交する単位ベクトルを取得することができる便利な関数です。オブジェクトの3方向ならtransform.up,right,forwardで取得できる為、主に計算上で使用します。

//自身の位置ベクトルに対する直交ベクトルとその外積を求めます
Vector3 orthogonal = new Vector3();
Vector3 cross = new Vector3();
Vector3.OrthoNormalize( ref transform.position, ref orthogonal, ref cross);

Project

あるベクトルを指定した方向に投影したベクトルを返します。

Project Vector

1. 投影したいベクトル : Vector3型
2. 指定したい方向 : Vector3型

戻り値(返り値)

投影されたベクトル : Vector3型

○ 使い方
あるベクトルを別の方向に向けたい場合に便利です。

//自身の位置ベクトルの斜め成分を取り出します。
Vector3 v = Vector3.Project(transform.position,Vector3.one);

ProjectOnPlane

あるベクトルを面にそわせるように変換します

1. 面にそわせたいベクトル : Vector3型
2. 面の法線ベクトル : Vector3型

戻り値(返り値)

面にそったベクトル : Vector3型

○ 使い方
あるベクトルを面の接線に変換することができます。

Vector3 v = Vector3.ProjectOnPlane(transform.position,Vector3.up);

Reflect

あるベクトルを面から反射した方向に変換します

1. 反射させたいベクトル : Vector3型
2. 面の法線ベクトル : Vector3型

戻り値(返り値)

反射したベクトル : Vector3型

○ 使い方
あるベクトルを面に対して反射したベクトルに変換することができます。単純に跳ね返りの計算でよく使用すると思います。

//地面に対するバウンド方向
Vector3 v = Vector3.Reflect(transform.forward,Vector3.up);

RotateTowards

あるベクトルを指定したベクトルに向かって回転と移動します。

Rotateと書いてあるので回転だけをイメージしがちですが、移動も考慮に入れられている関数です。

1. 基準となるベクトル : Vector3型
2. 目標となるベクトル : Vector3型
3. 最大回転角度 : float型
4. ベクトルの最大の大きさ : float型

引数3と引数4ですが、3は2つのベクトル間の最大角度になるので、回転速度を制限できます。

4はベクトルの最大の大きさなので0にすると2つのベクトルの方向が同じになった時、基準となるベクトルと同じベクトルが返されます。

TransformのRotateTowardsとは使い方が少し違うので注意が必要です。引数4を0にするとTransformのRotateTowardsと同じになります。

戻り値(返り値)

目標となるベクトルに向けて回転・移動を行ったベクトル : Vector3型

○ 使い方
主に、Update内などで少しずつ角度を変えていくなどする場合に使用します。

//斜め向きに少しずつ変えてみます。
void Update()
{
  Vector3 v = Vector3.RotateTowards(transform.position,transform.position + Vector3.one, Time.deltaTime,Time.deltaTime);
  transform.position = v;
}

Scale

Vector3の各成分(x,y,z)を乗算します。引数が1つなら2乗になり、2つにするとその2つの各成分を乗算します。

1. 2乗したいVector3 : Vector3型

1. 乗算したいVector3 : Vector3型
2. 乗算したいVector3 : Vector3型

戻り値(返り値)

各成分ごとに乗算されたVector3 : Vector3型

○ 使い方
各要素を乗算したい場合に使用します。内積も外積でもない点に注意してください。

//ベクトルのx成分とz成分だけ取り出します。
Vector3 v = Vector3.Scale(transform.position,new Vector3(1,0,1));

SignedAngle

ベクトルを指定した回転軸に沿って、目標のベクトルへ回転させます。

1. 基準となるベクトル : Vector3型
2. 目標となるベクトル : Vector3型
3. 回転軸 : Vector3型

戻り値(返り値)

回転後のベクトル : Vector3型

○ 使い方
ベクトルの回転軸を指定して回転できるので非常に直感的に使用できます。ベクトルを回転させたい時に便利です。

//自身の向きを目標となるゲームオブジェクトに向けます。
Vector3 v = Vector3.SignedAngle(transform.forward,目標となるゲームオブジェクト.transform.position,Vector3.up);
transform.position = v;

Slerp

2つのベクトルを0〜1の間で補間し、正規化します。

これは球面線形補間です。

1. 基準となるベクトル : Vector3型
2. 目標の回転 : Vector3型
3. 0〜1の補間係数 : float型

戻り値(返り値)

球面線形補間されたベクトル : Vector3型

○ 使い方
回転的な表現をするのに使えます。

//目標のベクトルに対して球面線形補間します。
Vector3 v = Vector3.Slerp(transform.position,目標のゲームオブジェクト.transform.position,0.1f);

SlerpUnclamped

2つのベクトルを補間し、正規化します。

これは球面線形補間です。

この時、補間は1以上を指定することができます。1以上を指定すると目標のベクトルを通り過ぎます。例えば2を入れると基準から目標へのベクトルの2倍の距離を表します。

1. 基準となるベクトル : Vector3型
2. 目標の回転 : Vector3型
3. 補間係数 : float型

戻り値(返り値)

球面線形補間されたベクトル : Vector3型

○ 使い方
回転的な表現をするのに使えます。目標を通り過ぎる可能性がある時はこれを使うと便利です。

//目標のベクトルに対して球面線形補間します。
Vector3 v = Vector3.SlerpUnclamped(transform.position,目標のゲームオブジェクト.transform.position,1.1f);

SmoothDamp

現在地から目的地へ向かうまでの間の位置ベクトルを返します。この位置ベクトルは目的地に辿り着くまでの時間から計算されます(0を入れると目的地が返る)また、参照渡しで速さを得ることもできます。

1. 現在地 : Vector3型
2. 目的地 : Vector3型
3. 現在の速度を入れるVector3 : Vector3型(参照渡し)
4. 目的地に辿り着くまでの時間 : float型
5. 最大速度 : float型(デフォルト引数 Mathf.Infinity)
6. 経過時間 : float型(デフォルト引数 Time.deltaTime)

戻り値(返り値)

現在地から目的地へ向かうまでの間の位置ベクトル : Vector3型

○ 使い方
移動を表現するのに便利です。たくさんのパラメーターを取り扱えるので、様々な情報をいっぺんに取り扱いたいとき便利です。

//目標のゲームオブジェクトまで移動します。
void Update()
{
 Vector3 velocity = new Vector3();
 Vector3 v = Vector3.SmoothDamp(transform.position,目標のゲームオブジェクト.transform.position,ref velocity,1.0f,Time.deltaTime);
 transform.position = v;
}

Static変数や関数、コンストラクタなどがよくわからない方は↓の記事を参考にしてみてください




タイトルとURLをコピーしました