Unity入門

【Unity】Transform.localScaleの使い方【取得・拡縮・変更】

この記事について

この記事では Transform.localScale を使ってオブジェクトの大きさを変更・取得する方法を解説します。
位置(position)、回転(rotation)と並んでよく使うのが「拡縮(scale)」です。ゲーム開発ではサイズ変更やアニメーションに欠かせません。

この記事でわかること

  • transform.localScale でオブジェクトの大きさを取得・変更できる
  • Vector3 でX/Y/Z方向の拡縮を制御できる
  • transform.localScale *= 倍率 で相対的にサイズ変更できる
  • Lerp を使ってスムーズに拡縮できる

Transformとは?

Transformについては以下の記事を参考にしてください。

Transform.localScaleをスクリプトで制御

Transform.localScaleをの準備

まずはヒエラルキーで右クリックをして空のGameObjectとCubeを1つずつ用意します。
・「右クリック」→「Create Empty」
・「右クリック」→「3D Object」→「Cube」

作成できたらCubeを空のGameObjectの子オブジェクトにして、空のGameObjectのScaleを(5,2,3)にして、Rotationを(0,30,0)にしてください。

次にスクリプトを作成してCubeにアタッチしてください。

現在のスケールを取得する

現在のスケールは「transform.localScale」で取得できます。

using UnityEngine;

public class Transform_localScale : MonoBehaviour
{
    void Start()
    {
        Vector3 scale = transform.localScale;
        Debug.Log("現在のスケール: " + scale);
    }
}

実行してみると、 ローカルスケールなので(1,1,1) ですね。

new Vector3()でスケールを変更する(絶対指定)

直接、Vector3を代入して拡縮を指定することもできます。

using UnityEngine;

public class Transform_localScale : MonoBehaviour
{
    void Start()
    {
        // 2倍に拡大
        transform.localScale = new Vector3(2, 2, 2);
        Debug.Log("現在のスケール: " + transform.localScale);
    }
}

実行してみると、ローカルスケールが(2,2,2)になりましたね。

*=でスケールを変更する(相対変更)

現在のサイズを基準に倍率を掛けることもできます。
※ここからは親オブジェクトのスケールを(0.1f,0.1f,0.1f)ぐらいにしておいてください。

using UnityEngine;

public class Transform_localScale : MonoBehaviour
{
    void Update()
    {
        if (transform.localScale.x >= 30) return;   //制限はかけておきましょう

        // 毎秒1.1倍に拡大
        transform.localScale *= 1.01f; //* Time.deltaTime;
        Debug.Log("現在のスケール: " + transform.localScale);
    }
}

実行してみると、どんどん大きくなりますね。

スムーズに拡縮する(Lerp)

Vector3.Lerp」を使うとアニメーションのように自然に拡縮できます。

using UnityEngine;

public class Transform_localScale : MonoBehaviour
{
    [SerializeField] private Vector3 targetScale = new Vector3(30, 30, 30);
    [SerializeField] private float speed = 2f;

    void Update()
    {
        transform.localScale = Vector3.Lerp(transform.localScale, targetScale, Time.deltaTime * speed);
    }
}

実行してみると、目標値近くになると時間がかかるみたいですね。

まとめ

  • transform.localScale → サイズを取得・変更できる
  • Vector3(x,y,z) で絶対値指定
  • localScale *= 倍率 で相対拡縮
  • Lerp を使えばアニメーション的な拡縮も可能