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
プロパティを取得しましたが、メタデータを覗くと色々なプロパティを取得することができます。
このプロパティには代入することができるので、位置をずらすこともできます。しかし、注意点が必要です。
この画像のメッセージを見ると、Position
は Vector3
という構造体になっているのでそのまま値を代入することはできません。なので、型を合わせる必要があります。
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)
このように得られます。