VR Input 入力
Unity の回転と向き

Transform

Transform はゲームオブジェクトの位置・回転・スケール(拡大・縮小)と親子関係を保持するので非常に重要です。ゲームオブジェクトは常時 Transform コンポーネントにアタッチしているため、Transform コンポーネントをはずす事はできません、そして1つのゲームオブジェクトに対して1つしか存在できません。

Transform の編集

Transform は 3 次元空間であれば X ・ Y ・ Z 軸、2 次元空間であれば X ・ Y 軸を Unity 上で操作できます。これらの軸は赤は X、緑は Y、青は Z、でそれぞれ表現されています。( Scene ウィンドウを表示して確認するとわかりやすいです)

Transform における座標軸のカラー
Transform における座標軸のカラー

Transform はシーン内のシーンビューやインスペクター上での値の変さらによって編集することができます。シーンビューでは移動・回転・拡大縮小・等のツールを使用して Transform を修正することもできます。これらのツールは Unity エディターの左上に配置されています。(手・矢印等のマークの事です。)

移動・回転・拡大縮小ツール
移動・回転・拡大縮小ツール

ツールはシーン内の任意のオブジェクトで使用することができます。オブジェクトをクリックすると、シーン内にギズモが表示されます。表示されるギズモは、選択したツールによります。

Transform のギズモ
Transform のギズモ

When you click and drag on one of the three gizmo axes, you will notice that its color changes to yellow. As you drag the mouse, you will see the object translate, rotate, or scale along the selected axis. When you release the mouse button, the axis remains selected.

X 軸選択状態
X 軸選択状態

追加のオプションとして特定の平面への移動をロックするモードもあります。(一つの軸を固定しながら、残りの二つの軸をドラッグする)移動ギズモの中央付近にある三つの小さい色付き四角形をクリックしたときにロックされその平面で移動します。(例えば、Z 軸のロックは青い四角形をクリック)

親子関係

親子関係は unity 上で最も重要なコンセプトの 1 つです。ゲームオブジェクトが他のゲームオブジェクトの であるとき のゲームオブジェクトは親のゲームオブジェクトを基準として移動・回転・拡大縮小されます。親子関係はあなたの腕や体の関係のように考える事ができます、つまり体が動けば腕が移動すると言う事です。子オブジェクトもまた自分の子を持つことができます。それは手を腕の“子供”とし、手は複数の指を“子供”として持っているとみなすことができます。あらゆるゲームオブジェクトは複数の子オブジェクトを持つ事ができますが、親は 1 つのみです。親子関係にあるこれら複数の階層は、Transform の ヒエラルキー によって形成されています。ヒエラルキー上で最も上位にあるオブジェクトは ルート と呼ばれます。

Hierarchy ビュー で任意のゲームオブジェクトを他のゲームオブジェクト上にドラッグすると親を作成できます。この操作で二つのゲームオブジェクトは親子関係となります。

ヒエラルキー上の親子関係の例 左側に折り込み矢印の付いたゲームオブジェクトが親
ヒエラルキー上の親子関係の例 左側に折り込み矢印の付いたゲームオブジェクトが親

インスペクター上に表示されているいろいろな子オブジェクトの Transform の値は親の Transform の値を基準として表示されていることに注意しなければいけません。これらの値は ローカル座標 と呼ばれています。体と腕の関係で例えるならば、歩くときに体の位置が移動してもあなたの腕が基準とする位置は同じであるということです。シーンの構成上、通常は、子オブジェクトに関してはローカル座標での作業で十分です。ただし、ゲームプレイでは、しばしばワールド空間や グローバル座標 で正確な位置を確認することが役立つこともあります。Transform コンポーネントのために API をスクリプトすると、ローカルとグローバルの位置、回転とスケールに別々のプロパティーが設定され、また、どんな位置でもローカルとグローバル座標間で転換できます。

