GameObject に足すコンポーネント、Unity で作った prefab の配置と変更、部品が中身を受け取る <Slot> の書き方です。
足せるコンポーネントは 147 種類です。属性と値はコンポーネントの一覧にあります。
<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 name="Lamp" position="0 2 0">
<Light type="Spot" color="#FFE6CC" intensity="2.5" range="6" spotAngle="45" shadows="Soft" lightmapBakeType="Baked"/>
<AudioSource playOnAwake="false" volume="0.5" loop="true" spatialBlend="1" minDistance="1" maxDistance="20"/>
MeshRenderer に mainTexture か color を書くと、material の .mat を複製し、画像と色を設定した複製を参照します。
<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"/>
| |
|---|
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 の複製が同じファイル名になり(大文字小文字だけが違う名前・ファイル名に使えない字だけが違う名前)、違う画像か色を設定するとエラーになります。どちらかの名前を変えます |
<Prefab src="…"> は、Unity で作った prefab のインスタンスを置きます。属性と置ける子は <Prefab> にあります。
<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"/>
| |
|---|
position | <Prefab> に書いた値です。書かなければ 0 0 0 です |
rotation・scale・active・static | 書かなければ prefab のルートの値のままです(Unity で prefab をシーンへ置いたときと同じ)。書くと置き換えます |
| 読み込みでルートが回るモデル | Unity の表示と同じ向きで置きます。その回転は、書いた rotation と同じく、レイアウト・inspect・gap に適用されます。rotation="0 0 0" と書くと回転を消せます |
| ルートが RectTransform の prefab | Canvas の下では、書かなければ anchoredPosition も RectTransform のほかの値も prefab の値のままです |
| 中の UdonBehaviour | prefab の中の GameObject には key が無いので、UdonBehaviour が 2 つ以上ある GameObject はパスで指せません(MOCHI1009) |
prefab の中の変更(<At>・コンポーネントの変更・path のある <Slot>)は、部品のファイルにだけ書けます。エントリポイントで変更する場合は、<Prefab> を包む部品を作って使います。
<Framed position="0 1.5 0"/>
<!-- file: Assets/Example/Framed.mochi.xml -->
<Prefab src="../Kit/KitFrame.prefab">
<At path="Plate/Label" active="false"/>
<MeshRenderer material="../Art/Frame.mat"/>
<Prefab src="../Kit/KitFrame.prefab">
<At path="Plate/Label" active="false"/>
<Slot> は、部品の中で、部品を使う側が子として書いた中身を受け取る位置です(属性は <Slot>)。
<Object name="Title" slot="title"/>
<!-- file: Assets/Example/Card.mochi.xml -->
<Object name="Top"><Slot name="title"/></Object>
<Object name="Bottom"><Slot/></Object>
| |
|---|
| 中身の書き方 | 部品のタグの子として書きます。<For> と <If> の中の子にも slot を書けます |
| 中身の束縛 | 中身を書いたファイルの props と行を読みます。部品の props は読めません |
| 行き先の無い中身 | エラーになります |
<Object name="Picture" slot="content"/>
<!-- file: Assets/Example/Framed.mochi.xml -->
<Prefab src="../Kit/KitFrame.prefab">
<Slot name="content" path="Mount"/>
fill は、prefab のルートの下に足す子を、prefab の中で名前がパターンに合うオブジェクト(取り付け位置)へ 1 つずつ付けます。
<!-- file: Assets/Example/Rooms.mochi.xml -->
<Prefab src="../Kit/KitRoom.prefab" fill="Mount*">
<For each="art" in="folder('../Gallery/art/')">
<Object key="{art.key}" name="{art.title}"/>
| |
|---|
| パターン | * は任意の文字の並び(空を含む)に合います。名前の全体と比べます |
| 付ける順 | prefab のヒエラルキーを深さ優先でたどった順です。名前の中の数は読みません。例の KitRoom.prefab では Mount1・Mount0・Mount3・Mount2 の順です |
| 数える子 | prefab のルートの下に足す子だけです。<At> で足した子とコンポーネントの変更は数えません |
| 余った取り付け位置 | 空のままです |
| 足りない取り付け位置 | エラーになります(overflow="repeat" を書いた場合を除く) |
overflow="repeat" を書くと、取り付け位置より子が多い場合に、同じ prefab のインスタンスを足して続きを埋めます。
<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 each="row" in="table('../Data/art.csv')">
<Object key="{row.key}" name="{row.title}"/>
| |
|---|
gap | 1 つのインスタンスから次のインスタンスまでのずれ(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 が無くてもエラーになりません。
<Prefab src="../Kit/KitRoom.prefab" fill="Mount*" overflow="repeat">
<For each="art" in="folder('../Gallery/art/')">
<Object key="{art.key}" name="{art.title}"/>