MRが楽しい

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

Unityでオブジェクトのグローバルスケールを参照・設定する

本日はUnityの小ネタ枠です。
Unityでオブジェクトのグローバルスケールを参照・設定する方法についてです。

Transform.lossyScale

グローバルスケールはワールド空間におけるオブジェクトの絶対的なスケール値です。
Transform.lossyScaleにアクセスすることでオブジェクトのグローバルスケールを取得できます。
docs.unity3d.com

var lossyScale = transform.lossyScale;

本変数は読み取り専用のため、グローバルスケールを設定したい場合はローカルスケールで逆算して設定を行う必要があります。

サンプルスクリプト

アタッチしたオブジェクトのグローバルスケールを取得し、設定する以下のサンプルスクリプトを作成しました。
・ScaleCheckTest.cs

using UnityEngine;

public class ScaleCheckTest : MonoBehaviour
{
    [SerializeField]
    private Vector3 setWorldScale = default;

    private void Start()
    {
        // 現在のワールドスケールを取得
        var lossyScale = transform.lossyScale;
        Debug.Log($"{lossyScale}");
    }
    
    [ContextMenu("SetWorldScale")]
    public void SetWorldScale()
    {
        // 現在のワールドスケールを取得
        var lossyScale = transform.lossyScale;
        Debug.Log($"{lossyScale}");
        
        // ワールドスケールを設定
        // lossyScaleは読み取り専用のため、localScaleを使って設定する
        transform.localScale = new Vector3(
            setWorldScale.x / lossyScale.x,
            setWorldScale.y / lossyScale.y,
            setWorldScale.z / lossyScale.z
            );
        
        // 再度ワールドスケールを取得
        lossyScale = transform.lossyScale;
        Debug.Log($"{lossyScale}");
    }
}

スクリプトをオブジェクトにアタッチしてシーンを再生すると、そのオブジェクトのグローバルスケールがログに出力されます。

setWorldScale変数を設定してコンテンツメニューから関数を呼び出すとローカルスケールで逆算して設定が行われます。