Unityでよく見るVector3型って何者ね? という時に読む記事
Unityで非常によく使う『Vector3』型。同じようにVector2型やVector4型があったり、果てはVector2Int型やVector3Int型なんてのもあったりします。
今でこそ便利さを噛み締めて使いまくっているのですが、初心者の頃は正直「なんだこれ……」と戸惑ったので、このページでは初心者向けに簡単にまとめてみることにしました。
環境
macOS 10.15 Catalina
Unity2019.4.4f1
参考文献
公式のスクリプトリファレンスにも記載があるので合わせてご覧ください。
Vector3型とは
Vector3型は3つのfloat型の値をまとめて保持できる型のことで、主に位置ベクトルを表すのに使います。UnityEngineの名前空間の下に定義されているUnity独自の型です。
例えば以下のように3つの値を保持していて、それぞれx, y, zの変数を使って中身にアクセスできます。
3次元の位置を表すために使われていて、X座標、Y座標、Z座標のそれぞれの値を持てるんですね。なのでx成分にアクセスするときはmyVector.x、y成分にアクセスするときはmyVector.y、という感じで値を取り出しています。
よく使う例としてはゲームオブジェクトのtransform.positionがあります。これはゲームオブジェクトの位置を表しているもので、3次元空間のシーンの中でどこにいるかを表しているんです。transform.positionはVector3型なので、ゲームオブジェクトの位置に関してX座標ではどの位置、Y座標ではどの位置、なんて感じで値をまとめて持っています。
インスペクターウィンドウでは以下のように表示されます。画像の中で緑色で強調している部分がtransform.positionです。3つの値を持っていて、それぞれの値をセットできるようになっています。
同様に、成分が2つのVector2型だったり、成分が4つのVecot4型もあります。表したい情報に応じて必要な数の成分を持った型を使うとグッド。
Vector2型、Vector3型には類似の型としてVector2Int型、Vector3Int型があります。『Int』とついていることから分かるように、こちらはint型の値を複数セットで保持することができます。
シーン内のオブジェクトの位置を扱うというよりは、論理的なマス目を扱うイメージかもしれません。例えば3DダンジョンRPGでキャラクターのいる地図上の位置に関して「お城から北に5歩、東に10歩の位置にいます。」みたいな感じで座標を表すすのに便利です。私が公開している3DダンジョンRPGのダンジョン部分を作れるアセットでもVector2Int型を使って座標を表現しています。
複数の値をまとめて扱いたい時に便利
2次元的な位置、3次元的な位置を表す時に便利なVector2やVector3ですが、数値をセットで扱いたい時には位置に限らず使えます。
例えばあるメソッドに2つの値を渡して、平均値と差分を返して欲しい場合にはVector2を使って2つの値をひとつのメソッドで取得することができます。
もっとこの例を具体化してみると、中心が同じ位置にある円(同心円)が2つあったとします。2つの円の半径の平均値を取ることで2つの円の中央を通る円の半径が求められますし、差分を取ることでどの範囲を塗りつぶすのかを求めることができます。イメージとしてはドーナツの食べられる部分を塗りつぶすような感じです。
あるいはRPGのダメージ計算で、攻撃力と防御力から導き出された基本ダメージ量を入力して、メソッドの中で乱数による最小ダメージ量と最大ダメージ量を計算してセットで返すこともできます。
基本は位置の計算で使うと便利ですが、値のセットとして使う方法もあるので使い方を考えてみるのも楽しいです。
Vector3型を使ってできること
Vector3型では以下のような機能があります。基本は位置ベクトルを表すことなので、高校数学でやったベクトルの計算が用意されています。ここではVector3型をメインに紹介しますが、Vector2型やVector4型でも同じようなことができます。
向きと大きさを確認できる
ベクトル言えば向きと大きさを持った値です。Vector3型ではこれらの値を取得することができます。
向きを取得する、と表現していますが、厳密に言えば正規化されたベクトルを取得しています。normalizedの変数にアクセスすると大きさが1のベクトルを返してくれます。正規化(normalize)とは物理や数学で出てくる言葉で、基準となる値を計算することです。基準となる値があると、色々と計算しやすいんですよね。
例えば主人公の位置からnormalizedを使って向きを持っていて大きさが1のベクトルを取得したとします。原点から主人公を結んだ直線上での距離を表すことができるので、同じ直線上で2メートル先に魔法のエフェクトを再生する、みたいな感じで距離を表しやすくなります。
ベクトルの大きさも変数から取得できて、magnitude(マグニチュード)の変数を使います。ベクトルの大きさは各成分を2乗したものを足し合わせて、その平方根の絶対値を取ることで計算できます。これを手計算で毎回やるのは大変なので簡単に取得できるようになっています。
距離を取得できる
2つのベクトルを使って距離を取得することができます。
上の例では、主人公オブジェクトの位置(playerVector)と敵キャラオブジェクトの位置(enemyVector)の位置を使って距離を計算しています。Vector3型のDistance()メソッドを使うことでfloat型で距離を返してくれます。
オブジェクトの距離を計算する場面は結構あるように思います。一定の距離まで近づいたら敵キャラが索敵モードから警戒モードに変わる、みたいな動きもできるので応用できる場面は多々あります。
私が前に作ったゲームでは、範囲内の敵キャラのうち一番近い敵キャラをターゲットにして攻撃する、みたいな動きを実装したことがあります。
徐々に値を変化させられる
Update()やコルーチンを使ってフレームごとに値を変化させたい時に便利なのがLerp()メソッドです。例えば以下のコードではUpdate()を使ってこのスクリプトをアタッチしたゲームオブジェクトを+X方向に移動させています。
ゲームを実行してみると以下のように黄色いゲームオブジェクトが画面右方向に移動します。指定された秒数の間、このオブジェクトのtransform.positionの値を変化させ続けています。
Lerp()メソッドでは開始点と終了点を線で結んで、時間経過の割合(0から1)を第3引数にセットすることで割合に応じた位置を返してくれます。
LerpはLinear Interpolationの略で線形補間を意味します。いまだに発音がわかっていないのですが、ネイティブが発音するサイトで聞いてみると「ラープ」のように聞こえます。発音次第でお互いに「?」となることもあるかもしれないので、間違いないようにするなら普通に線形補間と言ってもいいかも。
他にも色々
ベクトルなので内積や外積を計算するメソッドもありますし、平面に対して反射するベクトルを返してくれるメソッドもあります。
数学的な計算にも便利なので、高校数学や物理数学を思い出しながらスクリプトリファレンスを眺めてみると使い道も思い浮かんでくるかもしれません。
まとめ
このページではUnityでよく使うVector3型を中心に、ベクトルとして使う型について紹介しました。C#の組み込み型ではなくてUnityエンジンで定義している型なので最初は「なんだろうこれ」みたいな感じで興味を持っていくところから始まるかもしれません。
ベクトルの名前が出てきたことで高校数学の話を思い出すようでちょっと勉強めいていますが、高校数学や高校物理の話は知っているとゲーム開発に有利です。
このページで紹介したVector3型は複数の値をまとめて保持できて、主に位置を表すのに使う、なんて感じで覚えておくだけでも恐怖感は薄れていくと思うので、恐れず使ってみて下さいな。
また、Vector3型が値型であるという話は以下の記事で触れているので、値型や参照型の違いをおさらいしたい時はこちらもご覧あれ。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】transformのpositionを取得して値を変えても反映されないのはなぜ? 2020.11.23
-
次の記事
【Unity】エディタ拡張を使うと開発を効率化できる【C#】 2020.11.25
コメントを書く