コンテンツにスキップ

コンポーネントと prefab

GameObject に足すコンポーネント、Unity で作った prefab の配置と変更、部品が中身を受け取る <Slot> の書き方です。

足せるコンポーネントは 147 種類です。属性と値はコンポーネントの一覧にあります。

Assets/Example/Kiosk.mochi.xml
<Kiosk prefab="true">
<Object name="Counter" position="0 0.5 0" static="batching lighting">
<MeshFilter mesh="builtin:Cube"/>
<MeshRenderer material="builtin:Default-Material" shadowCastingMode="TwoSided" receiveShadows="false"/>
<BoxCollider size="1 1 1" center="0 0 0" isTrigger="false"/>
</Object>
<Object name="Lamp" position="0 2 0">
<Light type="Spot" color="#FFE6CC" intensity="2.5" range="6" spotAngle="45" shadows="Soft" lightmapBakeType="Baked"/>
</Object>
<Object name="Speaker">
<AudioSource playOnAwake="false" volume="0.5" loop="true" spatialBlend="1" minDistance="1" maxDistance="20"/>
</Object>
</Kiosk>
書き方番号例
小文字で書いた列挙の値(point)MOCHI1009enum-case
表に無い属性(brightness)MOCHI1005component-attribute

MeshRenderer に mainTexture か color を書くと、material の .mat を複製し、画像と色を設定した複製を参照します。

Assets/Example/Lamp.mochi.xml
<Lamp prefab="true">
<Object name="Bulb" position="0 2 0">
<MeshFilter mesh="builtin:Sphere"/>
<MeshRenderer material="../Art/Frame.mat" color="#FFE6CC" shadowCastingMode="Off"/>
<Light type="Point" color="#FFE6CC" intensity="2.5" range="6"/>
</Object>
</Lamp>
material同じ <MeshRenderer> に必要です。プロジェクトの .mat を指します。組み込みのマテリアル(builtin:Default-Material)は複製できません
設定するプロパティシェーダーのプロパティのうち [MainTexture] と [MainColor] が付いた物です。見つからなければ _MainTex と _Color です
複製の名前<元の .mat の名前>_<GameObject の道>.mat です。道はエントリポイントのルートから、その GameObject までの各 GameObject の key(無ければ name)を _ でつないだ物で、<For> の直下の key の無い GameObject は、行の key を名前の前に置きます。複製は GameObject ごとに 1 つです
複製の配置先prefab と同じ生成物のフォルダです(保存での生成)
名前の衝突違う GameObject の複製が同じファイル名になり(大文字小文字だけが違う名前・ファイル名に使えない字だけが違う名前)、違う画像か色を設定するとエラーになります。どちらかの名前を変えます
書き方番号例
material の無い mainTextureMOCHI1008texture-without-material
組み込みのマテリアルに書いた colorMOCHI2001builtin-material-color
大文字小文字だけ違う 2 つの GameObject が設定する違う画像MOCHI4001same-name-different-image

<Prefab src="…"> は、Unity で作った prefab のインスタンスを置きます。属性と置ける子は <Prefab> にあります。

Assets/Example/Corner.mochi.xml
<Corner prefab="true">
<Prefab src="../Kit/KitFrame.prefab" name="Frame A" position="2 1.5 0" scale="0.5 0.5 0.5">
<Object name="Note" position="0 -0.5 0"/>
</Prefab>
</Corner>
position<Prefab> に書いた値です。書かなければ 0 0 0 です
rotation・scale・active・static書かなければ prefab のルートの値のままです(Unity で prefab をシーンへ置いたときと同じ)。書くと置き換えます
読み込みでルートが回るモデルUnity の表示と同じ向きで置きます。その回転は、書いた rotation と同じく、レイアウト・inspect・gap に適用されます。rotation="0 0 0" と書くと回転を消せます
ルートが RectTransform の prefabCanvas の下では、書かなければ anchoredPosition も RectTransform のほかの値も prefab の値のままです
中の UdonBehaviourprefab の中の GameObject には key が無いので、UdonBehaviour が 2 つ以上ある GameObject はパスで指せません(MOCHI1009)

prefab の中の変更(<At>・コンポーネントの変更・path のある <Slot>)は、部品のファイルにだけ書けます。エントリポイントで変更する場合は、<Prefab> を包む部品を作って使います。

Assets/Example/Wall.mochi.xml
<Wall prefab="true">
<Framed position="0 1.5 0"/>
</Wall>
<!-- file: Assets/Example/Framed.mochi.xml -->
<Framed>
<Prefab src="../Kit/KitFrame.prefab">
<At path="Plate/Label" active="false"/>
<At path="Canvas">
<MeshRenderer material="../Art/Frame.mat"/>
</At>
<At path="Mount">
<Object name="Spot">
<Light type="Spot"/>
</Object>
</At>
</Prefab>
</Framed>
Assets/Example/Wall.mochi.xml
<Wall prefab="true">
<Prefab src="../Kit/KitFrame.prefab">
<At path="Plate/Label" active="false"/>
</Prefab>
</Wall>
書き方番号例
エントリポイントのファイルに書いた <At>MOCHI3013override-in-entry
prefab の中に無いパスMOCHI2010at-path-not-found
prefab のルートに無い <Light> の変更MOCHI3010override-missing-component

