Version: 2023.1
言語: 日本語
ゲームオブジェクト
コンポーネント入門

Transform

Transform (トランスフォーム) は、ゲームオブジェクトの Position (位置)、Rotation (角度/回転)、Scale (スケール/縮尺) および親子関係の状態を保持します。ゲームオブジェクトには常に Transform コンポーネントが設定されています。Transform コンポーネントを削除したり、Transform コンポーネントなしでゲームオブジェクトを作成することはできません。

Transform コンポーネント

Transform コンポーネントは、シーン内の各オブジェクトの Position (位置)、Rotation (角度/回転)、Scale (スケール/縮尺) を決定します。全てのゲームオブジェクトは Transofrm を持っています。

Transform コンポーネント
Transform コンポーネント

ヒント: トランスフォームの軸 (およびその他の UI 要素) の色は変更できます。(メニューから Unity > Preferences と選択し、Colors & keys パネルを選択してください。)

プロパティ

プロパティ 機能
Position XYZ 座標におけるトランスフォームの位置。
Rotation X、Y、Z 軸を中心とするトランスフォームの回転角 (単位: 度)。
Scale X、Y、Z 軸に沿ったトランスフォームのスケール。値が “1” の場合は元のサイズ (ゲームオブジェクトをインポートした時のサイズ) になります。

Unity は、トランスフォームの PositionRotationScale の値を、そのトランスフォームの親を基準に相対的に測定します。トランスフォームに親がない場合、Unity はワールド空間でプロパティを測定します。

Transform の編集

2D 空間では、X 軸または Y 軸上でのみトランスフォームを操作できます。3D 空間では、X 軸、Y 軸、Z 軸でトランスフォームを操作できます。Unity では、これらの軸はそれぞれ赤、緑、青の色で表されます。

軸ごとに色分けされたトランスフォーム
軸ごとに色分けされたトランスフォーム

トランスフォームのプロパティは、主に以下の 3 つの方法で編集できます。

シーンビュー

シーンビューでは、Move (移動)、Rotate (回転)、Scale (スケール) ツールを使ってトランスフォームを編集できます。これらのツールは Unity エディターの左上にあります。

ハンド、移動、回転、スケールツール
ハンド、移動、回転、スケールツール

トランスフォームツールはシーン内のどのゲームオブジェクトにでも使用できます。ゲームオブジェクトを選択すると、その中にツールの ギズモ が表示されます。ギズモの見た目は選択したツールによって異なります。

トランスフォームギズモ (括弧内にキーボードショートカットが表示されます。)
トランスフォームギズモ (括弧内にキーボードショートカットが表示されます。)

表示されているギズモの 3 軸のうち 1 つをクリックしてドラッグすると、選択した軸が黄色になります。マウスをドラッグすると、選択した軸に沿ってゲームオブジェクトが移動、回転、拡大/縮小します。マウスボタンを離しても、軸は選択されたままです。

ゲームオブジェクトを動かす時に、動きを特定の平面にロック(固定) する (つまり、2 つの軸にのみ変更を加え、3 つ目の軸には変更を加えないようにする) ことができます。各平面へのロックを有効にするには、移動ギズモの中心を囲む 3 つの小さな色付きキューブを選択します。この色は各軸の色に対応しており、キューブを選択するとその軸がロックされます (例えば、Z 軸をロックするには青いキューブを選択します)。

Inspector ウィンドウ

Inspector ウィンドウでは、Transform コンポーネントを使って、選択したゲームオブジェクトの Transform プロパティを編集できます。コンポーネントで Transform プロパティの値を編集するには、以下の 2 つの方法があります。

  • プロパティの値フィールドに値を手動で入力する方法。これは、具体的な精密な調整に便利です。
  • 値フィールドをクリックし、上下にドラッグして値を増減する方法。これは、あまり具体的 (精密) でない調整に便利です。

C# スクリプト

ゲームオブジェクトのトランスフォームをスクリプト経由で編集するには、Transform API を使用してください。

ゲームオブジェクトのグループ化

Unity では、ゲームオブジェクトを親子階層にグループ化することができます。

  • 親ゲームオブジェクトは、その Transform プロパティを受け継ぐ他のゲームオブジェクトを持っています。
  • 子ゲームオブジェクトは、別のゲームオブジェクトに接続されて、そのゲームオブジェクトの Transform プロパティを引き継ぎます。

Hierarchy ウィンドウでは、子ゲームオブジェクトは親ゲームオブジェクトの直下に表示され、リスト内でインデントされます。親ゲームオブジェクトの折りたたみアイコンを選択すると、その子ゲームオブジェクトを表示したり隠したりできます。

子ゲームオブジェクトは、親ゲームオブジェクトと全く同様に移動、回転、拡大縮小します。また、子ゲームオブジェクトがそれ自体の子ゲームオブジェクトを持つこともできます。ゲームオブジェクトは、子ゲームオブジェクトは複数持てますが、親ゲームオブジェクトは 1 つしか持てません。

