おれ、Unity2Dでゲーム作るんだ。

Unity2Dをメインに、覚書などを記事にしていきます。

オブジェクトの距離を判定するときはVector3.sqrMagnitudeがパフォーマンスに優しい

2オブジェクトのポジションから距離を取得してなんやかんやすることはよくあると思います。

すぐ、頭に浮かぶのがDistance。

 Vector3.Distance(A,B)

わかりやすいんですが、ただ、これは測定の際に平方根の計算が走る(らしい)ので処理をとられる。 じゃあ、どうすればなるべく軽く判定できるかっていうと、

Vector3のsqrMagnitudeプロパティ。

 Vector3.sqrMagnitude

これは距離の二乗を提供してくれます。

f:id:xev:20200504231821p:plain

判定するときは、2乗を判定にしておかないいけないので注意。

private void DistanceCheckTest()
{
    float dist = 0;
    float target = 5f;
    float targetx2 = target * target;

    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();

    //------------------------
    // Distance
    //------------------------
    sw.Start();
    for (int i = 0; i < 1000000; i++)
    {
        dist = Vector3.Distance(cubeTransform.position, sphereTransform.position);
        if (dist > target)
        {

        }
    }

    sw.Stop();
    Debug.Log(sw.ElapsedMilliseconds + "ms - Vector3.Distance");

    sw.Reset();

    //------------------------
    // sqrMagnitude
    //------------------------
    sw.Start();
    for (int i = 0; i < 1000000; i++)
    {
        dist = (cubeTransform.position - sphereTransform.position).sqrMagnitude;
        if (dist > targetx2)
        {

        }
    }
    sw.Stop();
    Debug.Log(sw.ElapsedMilliseconds + "ms - Vector3.sqrMagnitude");
}