<Slot> は、部品の中で、部品を使う側が子として書いた中身を受け取る位置です(属性は <Slot>)。

Assets/Example/Board.mochi.xml
<Board prefab="true">
<Card>
<Object name="Body"/>
<Object name="Title" slot="title"/>
</Card>
</Board>
<!-- file: Assets/Example/Card.mochi.xml -->
<Card>
<Object name="Top"><Slot name="title"/></Object>
<Object name="Bottom"><Slot/></Object>
</Card>
中身の書き方部品のタグの子として書きます。<For> と <If> の中の子にも slot を書けます
中身の束縛中身を書いたファイルの props と行を読みます。部品の props は読めません
行き先の無い中身エラーになります
Assets/Example/Board.mochi.xml
<Board prefab="true">
<Framed>
<Object name="Picture" slot="content"/>
</Framed>
</Board>
<!-- file: Assets/Example/Framed.mochi.xml -->
<Framed>
<Prefab src="../Kit/KitFrame.prefab">
<Slot name="content" path="Mount"/>
</Prefab>
</Framed>
書き方番号例
部品に無い名前の slotMOCHI2012slot-unknown
2 か所に置いた既定の <Slot/>MOCHI3011slot-twice

fill は、prefab のルートの下に足す子を、prefab の中で名前がパターンに合うオブジェクト(取り付け位置)へ 1 つずつ付けます。

Assets/Example/Hall.mochi.xml
<Hall prefab="true">
<Rooms/>
</Hall>
<!-- file: Assets/Example/Rooms.mochi.xml -->
<Rooms>
<Prefab src="../Kit/KitRoom.prefab" fill="Mount*">
<For each="art" in="folder('../Gallery/art/')">
<Object key="{art.key}" name="{art.title}"/>
</For>
</Prefab>
</Rooms>
パターン* は任意の文字の並び(空を含む)に合います。名前の全体と比べます
付ける順prefab のヒエラルキーを深さ優先でたどった順です。名前の中の数は読みません。例の KitRoom.prefab では Mount1・Mount0・Mount3・Mount2 の順です
数える子prefab のルートの下に足す子だけです。<At> で足した子とコンポーネントの変更は数えません
余った取り付け位置空のままです
足りない取り付け位置エラーになります(overflow="repeat" を書いた場合を除く)
書き方番号例
取り付け位置より多い子MOCHI3012too-many-to-fill

overflow="repeat" を書くと、取り付け位置より子が多い場合に、同じ prefab のインスタンスを足して続きを埋めます。

Assets/Example/Hall.mochi.xml
<Hall prefab="true">
<Prefab src="../Kit/KitRoom.prefab" fill="Mount*" overflow="repeat" gap="0 0 12">
<For each="art" in="folder('../Gallery/art/')">
<Object key="{art.key}" name="{art.title}"/>
</For>
<For each="row" in="table('../Data/art.csv')">
<Object key="{row.key}" name="{row.title}"/>
</For>
<Object name="Guide"/>
</Prefab>
</Hall>
gap1 つのインスタンスから次のインスタンスまでのずれ(x y z)です。元のインスタンスの回転(書いた rotation か、書かなければ prefab のルートの回転)で回して適用します
足したインスタンスの名前元の名前 (1)・元の名前 (2) と続きます
元と同じ物回転・拡大・active・Static と、prefab の中の変更のうちコンポーネントの変更と <At> の active と、add="true" で足したコンポーネントです(prefab の中の物や足したほかのコンポーネントを指す値は、そのインスタンスの中の物を指します)
元のインスタンスだけの物<At> と <Slot path> で足した子と、元のインスタンスの取り付け位置に付いた子です。コンポーネントの変更と add="true" で足したコンポーネントから、これらやその下の物を指すとエラーです(MOCHI9001)。prefab の中の物を指せばインスタンスごとにそのインスタンスの物を指し、prefab の外の物は全部のインスタンスで共有します
gap の有無の確認子が取り付け位置より多くなった時点で初めて行います

取り付け位置が足りている間は、gap が無くてもエラーになりません。

Assets/Example/Hall.mochi.xml
<Hall prefab="true">
<Prefab src="../Kit/KitRoom.prefab" fill="Mount*" overflow="repeat">
<For each="art" in="folder('../Gallery/art/')">
<Object key="{art.key}" name="{art.title}"/>
</For>
</Prefab>
</Hall>
書き方番号例
子が取り付け位置より多い場合の、gap の無い overflow="repeat"MOCHI1008repeat-without-gap