スケール
CoddyのUnityジャーニー「Unityスクリプトの基礎」セクションの一部。レッスン 33/85。
transform.localScaleは、オブジェクトの各軸に沿ったサイズを倍率で変えます。標準のキューブは各辺が1単位なので、localScaleが(4, 1, 0.5)のキューブは、幅が4単位、高さが1単位、奥行きが半単位になります。すべての軸で同じサイズにするには、Vector3.one((1, 1, 1))を乗算します。このシャボン玉は、幅が3単位になるまで毎秒0.3ずつ大きくなります。
public float size = 1f;
void Update()
{
size = Mathf.Min(size + 0.3f * Time.deltaTime, 3f);
transform.localScale = Vector3.one * size;
}Mathf.Min(a, b)は2つの数値のうち小さい方を返すため、sizeは3に達するまで大きくなり、その後は3のままです。
スケールはオブジェクトのピボットを中心に適用されます。Unityに組み込まれている形状の場合、ピボットは中心です。地面に置かれた1単位のキューブの中心はy = 0.5です。高さを3単位にすると、そこから上に1.5、下に1.5広がるため、半分が地面に沈みます。地面に立たせるには、中心の位置を高さの半分、つまりy = 1.5にする必要があります。
子オブジェクトのサイズには親オブジェクトのスケールが乗算されます。つまり、スケールが2の親の下にあるlocalScaleが(1, 1, 1)の子は、2倍の大きさで描画されます。transform.lossyScaleを使うと、ワールド空間での最終的なサイズを読み取れます。これは読み取り専用です。設定するのはlocalScaleです。
チャレンジ
中級氷のキューブを0.4まで溶かし、地面に置いたままにします。
- フィールド
float size = 1f;を追加します。Update()で、size = Mathf.Max(size - melt * Time.deltaTime, 0.4f);を設定します。 transform.localScale = Vector3.one * size;を設定します。- 底面を y = 0 に保ちます。x と z はそのままにして、位置の y を
size / 2に設定します。
「プレイ」を押すと、キューブが縮み、地面にとどまります。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Melt : MonoBehaviour
{
public float melt = 0.2f;
void Update()
{
// 底面を地面につけたまま、毎秒meltずつ0.4まで縮小する
}
}
Unityスクリプトの基礎のすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド