【Unity メモ】Mathf クラスと Vector3 構造体

Unity で作成したオブジェクトはコンポーネント(そのオブジェクトを構成する状態やふるまいなど)を何かしら持っています。これを使って処理する方法についてのメモです。

GetComponent メソッド

そのオブジェクトが持つコンポーネントを取得する。

例えば、キューブをヒエラルキーに設置すると Transform という物体の位置やスケールなどの情報をもつコンポーネントが自動でアタッチされます。これを取得するには次のように書きます。

void Start()
{
    print(GetComponent<Transform>());
}
Cube (UnityEngine.Transform)
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:10)

ジェネリクスに対応したコンポーネントの型を当てはめると、そのオブジェクトのもつ Transform をとってくることができます。

Mathf クラス

計算などの数学的な処理を行うことができるクラス。

  • Floor() : 小数点以下を切り捨てるメソッド。
  • Round() : 四捨五入するメソッド。
  • Abs() : 絶対値を取得するメソッド。
  • Cos(), Sin(), Tan() : 三角関数の値を取得するメソッド。引数にはラジアン [rad] を入力する。
  • Deg2Rad : 角度をラジアンに変換する定数で、角度との積をとるとラジアンに変換される。
  • Lerp() : 線形補間をするメソッド。
void Start()
{
    print(Mathf.Floor(23.22f));
    print(Mathf.Round(44.62f));
    print(Mathf.Abs(-5.234f));
    print(Mathf.Sin(90 * Mathf.Deg2Rad));
    // 引数 : 開始点、終了点、中間(割合)
    print(Mathf.Lerp(0f, 30.0f, 15.0f));
}
23
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:10)

45
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:11)

5.234
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:12)

1
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:13)

15
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:14)

Vector3 クラス

スクリプトコンポーネントにアタッチした状態でプログラムを書くと、そのオブジェクトに関するコンポーネントのプロパティをそのまま使うことができます。

void Start()
{
    print(transform.position)
}

特に位置を動かしたりはしていないので、(x, y, z) は全て 0 になっています。

(0.0, 0.0, 0.0)
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:10)

このプログラムは Transform コンポーネントPosition プロパティを取得しましたが、メタデータを覗くと色々なプロパティを取得することができます。

f:id:takunology:20210310090925p:plain

このプロパティには代入することができるので、位置をずらすこともできます。しかし、注意点が必要です。

f:id:takunology:20210310091436p:plain

この画像のメッセージを見ると、PositionVector3 という構造体になっているのでそのまま値を代入することはできません。なので、型を合わせる必要があります。

void Start()
{
    print(transform.position);
    transform.position = new Vector3(3f, 0f, 0f);
    print(transform.position);
}

Vector3 を使って代入することで任意の座標に移動させることができます。ちなみに、構造体は毎回新しく作られる値型のデータ構造です。

(0.0, 0.0, 0.0)
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:10)

(3.0, 0.0, 0.0)
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:12)

Vector3 には Distance というメソッドがあり、2つの物体間の距離を算出することができます。例えば、メインカメラとの距離を測りたい場合は次のように書きます。

void Start()
{
    print(Vector3.Distance(Camera.main.transform.position, transform.position));
}
10.04988
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:10)

距離は三平方の定理により、平方根の計算が含まれているので若干処理が重いです。バックグラウンドで処理をする場合は平方根による計算を省いた sqrMagunitude というプロパティがあるので、場面に合わせて選択できると良さそうです。ちなみに、Distance と同様の magnitude というプロパティもあります。

normlized を使用すると単位ベクトルの指す方向を取り出せます。

void Start()
{
    Vector3 cube = transform.position;
    print(cube.normalized);
}

今回はただオブジェクトを配置しただけなのでどの方向も、ゼロとなります。

(0.0, 0.0, 0.0)
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:11)

ちなみに、多少動かす ( x = 3, y = 4 とする) と

(0.6, 0.8, 0.0)
UnityEngine.MonoBehaviour:print (object)
MyScript:Start () (at Assets/Scripts/MyScript.cs:13)

このように得られます。