原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【小ネタ】lossyScaleって何だ?

認識相違

連日の猛暑で体が少し溶けている気がするのに体重は増えている認識相違が甚だしい皆さんこんにちは。この季節になると熱中症に気を付けて日中はできるだけ室内で過ごし水分補給にジュースやアイスを口にする機会が増えますが、その分、別のところが不健康になっている気がします。どうしよう。

 

新ステージ作成中

前回の記事でもお伝えしましたがリズムアクションゲーム「Under A Groove」を8月3日に開催される東京ゲームダンジョン9に出展する為、それに向けて新ステージを作成中です。

現状、東京ゲームダンジョン9までに新ステージが完成するかギリギリのところなんですが、序盤の箇所を動画にしてXにポストしたら予想外に「いいね」を多くもらえたので期待を裏切らないよう頑張りたいと思います。

東京ゲームダンジョン9での出展ブースは「3B-7」ですが、もし当日現場に来て上の映像が流れてなかったら「間に合わなかったんだな・・・」と察してください。

 

lossyScale

思えばUnityを触りだして結構な月日が経ちますが、つい先日Transformのプロパティの中に"lossyScale"という項目があることを知りました。
読み取り専用で変更する事ができないこのプロパティ、調べてみるとオブジェクトのグローバルスケールが設定されているようです。

docs.unity3d.com

幾つかのオブジェクトが親子関係となっている場合、子オブジェクトのlocalScaleは親側のlocalScaleに影響を受けるので、例えばあるオブジェクトのlocalScaleが(1.0, 0.5, 0.5)でlocalScaleが(1.0, 1.0, 1.0)となっているオブジェクトをそのオブジェクトの子供とした場合、子側のlocalScaleは(1.0, 2.0, 2.0)となります。

そしてオブジェクトのスケールはlocalScaleしかスクリプトで変更できないので、Unityエディタ上でうっかりlocalScaleが異なるオブジェクトを親子構造にしてしまうとスクリプトによるスケールの変更が思ったような挙動にならないケースも出てきます。

 

lossyScaleは親オブジェクトの影響受けない実際のスケールが設定されるので、この値を基準にlocalScaleを設定すると親オブジェクトのlocalScaleの影響受けずに一定のスケールを保つことができます。

/// <summary>
/// lossy scale を 指定の値にする
/// </summary>
public static void SetLossyScale(Transform target, Vector3 scale)
{
    target.localScale = new Vector3(
        scale.x / target.lossyScale.x * scale.x, 
        scale.y / target.lossyScale.y * scale.y, 
        scale.z / target.lossyScale.z  * scale.z
    );
}

下の動画ではCubeと鹿のモデルでCube=親、鹿=子となっていおり、親(Cube)のlocalScaleを変更するとそれに併せて子(鹿)のスケールも変更されることが分かると思います。

これに鹿(子オブジェクト)側に先ほどのコードを使って一定のスケールを保つようなスクリプトをアタッチしてみます。

親(Cube)のlocalScaleの変化に影響されずにスケールを一定に保つことが出来ました。

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。