部品の引数である props の渡し方と、生成し直しても同じ GameObject として扱うための同一性(key)の規則です。要素と属性の一覧は要素のリファレンス、値の書き方は値の文法にあります。
props は部品の引数で、部品はルート要素の直下の <Props> に <Prop> で宣言し、使う側は部品のタグに属性として値を書きます(<Prop> の属性は <Prop>)。
<Plaque name="Entrance" title="Welcome"/>
<Plaque name="Exit" title="Goodbye" offset="0 2 0" position="6 0 0"/>
<!-- file: Assets/Hall/Plaque.mochi.xml -->
<Prop name="title" type="string"/>
<Prop name="offset" type="Vector3" default="0 1.5 0"/>
<Object name="{title}" position="{offset}"/>
| |
|---|
| ホストの共通の属性 | 使った所の GameObject の属性で、props にはなりません |
default の無い props | 使う側で必ず渡します |
| 値の書き方 | props の型ごとの書き方と変換は値の文法にあります |
Object の props | 同じ prefab の中の物を部品へ渡します。パスは使う所から数え、部品の中では物を指す属性と UnityEvent の要素に書きます。default は書けないので、使う所で必ず渡します。下の例の ../Exit は Bench の兄弟で、Seat へそのまま渡しても Bench から数えます |
<Object name="Exit" position="0 0 3"/>
<Bench name="Bench" target="../Exit"/>
<!-- file: Assets/Hall/Bench.mochi.xml -->
<Prop name="target" type="Object"/>
<Seat name="Left" target="{target}" position="-0.5 0 0"/>
<Seat name="Right" target="{target}" position="0.5 0 0"/>
<!-- file: Assets/Hall/Seat.mochi.xml -->
<Prop name="target" type="Object"/>
<VRCStation stationExitPlayerLocation="{target}"/>
同一性は、生成し直しても同じ GameObject として扱うための、ルートから並べた区切り(key か name)の列です。
<Object name="Pillar" key="left" position="-2 0 0"/>
<Object name="Pillar" key="right" position="2 0 0"/>
<For each="art" in="folder('../Gallery/art/')">
<AudioSource key="music" volume="0.5"/>
<AudioSource key="voice"/>
| |
|---|
| GameObject の区切り | key を書けばその値、書かなければ name です |
<For> の中 | key を書かなければ、name とその行の key を区切りにします(GameObject の名前は name のままです)。key を定数にすると、全部の行が同じ区切りになります |
| 保たれる物 | 同一性が同じ GameObject は、生成し直しても prefab の中で同じ ID を保ちます。画像の追加・GameObject の挿入・並べ替えでは、ほかの GameObject の ID は変わらないので、シーンからの参照とオーバーライドは保たれます |
| 変わる物 | key の無い GameObject の名前の変更と、<For> の行の key(folder() ならファイル名)の変更です |
| コンポーネント | 同じ GameObject のコンポーネントは、型と key で区別します。key の無いコンポーネントは、型と、同じ型の key の無いコンポーネントの中での順で区別します。key の無いコンポーネントの前に同じ型を 1 つ足すと ID がずれ、シーンが 1 つ目の AudioSource を指していた参照とオーバーライドは、足した物へ移ります |
コンポーネントの key | 足すときに key を書くと(<AudioSource key="music"/>)、同じ型をどこに足しても ID は変わりません。すでにあるコンポーネントに key を付けると、その ID が 1 回変わり、後ろにある同じ型の key の無いコンポーネントの ID もずれます。その GameObject の同じ型のコンポーネントにはまとめて key を付け、シーンで指し直します。<For> の中では定数の key でかまいません(行が GameObject の同一性に入るため) |
| ID が移ったときの警告 | 生成し直して、key の無いコンポーネントの ID が同じ型の別のコンポーネントのものになったとき(前に同じ型を足した・前の同じ型を削除したか動かした、その ID を持っていた物を削除した、どれかに key を付けた)、生成した prefab を直に置いたシーンか prefab がその ID をオーバーライドしているか、指しているか、インスタンスから削除していれば、Console の警告がそのシーンか prefab と GameObject とコンポーネントの型を言います(MoCHI が生成するシーンと prefab は見ません)。オーバーライドか参照を設定し直すか、削除したコンポーネントを戻して意図した物を削除します |
| 見分けられない変更 | GameObject に同じ型の key の無いコンポーネントが 2 つ以上ある(あった)ときは、生成し直して値が変わったコンポーネントと移ったコンポーネントを見分けられません。そのため、値が変わった ID も、どちらが起きたかを見分けられないと警告します。それらに key を付けると、警告は出なくなります。同じ型の key の無いコンポーネントが 1 つだけなら、値を変えただけでは警告しません |
| 今は無い ID | 警告しません。Unity が、その ID への参照を Missing と表示し、その ID へのオーバーライドを使われないオーバーライドとして残します |
| 同一性の重複 | 同じ親の下で 2 つの GameObject の同一性が重なると、エラーになります |