こうしたゲームオブジェクト同士の親子関係は、トランスフォーム階層を形成します。階層の一番上にあるゲームオブジェクト (つまり、階層の中で唯一親を持たないゲームオブジェクト) は、ルート ゲームオブジェクトと呼ばれます。

親ゲームオブジェクトを作成するには、Hierarchy ウィンドウで任意のゲームオブジェクトを他のゲームオブジェクトの上にドラッグします。これで、2 つのゲームオブジェクトの間に親子関係が作られます。

親子階層の例。左側に折り込み用の三角の付いたゲームオブジェクトが親
親子階層の例。左側に折り込み用の三角の付いたゲームオブジェクトが親

親子ゲームオブジェクトのトランスフォームの編集

You can group GameObjects into parent-child hierarchies.

全ての子ゲームオブジェクトの Transform 値は、親ゲームオブジェクトの Transform 値を基準とする相対値で表示されます。こうした値は ローカル座標 と呼ばれます。シーンを構築するにあたっては、通常は、子ゲームオブジェクトのローカル座標で作業すれば事足ります。ゲームプレイでは、子ゲームオブジェクトの グローバル座標 あるいはワールド空間における正確な位置の特定が往々にして役に立ちます。Transform コンポーネントのスクリプティング API には、ローカルとグローバルで別々の PositionRotationScale プロパティがあり、ローカル座標とグローバル座標を相互に変換できます。

ヒント: トランスフォームを親にする場合、子トランスフォームを追加する前に親の位置を <0,0,0> に設定しておくと便利です。これは子トランスフォームのローカル座標がグローバル座標と同じになることを意味します。これにより、子トランスフォームが正しい位置にあることを確認しやすくなります。

Transforms and Scale

トランスフォームの Scale (スケール) は、モデリングアプリケーションでのメッシュのサイズと Unity でのメッシュのサイズとの差異を決定します。Unity でのメッシュサイズ (つまりトランスフォームの Scale) は、特に物理シミュレーション中に非常に重要です。物理演算エンジンは、デフォルトでは、ワールド空間における 1 ユニットが 1 メートルに対応する想定になっています。ゲームオブジェクトが非常に大きいと、“スローモーションで” 落下しているように見える場合があります。これは実際に正しいシミュレーションです - 非常に大きなオブジェクトがとても長い距離を落ちるのを見ている、ということになるからです。

ゲームオブジェクトの Scale に影響する要素は以下の 3 つです。

  • 3D モデリングアプリケーションでのメッシュのサイズ
  • ゲームオブジェクトの Import Settings 内の Mesh Scale Factor 設定
  • Transform コンポーネントの Scale の値

Transform コンポーネントでゲームオブジェクトの Scale を調整しないでください。現実世界の縮尺でモデルを作成する場合は、Transform の Scale を変更する必要はありません。また、インポートサイズに基づいて一部の最適化が行われるため、メッシュのインポート時のスケールも調整できます。これは個々のメッシュの Import Settings (インポート設定) で行います。Scale 値が調整されたゲームオブジェクトをインスタンス化すると、パフォーマンスが低下することがあります。

ノート: Scale を変更すると子トランスフォームの位置に影響します。例えば、親トランスフォームを (0,0,0) にスケールすると、全ての子トランスフォームが、親トランスフォームを基準に相対的に (0,0,0) に配置されます。

不均等スケーリング

Transform 内の Scale の X、Y、Z の値が、例えば (2, 4, 2) のように異なる場合、これは不均等スケーリングと呼ばれます。これに対し、均等スケーリングとは、X、Y、Z の値が (3, 3, 3) のように同じ場合です。不均等なスケーリングは限られた特定のケースで役立ちますが、以下のように、均等なスケーリングとは異なる動作が発生します。

  • 一部のコンポーネントには、不均等スケーリングの完全なサポートがありません。例えば、一部のコンポーネント (Spehere Collider、Capsule Collider、Light Source、Audio Source など) には、Radius プロパティで定義される円形あるいは球状の要素があります。この場合、不均等スケーリングでは、円形を楕円形にすることができず、円形のままになります。
  • ある子ゲームオブジェクトが、不均等にスケールされた親ゲームオブジェクトを持っていて、親ゲームオブジェクトを基準に相対的に角度付けされている場合、この子ゲームオブジェクトが歪んで見えたり、“せん断” されたように見えることがあります。一部のコンポーネントは単純な不均等スケーリングをサポートしていますが、このように歪む場合は適切に機能しません。例えば、歪んだ Box Collider は、レンダリングされたメッシュの形状と正確に一致しません。
  • 不均等にスケールされた親の子ゲームオブジェクトは、回転した時に、自動的にスケールが更新されません。その結果、実際にスケールを更新した時 (例: 子ゲームオブジェクトが親ゲームオブジェクトから分離された時) に、子ゲームオブジェクトの形状が突然変化したように見えることがあります。

その他の参考資料

Transform

ゲームオブジェクト
コンポーネント入門