ふと気になったので確認してみました。
- 空のゲームオブジェクトをを作成する
- オブジェクトはフォーカスしたオブジェクトと同じ位置に作られる
- SceneViewを動かすと、生成位置がズレる
- Create Empty Childは親と同じ座標
- MenuItemのオーバーライドは出来なかった...と思ったが何とかなった
- 関連
空のゲームオブジェクトをを作成する
Unityでコンテンツを作る際によくやるのが、Create Emptyで空のゲームオブジェクトを作成する事です。
作成した空のゲームオブジェクトは、フォルダのように暑かったり、適当なコンポーネントを追加してマネージャーにしたりと、まぁ色々します。
ただ、オブジェクト作成時変な座標にある事も多々あります。それを毎回ResetPositionで [0,0,0] にしてる訳ですが、正直面倒と感じる事もあります。*1
と、言うことで少し確認しました。
オブジェクトはフォーカスしたオブジェクトと同じ位置に作られる
まず一つ目の要素は、Create Emptyで作成したオブジェクトは、フォーカス(Hierarchyダブルクリックでシーンビューの中心に持っていく)したオブジェクトと同じ位置に生成されるという事です。
参考までに、P1~P3の順にフォーカス→Create Emptyでオブジェクトを生成すると、生成したオブジェクトはP1~P3と同じ位置に生成されている事が分かります。
これは「キャラクターの位置フォーカスを置きCreate Emptyすると、キャラクターの位置(Pivotの位置)にオブジェクトが生成される」という動作が期待出来ます。
SceneViewを動かすと、生成位置がズレる
ここでメデタシメデタシで終われば良かったのですが、この多くの人を混乱させる挙動には続きがあります。つまり、SceneViewを動かすとCreate Emptyで生成されるオブジェクトの位置がズレるという事です。
下のアニメでは、フォーカス後に左にシーンビューを動かしています。そうすると、Create Emptyで生成されるオブジェクトの位置がズレます。
また質の悪いのがズームの扱いです。
SceneViewのズームはFOVを弄って実現しているらしく、ホィールでズームを行った場合 シーンビューの位置は変わりません。
なので、右クリック上下左右でカメラの位置を動かしたケースと違い、ズームだけならフォーカスを当てた位置に生成されます。
Create Empty Childは親と同じ座標
なお、Create Empty Childは親と同じPosition・Scale・Rotationを持ちます(なので、相対座標は0となります)
これを便利ととるか微妙と取るかは…いや、微妙ですよね
MenuItemのオーバーライドは出来なかった...と思ったが何とかなった
CreateEmptyで変な挙動になるならCraeteEmptyの挙動を上書きすれば良いじゃない!と思ったんですが、残念ながら出来ませんでした。
Cannot add menu item 'GameObject/Create Empty %#n' for method 'CreateEmpty.CreateEmptyObject' because a menu item with the same name already exists.
と思いましたが、何とかなりました。
MenuItem名を少しズラし、かつGameObject/Create Emptyより高い優先度でMenuItemを用意してやれば、Ctrl + Shift + Nで自分が用意したGameObjectが生成出来ます。あと()とか要らない
ちょっとした応用・Deplicateから(1)を抜き、親オブジェクトの下に生成する
このギミック使うと、Deplicate(Ctrl + D)も上書き出来ました。()が付かない・現在のオブジェクトの下に生成する複製…みたいな感じで。
まぁアセットの複製がCtrl + Dでできなくなる弊害がありますが…ちゃんと拡張すれば何とかなるかな…?
関連
*1:フォルダやマネージャーとして使う場合、座標が0,0,0以外の所にあると色々とややこしい事を起こす事がある