目次
はじめに
オブジェクトを回転させる方法はいくつかありますが、どれが低負荷なのか気になったので、参考までにProfilerで計測した結果を残しておきます。
先に結論
回転が1軸の場合は「Quaternion.AngleAxis」を使うのが高速(UIなどはこちらがオススメ)
回転が2軸以上の場合は「Quaternion.Euler」を使うのが高速
- Unity 2021.3.11
比較する回転方法
下記の4種で回転時の負荷を比較します。
- Quaternion.AngleAxis
- Quaternion.Euler
- Rotate
- RotateAround
サンプルコード
void Start()
{
Roll1();
Roll2();
Roll3();
Roll4();
}
void Roll1()
{
for (int i = 0; i < 10000; i++)
{
transform.localRotation = Quaternion.AngleAxis(i, Vector3.forward);
}
}
void Roll2()
{
for (int i = 0; i < 10000; i++)
{
transform.localRotation = Quaternion.Euler(0, 0, i);
}
}
void Roll3()
{
for (int i = 0; i < 10000; i++)
{
transform.Rotate(0, 0, 1);
}
}
void Roll4()
{
for (int i = 0; i < 10000; i++)
{
transform.RotateAround(transform.localPosition, Vector3.forward,1);
}
}
計測結果
Overview | GC Alloc | Time ms |
---|---|---|
Quaternion.AngleAxis | 0 | 8.03 |
Quaternion.Euler | 0 | 11.22 |
Rotate | 0 | 19.41 |
RotateAround | 40B | 25.77 |
「Quaternion.AngleAxis」が最も低負荷という結果になりました。ただし「Quaternion.AngleAxis」は回転軸が1軸指定なので、2軸以上で回転させる場合は「Quaternion.Euler」を使用するのが良いようです。
X軸(横) | Y軸(縦) | Z軸(正面) |
Vector3.right | Vector3.up | Vector3.forward |
まとめ
- 回転が1軸の場合は「Quaternion.AngleAxis」を使うのが高速(UIなどはこちらがオススメ)
- 回転が2軸以上の場合は「Quaternion.Euler」を使うのが高速
※記事では触れていませんが、ローカル座標の方がワールド座標より低負荷なので「rotation」ではなく「localRotation」で指定するのがオススメです。
参考
Unity の回転と向き - Unity マニュアル
Unity では、回転や向きを表現するのに、オイラー角とクォータニオンの両方を使用することができます。これらの表現は同等ですが、異なる用途と制限があります。
【Unity】Quaternionでオブジェクトを回転させる方法 – XR-Hub
Unityでオブジェクトを回転させる時に使用するのがRotationやQuaternionです。 ただ、このQuaternion、概念とか使い方がややこしく上手く使えないという方は多いと思い...
リンク