パフォーマンスの問題と不均等スケーリングの制約

不均等なスケーリングとは Transform 内の Scale が例えば xyz=(2, 4, 2) のような異なる値の事を言います。対照的に、均等なスケーリングとは xyz=(3, 3, 3) のような同じ値の事を言います。不均等なスケーリングは特定の場合に役立ちますが、均等なスケーリングでは発生しないいくつかの奇妙なことが発生します。

  • 特定のコンポーネントでは不均等スケーリングを完全にサポートしていません。例えば、 radius プロパティーで定義された円や球のエレメントを持つコンポーネントがありますが、その中で、 球状コライダーカプセルコライダーライトオーディオソース 等です。これらの場合、不均等スケーリングである楕円にしようとしても期待した通りにはならず、ただの円形になります。
  • 子オブジェクトが不均等なスケールの親を持ち、親を基準として回転するとき歪んで表示されたり断片化される恐れがあります。コンポーネントの中には、単純な不均等スケーリングをサポートしているものもありますが、このように歪んでいるときは正確に作用しません。例えば歪んだ ボックスコライダー は、レンダリングされたメッシュの形状と正確には一致しません。
  • パフォーマンスについて述べると、不均等なスケールを親に持つ子オブジェクトは回転しても自動的にスケールの更新がされません。その結果、子オブジェクトの形状は最終的に更新された時点で突然表示が更新される場合があります。子オブジェクトが親から切り離された場合にも言えます。

スケールの重要性

Transform のスケールはあなたのモデリングアプリケーションでのメッシュの大きさとユニティでそのメッシュの大きさとの違いを決定します。ユニティ上でのメッシュサイズは( Transform のスケール)は、特に物理シミュレーションにとって大変重要です。デフォルトでは、物理エンジンはワールド空間上で 1 単位を 1 メートルに対応することを前提としています。オブジェクトが非常に大きい場合、それは「スローモーション」で落ちるように見えます。シミュレーションでは実際に正しいです、非常に大きなオブジェクトが遠方で落ちいてるように見えます。

あなたのオブジェクトの規模に影響を与える 3 つの要因があります:

  • あなたの 3D モデリングアプリケーションでのメッシュの大きさ
  • オブジェクトの インポート設定メッシュスケールファクター の設定
  • Transform コンポーネントの Scale の値

理想的には、Transform コンポーネントのオブジェクトの Scale を調整してはいけません。最良のオプションは、現実のスケールでモデルを作成して Transform のスケールを変更しない事です。次の最良のオプションは、個々のメッシュをインポートする際のスケールを Import Settings で調整することです。特定の最適化はインポートサイズに基づいて発生し、スケールを調整したオブジェクトのインスタンス化はパフォーマンスを低下させます。詳細については、Rigidbodyコンポーネントのリファレンスページのスケールの最適化に関するセクションを参照してください。

Transform に関する作業のヒント

  • Transform の親子関係を用いるとき子のオブジェクトを追加する前に親の位置を(0, 0, 0)にした方がよいです。これは子オブジェクトに対するローカル座標と子オブジェクトをグローバル座標と同じ位置に正確な作成するのが容易になります。
  • パーティクルシステム は Transform の スケール の影響を受けません。パーティクルシステムでスケール調整するためには、システムのパーティクルエミッター、アニメーターやレンダラーでプロパティーを変更する必要があります。
  • 物理シミュレーションのために Rigidbodies を使用している場合は、Rigidbodyコンポーネントのリファレンスページのスケールプロパティーについてお読みください。
  • Transform の軸の色(および、その他の UI エレメント)を Preferencees (メニューバーの Unity > PreferencesColors & keys panel を選択) から変更できます。
  • スケールを変更すると、子の Transform の位置も変更されます。例えば親の位置が (0, 0, 0) の場合はすべての子は親の (0, 0, 0) から相対的な位置になります。
VR Input 入力
Unity の回転と向き