size と pivot で GameObject の大きさを書き、<Row> と <Grid> で子を並べます。size と pivot は prefab には書かれず、並べる計算と inspect の数にだけ使います。
<Object name="Desk" size="1.2 0.7 0.6" pivot="0.5 0 0.5"/>
<Object name="Chair" size="0.5 0.9 0.5" pivot="0.5 0 0.5" position="0 0 -0.6"/>
| |
|---|
size | 幅・高さ・奥行き(メートル・0 以上)です。GameObject の座標での長さで、自身と親の拡大が適用されます |
pivot | 原点が size の箱のどこにあるかを、各軸 0〜1 の割合で書きます(Unity の RectTransform.pivot と同じ考え方)。0.5 0 0.5 は底面の中央です |
pivot の省略 | 箱の中心になります |
size の無い pivot | エラーになります。<Row>・<Grid> と、大きさを持つ部品を使った所は除きます |
spacing・align・columns の属性は <Row> と <Grid> にあります。
<Row name="Books" spacing="0.05" align="bottom">
<Object name="A" size="0.1 0.3 0.2"/>
<Object name="B" size="0.1 0.25 0.2"/>
<Grid name="Board" columns="2" spacing="0.5 0.25" position="0 1.5 0">
<Object name="A" size="1 1 0.1"/>
<Object name="B" size="1 1 0.1"/>
<Object name="C" size="1 0.5 0.1"/>
| |
|---|
| 並ぶ向き | <Row> は +X 方向へ左から並べます。<Grid> は行ごとに左から右へ埋め、行は上から下(−Y 方向)へ進みます |
| 並べる子 | 直下のホストと部品のほか、<For>・<If> の展開と <Slot> の中身も含みます |
| 子の条件 | size を書いていない <Prefab> と、下の size の無い部品を除き、全部の子に size が必要です。子に position は書けません |
size の無い <Prefab> | prefab(かモデル)の中の、active で enabled な Renderer のメッシュ(組み込み・.asset・モデルの中のメッシュ・SkinnedMeshRenderer の境界)を包んだ箱で並べます。回した <Prefab> は、メッシュごとの箱を回してから 1 回だけ包みます(Unity の Renderer.bounds と同じです)。当たり判定・active でない物・無効な Renderer・TextMeshPro・パーティクルは場所を取りません。インスタンスのルートそのものの active は見ません |
測れない <Prefab> | Unity がまだ読んでいないモデルのメッシュを持つ物は MOCHI2018 です(Unity でファイルを一度保存するか、size を書きます)。見えるメッシュが無い物・境界を読めないメッシュを持つ物・pivot を書いた物は、size が必要です(MOCHI1008)。文字(TextMeshPro)だけを見せる prefab も size が必要です(文字の箱は、Unity が文字を並べた後でしか分からないためです) |
size の無い部品 | 部品の本体(<Props> を除く)が size の無い <Prefab> ただ 1 つなら、その <Prefab> を測った箱で並べます。部品の中の <Prefab> の position・rotation・scale も適用されます。本体がそういう部品 1 つの部品もたどります。それ以外の部品(ルートが 2 つ以上・ルートが <Object>・部品自身にメッシュがある物など)は size が必要です(MOCHI1008) |
<Row>・<Grid> の大きさ | 子を並べた箱の大きさです。size は書けません |
<Grid> の列と行 | 列の幅はその列の子の最大、行の高さはその行の子の最大です。子は列の中で中央に置きます |
| 回転・拡大した子 | size と scale の箱を回転させ、軸に沿って包んだ箱で並べます。rotation・scale を書いていない <Prefab> は、prefab のルートの回転・拡大を掛けます |
| 前後の位置 | 子の原点を、すべて同じ Z に置きます |
<Row>・<Grid> の原点 | 並べた箱に、自身の pivot(既定は中心)を当てた位置です |
<Row name="Frames" spacing="0.5" position="0 1.5 0">
<For each="art" in="folder('art/')">
<Object key="{art.key}" name="{art.title}" size="1 1 0.05"/>
<Object name="Caption" size="0.6 0.3 0.05"/>
部品を使った所に size を書かなければ、部品の中のルートの GameObject の size が、使った所の大きさになります。
<Row name="Books" spacing="0.02" align="bottom">
<Book name="C" size="0.08 0.25 0.2"/>
<!-- file: Assets/Example/Book.mochi.xml -->
<Object name="Cover" size="0.05 0.3 0.2" pivot="0.5 0 0.5"/>
| |
|---|
| 条件 | 部品の本体(<Props> を除く)が 1 つのホストで、それが size を書いているか、<Row>・<Grid> であることです |
使う所の size | 書けば、そちらを使います |
使う所の pivot | 部品の中のルートを、(ルートの pivot − 使う所の pivot)× size だけずらします |
中のルートに position・scale がある部品 | 使う所に pivot を書いたときだけ、大きさ(ルートの size × scale)を使う所へ渡します。ルートはその箱を pivot で置き直す位置へ動きます(ルートの position は無視されます)。pivot を書かなければ大きさを渡しません |
中のルートに rotation がある部品 | 大きさを使う所へ渡しません。使う所に pivot を書くと、まだ対応していないためエラーになります。prefab のルートが回っている <Prefab> も、回したルートに数えます |
本体が size の無い <Prefab> 1 つの部品 | 大きさは持ちません。<Row>・<Grid> の中でだけ、その <Prefab> を測った箱で並べます |
inspect は、大きさの分かる GameObject(size を書いた物・<Row> と <Grid>・ルートに size のある部品を置いた所)どうしの重なりと、大きさを持つ最も近い祖先からのはみ出しを数えます(数え方は inspect)。大きさの分からない GameObject は数えないので、重なりが 0 でも、ぶつかっていないことの根拠にはなりません。