はとの豆知識

Unityを中心に手っ取り早い機能の実装を紹介します。

【Unity】徐々にオブジェクトのスケールを大きく・小さくする方法「transform.localScale」の紹介

ゲーム制作で少しずつサイズを変えたい時に使えます。
例) 雪玉を転がして大きくする・遠くに離れてごとに徐々に
小さく見えるようにしたいなど。

手っ取り早い実装方法

    [SerializeField, Header("スケールを変えたいオブジェクト")] GameObject targetObject;

    //スケールを変える速度
    private Vector3 speed = new Vector3(2, 2, 0);

    void Update()
    {
        //-=で徐々にスケールを小さくする
        targetObject.transform.localScale -= speed * Time.deltaTime;
    }

targetObjectに対象のオブジェクトをインスペクターからセットする事でスケールが
徐々に小さくなります。
この書き方は3Dでも対応可能です。
f:id:HatoHatter:20210404203606p:plain
f:id:HatoHatter:20210404204421g:plain

詳しい解説

オブジェクトのスケールを変更する際にはそのオブジェクトの
localScaleプロパティを変更します。
上記のスクリプトでは-=で徐々にオブジェクトのスケールから指定した値を
引き続ける事で小さくしています。
逆に+=にすれば加算され大きくなります。

また、+-を付けず=だけにした場合は
指定した大きさになります。

[SerializeField] について

上記のスクリプトGameObject変数の前に []でSerializeFieldと書いてあります。

[SerializeField, Header("スケールを変えたいオブジェクト")] GameObject targetObject;

SerializeFieldの使用目的はインスペクターから変数の中身を
変更できるようにするためです。
Publicを変数の前に書いてもインスペクターに表示されますが他のスクリプトから直接
変数の中身を触る事ができるようになります。

触る気のない変数をPublicにしていると思わぬ事故を招きかねないので、
他のスクリプトから触る予定の無いけどインスペクターから変数を変更したいな~
と思ったら
SerializeFieldを使うように心掛けてください。

おまけ スケールが0より小さくなったら非表示にする処理

SetActiveの()内をfalseにする事でオブジェクトを非表示にできます。
SetActiveはこれ以外にもよく使う処理なので覚えておきましょう。

    [SerializeField, Header("スケールを変えたいオブジェクト")] GameObject targetObject;

    //スケールを変える速度
    private Vector3 speed = new Vector3(2, 2, 0);

    void Update()
    {
        //-=で徐々にスケールを小さくする
        targetObject.transform.localScale -= speed * Time.deltaTime;

        //0より小さくなったら非表示にする
        if (targetObject.transform.localScale.x < 0)
            targetObject.SetActive(false);
    }

まとめ

この記事で
・transform.localScale
・SerializeField
・SetActive

の3つに触れました。
localScale でのスケールの変更は親と子の要素が絡んでくると
色々ややこしくなるのですが
それはまた別の記事で書ければと思います。
参考になる記事はたくさんありますので気になった方は調べてみてくださいね。