Unityで親オブジェクトのScaleに影響を受けず子オブジェクトのScaleだけを変更したときのはなし

現象

 Unityで子オブジェクトを持つ親オブジェクトのScaleを操作すると連動して子オブジェクトのScaleも自動的に計算され適切な倍率になる。一方でそれぞれのオブジェクトのScaleをスクリプトから設定した値に変更したい場合、これは障害となる。

解決

 スクリプトからオブジェクトのScale値を指定する際に親オブジェクトのグローバルスケールの逆数をかけることで倍率を相殺した。グローバルスケールはTransformクラスの読み取り専用変数lossyScaleで取得できる。したがってオブジェクトとそのサイズ倍率を指定して変更する関数を作るとしたら以下のようになる。

void Resize(GameObject obj, float val){
  Vector3 vec = new Vector3(1,1,1);
  vec.x = val /transform.parent.lossyScale.x;
  vec.y = val /transform.parent.lossyScale.y;
  vec.z = val /transform.parent.lossyScale.z;
  obj.transform.localScale = vec;
}

Leave a comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA