MRが楽しい

MRやVRについて学習したことを書き残す

UnityでAutoAsyncTransformを切り替えた時のCollider動作の変化を確認する

本日は Unity の小ネタ枠です。
UnityでAutoAsyncTransformを切り替えた時のCollider動作の変化を確認して記事にします。

AutoAsyncTransform

Transform コンポーネントが変更された際に、物理システムが即座に同期するか否かの設定項目です。
AutoAsyncTransform が有効な時に Trasform コンポーネントが変更されると、その Transform または子オブジェクトに付随する Rigidbody または Collider への変更が即座に適用されます。
一方で AutoAsyncTransform が無効な時は Rigidbody または Collider への変更はフレーム間のタイミングで行われます。
AutoAsyncTransform が有効な場合、Transform を繰り返し変更するとパフォーマンスが低下することがあります。
docs.unity3d.com

Unity 2017.2 以降で作成されたプロジェクトではデフォルトで無効化されています。

動作テスト

AutoAsyncTransform の動作を確認するため、以下のサンプルスクリプトを作成しました。
Transform の座標を移動した後に BoxCollider の位置を確認し、その後、更に同一フレーム内で Transform の座標を元に戻します。
・AutoSyncTranformTest.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(BoxCollider))]
public class AutoSyncTranformTest : MonoBehaviour
{
    // Update is called once per frame
    void Update()
    {
        this.transform.position = new Vector3(0, 0, 0);

        Bounds bound = this.GetComponent<BoxCollider>().bounds;
        Debug.Log("BoxCollider Center : " + bound.center.ToString());

        this.transform.position = new Vector3(0, 0, 10);
    }
}

シーンに配置した Cube オブジェクトに本スクリプトを設定します。
f:id:bluebirdofoz:20210730223007j:plain

AutoAsyncTransformが無効な場合

メニューから[Edit -> ProjectSettings]を開きます。
[Physics]タブを開き、[Auto Sync Transforms]が無効であることを確認します。
f:id:bluebirdofoz:20210730223019j:plain

シーンを[再生]してデバッグログを確認します。
BoxCollider の座標はフレーム間のタイミングで変更されるため、前フレーム内の最後で変更した座標が設定されています。
f:id:bluebirdofoz:20210730223028j:plain

AutoAsyncTransformが有効な場合

メニューから[Edit -> ProjectSettings]を開きます。
[Physics]タブを開き、[Auto Sync Transforms]を有効に変更します。
f:id:bluebirdofoz:20210730223040j:plain

シーンを[再生]してデバッグログを確認します。
BoxCollider の座標には即座に Transform の変更が反映されるため、直前で変更した座標が既に設定されています。
f:id:bluebirdofoz:20210730223049j:plain

Transform を変更し、即座に Collider などの物理判定を行うプロジェクトでは動作の違いとパフォーマンスに注意が必要です。