コンテンツにスキップ

props と同一性

部品の引数である props の渡し方と、生成し直しても同じ GameObject として扱うための同一性(key)の規則です。要素と属性の一覧は要素のリファレンス、値の書き方は値の文法にあります。

props は部品の引数で、部品はルート要素の直下の <Props> に <Prop> で宣言し、使う側は部品のタグに属性として値を書きます(<Prop> の属性は <Prop>)。

Assets/Hall/Hall.mochi.xml
<Hall prefab="true">
<Plaque name="Entrance" title="Welcome"/>
<Plaque name="Exit" title="Goodbye" offset="0 2 0" position="6 0 0"/>
</Hall>
<!-- file: Assets/Hall/Plaque.mochi.xml -->
<Plaque>
<Props>
<Prop name="title" type="string"/>
<Prop name="offset" type="Vector3" default="0 1.5 0"/>
</Props>
<Object name="{title}" position="{offset}"/>
</Plaque>
ホストの共通の属性使った所の GameObject の属性で、props にはなりません
default の無い props使う側で必ず渡します
値の書き方props の型ごとの書き方と変換は値の文法にあります
Object の props同じ prefab の中の物を部品へ渡します。パスは使う所から数え、部品の中では物を指す属性と UnityEvent の要素に書きます。default は書けないので、使う所で必ず渡します。下の例の ../Exit は Bench の兄弟で、Seat へそのまま渡しても Bench から数えます
Assets/Hall/Hall.mochi.xml
<Hall prefab="true">
<Object name="Exit" position="0 0 3"/>
<Bench name="Bench" target="../Exit"/>
</Hall>
<!-- file: Assets/Hall/Bench.mochi.xml -->
<Bench>
<Props>
<Prop name="target" type="Object"/>
</Props>
<Seat name="Left" target="{target}" position="-0.5 0 0"/>
<Seat name="Right" target="{target}" position="0.5 0 0"/>
</Bench>
<!-- file: Assets/Hall/Seat.mochi.xml -->
<Seat>
<Props>
<Prop name="target" type="Object"/>
</Props>
<Object name="Cushion">
<VRCStation stationExitPlayerLocation="{target}"/>
</Object>
</Seat>
書き方番号例
宣言していない props を渡すMOCHI3005prop-undeclared
default の無い props を渡さないMOCHI3008prop-missing
ホストの属性と同じ名前の propsMOCHI3007prop-reserved
int の props に渡した 1.5MOCHI3006prop-wrong-type
2 つ目の <Props>MOCHI1004two-props
Object の props の defaultMOCHI1005prop-object-default
Object の props を name に書くMOCHI3006prop-object-as-name
Object の props に渡した、無い物へのパスMOCHI2015prop-object-not-found

同一性は、生成し直しても同じ GameObject として扱うための、ルートから並べた区切り(key か name)の列です。

Assets/Example/Gate.mochi.xml
<Gate prefab="true">
<Object name="Pillar" key="left" position="-2 0 0"/>
<Object name="Pillar" key="right" position="2 0 0"/>
</Gate>
Assets/Example/Shelf.mochi.xml
<Shelf prefab="true">
<For each="art" in="folder('../Gallery/art/')">
<Object name="Frame"/>
</For>
</Shelf>
Assets/Example/Speaker.mochi.xml
<Speaker prefab="true">
<Object name="Box">
<AudioSource key="music" volume="0.5"/>
<AudioSource key="voice"/>
</Object>
</Speaker>
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 の同一性が重なると、エラーになります
書き方番号例
key の無い、同じ名前の兄弟MOCHI4001same-name-siblings
<For> の中の定数の keyMOCHI4001for-constant-key
1 つの GameObject の上で重なったコンポーネントの key(型が違っても)MOCHI4001component-key-twice