本日は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変数を設定してコンテンツメニューから関数を呼び出すとローカルスケールで逆算して設定が行われます。