読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

親オブジェクトのスケールを変化させても子オブジェクトを変化させたくない場合

Unity 回転とか移動とか拡大縮小とか おもしろ演出、演出の強化 2D 3D MMD・モデルの扱い・モデリング

Unityの親子構造では、子は親の影響を受ける。つまり、親のスケールが(2,1,1)みたいな場合、子は(1,1,1)でも実際は(2,1,1)のようになる。

ただ稀に、親のサイズ比率の影響を受けたくない場合がある。例えば親オブジェクトを引き伸ばした状態で文字を置く等々。

スケール変更
その場合は、transform.lossyScaleをうまく活用する。transform.lossyScaleは実際のスケールが登録されるので、このパラメータを元に計算することで、親オブジェクトのスケールに影響されない子オブジェクトを設定することが可能だ。

例えば、以下の様な形。

using UnityEngine;
using System.Collections;

public class Scale : MonoBehaviour 
{
    public Vector3 defaultScale = Vector3.zero;

    void Start () 
    {
        defaultScale = transform.lossyScale;
    }
    
    void Update () 
    {
        Vector3 lossScale = transform.lossyScale;
        Vector3 localScale = transform.localScale;

        transform.localScale = new Vector3(
                localScale.x / lossScale.x * defaultScale.x,
                localScale.y / lossScale.y * defaultScale.y,
                localScale.z / lossScale.z * defaultScale.z
        );
    }
}

ちなみに「実際のスケール」とは、オブジェクトをワールド座標に配置しスケールを操作した時と一致するといった意味。

例えば左のオブジェクトのscaleは1,1,1。右に同じ大きさのキャラクターが居るが、彼のscaleは(10, 10, 10)もある。しかし親オブジェクトのscaleが(0.1, 0.1, 0.1)なので、最終的には左右同じ大きさになり、得られるlossyScaleも(1, 1, 1)となる。
f:id:tsubaki_t1:20160730020246j:plain
なお、メッシュのサイズは基本的に元となるfbxの設定に依存する。
例えば下のように、大きさが明らかに違うメッシュでも、元の大きさが変化していなければscaleは1, 1, 1となる。
f:id:tsubaki_t1:20160730020730j:plain