属性の値の文法を、XML 1.0 の仕様と同じ記法の EBNF で定義します。どの属性がどの規則で読まれるかは、末尾の属性ごとの規則にあります。
| 記法 | 意味 |
|---|
A ::= … | 規則 A の定義 |
"text" | その文字の並び |
[0-9] | 範囲の中の 1 文字 |
[^…] | 挙げた文字以外の 1 文字 |
A? | 0 回か 1 回 |
A* | 0 回以上 |
A+ | 1 回以上 |
A B | A の後に B |
A | B | A か B |
A - B | A のうち、B に当たらない物 |
#x20 | 空白(U+0020) |
/* … */ | 注記 |
[MOCHInnnn] | 規則を満たさないときに出る診断の番号です。部品のタグに書く props と <Prop default> では、型に合わない値はどれも MOCHI3006 です |
| |
|---|
| 改行とタブ | XML の規則で、属性の値の中の改行とタブは空白(#x20)に置き換わってから読まれます。改行は と書きます(text="1 行目 2 行目") |
| 文字参照 | "・& などは、XML が文字に戻した後の値を読みます |
AttributeValue ::= Escaped | Binding | Plain
Escaped ::= ( "{{" Char* ) - ( "{{" Char* "}}" Char* ) /* 先頭の "{" を 1 つ除いた文字になる */ [MOCHI5002]
Binding ::= "{" S* Reference S* "}" [MOCHI5002]
Plain ::= [^{]* /* "{" を含まない */ [MOCHI5002]
| |
|---|
Plain | 属性の型(float・Vector3・パスなど)の値として読みます |
Binding | props か <For> の行の値を読み、属性の型に変換します(束縛) |
Escaped | { で始まる文字を書くときの形です。先頭の { を 1 つ除くだけで、ほかは変えません。"{{draft}" は {draft}、"{{score} pts}" は {score} pts} という文字です |
{{ で始まり、そのあとに }} がある値 | "{{score}}" と "{{score}} pts" は MOCHI5002 です(その }} がそのまま残り、{score}} pts になるためです)。{score} は "{{score}"、{score} pts は "{{score} pts" と書きます。{ で始まり }} を含む文字は、この書き方では書けません |
<Object name="{{draft}"/>
束縛は、属性の値を {名前} か {行.列} と書いて、props か <For> の行の値を読む書き方です。
Binding ::= "{" S* "!"? S* Reference S* "}" [MOCHI5002]
/* "!": bool の値の否定(実行時に変わる値も) */
Reference ::= Name ( "." Name )? [MOCHI5002]
/* Name 1 つ: props(T# スクリプトを持つ部品では C# のメンバーも) */
/* Name "." Name: <For> の行と、その列 */
/* Name "(" 引数 ")": 関数の呼び出し(T# スクリプトを持つ部品の中だけ) */
| |
|---|
| 書く範囲 | 値の全体です。name="Room {n}" や position="0 {y} 0" のように、文字の途中には書けません |
| 読める名前 | 同じファイルの props と、同じファイルの <For> の行だけです(名前のスコープ)。T# スクリプトを持つ部品では、ほかの名前をその部品の C# のメンバーとして読みます(実行時に変わる値) |
{ と } の内側の空白 | 読み飛ばします。{ title } は {title} と同じです |
| 行の名前だけ | {art} のように行の名前だけを書くとエラーです。列まで書きます({art.title}) |
| 見つからない名前と列 | MOCHI5001 です |
default の中 | 束縛は書けません |
| 関数の呼び出し | {IsCurrent(art.index)} は、T# スクリプトを持つ部品の C# のメソッドを呼びます(実行時に変わる値)。T# スクリプトを持たない部品では MOCHI5002、T# の無い環境では MOCHI8001 です |
| 否定 | {!featured} は bool の値の反対です。bool でない値は MOCHI5002、実行時に変わる bool でない値は MOCHI3006 です |
<For each="art" in="folder('../Gallery/art/')">
<Object key="{art.key}" name="Room {art.title}"/>
Name ::= NameStart NameChar*
NameStart ::= Letter | "_"
NameChar ::= Letter | Digit | "_"
Letter ::= /* Unicode の文字(日本語の文字を含む) */
Digit ::= /* Unicode の十進数字 */
| 使う所 | 補足 |
|---|
| 束縛の名前と列 | {title}・{art.title}。<Prop name> と表の列名はほかの文字も書けますが、束縛で読めるのはこの形の名前だけです |
<For each> | 行の名前 |
<Slot name> と中身の slot | <Slot> の名前 |
| T# スクリプトを持つ部品の props | さらに C# の識別子(ASCII)の制約があります(名前の制約) |
Number ::= Sign? ( Digits ( "." Digits? )? | "." Digits ) [MOCHI1009]
Int ::= Number /* 小数部が 0 の数。"2.0" は 2 */ [MOCHI1009]
| |
|---|
| 十進の数 | 1.5・-2・+1・.5・2. と書けます |
| 非対応の書き方 | 指数表記(1e3)・桁区切り(1,000)・前後の空白・NaN と Infinity です。コンポーネントの float の属性だけは Infinity・-Infinity を書けます |
int の値 | 小数部が 0 の数です。2.0 は 2 として読みます |
| prefab に書く桁 | 丸めて書きます。position と RectTransform の値は小数点以下 4 桁、scale・rotation・コンポーネントの値は 6 桁です |
<Prop name="題名" type="string" default="Welcome"/>
<Prop name="count" type="int" default="2.0"/>
<Object name="{ 題名 }" position="+1 .5 2." scale="1 1 1" static=""/>
<Light color="#ffe6cc80"/>
Vector3 ::= Sp* Number Sp+ Number Sp+ Number Sp* [MOCHI1009]
| |
|---|
| 区切り | 空白だけです。空白はいくつ続けてもよく、前後の空白も読み飛ばします。カンマは書けません |
Color ::= "#" Hex Hex Hex Hex Hex Hex ( Hex Hex )? [MOCHI1009]
| |
|---|
| 成分 | 2 桁ずつ R・G・B・A の順で、各成分は 16 進の値 ÷ 255 です |
| アルファの省略 | #RRGGBB のアルファは 1(FF)です |
| 非対応の書き方 | 色の名前(orange)・3 桁の #FFF・rgb(…) です |
Bool ::= "true" | "false" [MOCHI1009]
| |
|---|
| 大文字と小文字 | 区別します。True・FALSE・1・0 は書けません |
String ::= Char* /* "{" で始める文字は "{{" と書く */
Text ::= String - "" /* name と key: 空でなく、制御文字を含まない */ [MOCHI1009]
| |
|---|
name と key | 空の値と、制御文字を含む値は書けません |
数と bool の値 | 束縛で読んだ数と bool は、その文字として読みます |
Path ::= PathChar+ /* 先頭の "/" は書けない */ [MOCHI2001]
PathChar ::= [^\:] /* "\" と ":" 以外 */ [MOCHI2001]
| |
|---|
Assets/・Packages/ で始まるパス | プロジェクトのルートからのパスです。大文字と小文字を区別するので、assets/ は相対パスになります |
| それ以外のパス | そのパスを書いたファイルのフォルダからの相対パスです。表の列に書いたパス(file 列と、パスとして使うほかの列)は、表のファイルからの相対パスです |
| 部品へ渡したパス | 渡した側のファイルから解決します |
props の default のパス | 部品のファイルから解決します |
.・..・空の区切り | . と // は読み飛ばし、.. は 1 つ上のフォルダです |
| プロジェクトの外 | Assets/ と Packages/ の外を指すパスは書けません(MOCHI2001) |
builtin: で始まる名前 | パスではありません。: を含むので、パスを書く所に書くと MOCHI2001 です |
| 指す物の確認 | ファイルが無ければ MOCHI2002、.meta が無ければ MOCHI2009、アセットの種類が違えば MOCHI2008 です |
<Prefab src="Assets/Kit/KitFrame.prefab" name="FromRoot"/>
<Prefab src="../Kit/KitFrame.prefab" name="FromHere" position="1 0 0"/>
次の例では、部品 Picture が Assets/Parts/ にあり、渡した画像のパスは Assets/Gallery/Wall.mochi.xml から、default の画像のパスは Assets/Parts/Picture.mochi.xml から解決します。
<Picture name="Left" label="Sea" image="art/01_Sea.png"/>
<Picture name="Right" label="Moon" position="2 0 0"/>
<!-- file: Assets/Parts/Picture.mochi.xml -->
<Prop name="label" type="string"/>
<Prop name="image" type="Texture" default="../Gallery/art/02_Moon.png"/>
<MeshFilter mesh="builtin:Quad"/>
<MeshRenderer material="../Art/Frame.mat" mainTexture="{image}"/>
<For> の in に書けるデータは、folder('…') と table('…') の 2 種類です。
DataSource ::= S* ( "folder('" DataPath "')" | "table('" DataPath "')" ) S* [MOCHI2007]
DataPath ::= [^']* /* Path として解決する */ [MOCHI2001]
| |
|---|
| 行 | フォルダの直下にある画像 1 枚につき 1 行です。サブフォルダの中は見ません |
| 画像の拡張子 | .png・.jpg・.jpeg・.tga・.psd・.exr・.hdr・.bmp・.gif・.tif・.tiff です。大文字と小文字は区別しません |
| 並ぶ順 | ファイル名を文字列として序数で比べた順です。10.png は 2.png より前に来ます |
| パス | in を書いたファイルのフォルダから解決します |
| フォルダが無い | MOCHI2003 です |
| 列 | 値 |
|---|
file | 画像のパス(プロジェクトのルートから) |
name | 拡張子を除いたファイル名 |
title | name から、先頭の番号と区切り(_・-・空白・.)を除いた物。01_Sea は Sea です |
key | ファイル名(拡張子を含む)。この行の key です |
index | 0 から数えた順番 |
<For each="a" in="table('../Data/art.csv')">
<Object name="{a.title}" key="{a.key}">
<MeshFilter mesh="builtin:Quad"/>
<MeshRenderer material="../Art/Frame.mat" mainTexture="{a.file}"/>
| |
|---|
| 形式 | .csv か .json です(拡張子の大文字と小文字は区別しません)。ほかの拡張子は MOCHI2007 です |
| CSV | 1 行目が見出しです。" で囲むと , と改行を含められ、"" は " 1 つです。欄の前後の空白は値に残ります。値は全部 string です |
| JSON | 平らなオブジェクトの配列です。値は文字・数・true/false です。数は指数表記(1e3)も読みます |
| 行の key | id 列があればその値で、無ければ file 列に書いた文字です。id 列を置いた表は、全部の行で id を埋めます。JSON では、どれかの行に id があれば、全部の行に id が必要です |
file 列 | 表のファイルから解決し、ファイルがあることを確認します。束縛で読むと、プロジェクトのルートからのパスです |
| 予約された列名 | key・index は列の名前にできません。行の key は id 列で与えます |
| 自動で付く列 | key・index です(意味は folder() と同じ) |
| 並ぶ順 | 表に書いた順です |
<For each="r" in="table('rooms.csv')">
<Object name="{r.title}" key="{r.key}"/>
<!-- file: Assets/Example/rooms.csv -->
east,"East Room, upstairs"
<For each="r" in="table('rooms.json')">
<Object name="{r.title}" key="{r.key}" active="{r.open}"/>
<!-- file: Assets/Example/rooms.json -->
{ "id": "east", "title": "East Room", "open": true },
{ "id": "west", "title": "West Room", "open": false }
Static ::= Sp* ( StaticWord ( Sp+ StaticWord )* )? Sp* [MOCHI1009]
StaticWord ::= "lighting" | "occluder" | "batching" | "occludee" | "reflection"
語は次の 5 個で、Unity の Static のフラグに 1 つずつ対応します。フラグは書いた GameObject だけに付き、下の GameObject には付きません(下の物にも付けるときは、それぞれに書きます)。
| 語 | Unity のフラグ |
|---|
lighting | Contribute GI |
occluder | Occluder Static |
batching | Batching Static |
occludee | Occludee Static |
reflection | Reflection Probe Static |
EnumValue ::= EnumName [MOCHI1009]
ComponentEnum ::= Sp* EnumName ( Sp+ EnumName )* Sp* [MOCHI1009]
/* 2 つ以上の名前は、組み合わせ([Flags])の列挙だけ */
EnumName ::= /* 属性ごとの一覧の名前。大文字と小文字を区別する */
| 属性 | 規則 | 名前 |
|---|
<Row>・<Grid> の align | EnumValue | bottom・center・top |
<Prefab> の overflow | EnumValue | repeat |
| コンポーネントの属性 | ComponentEnum | コンポーネントの一覧の各表の名前です。数で書くことはできません |
PrefabPath ::= "" | ObjectName ( "/" ObjectName )* [MOCHI2010]
ObjectName ::= [^/]+ /* prefab の中の GameObject の名前 */
FillPattern ::= ( [^{/*] | "*" )+ /* "*" は空を含む任意の文字の並び */ [MOCHI1009]
| |
|---|
PrefabPath | <At path>・<Slot path> に書きます。prefab のルートから名前を / で区切って並べ、空文字はルートです。各段で名前がちょうど 1 つの GameObject に合う必要があります。prefab の中の入れ子の prefab の中は指せません |
FillPattern | <Prefab fill> に書きます。GameObject の名前の全体と比べます |
PropType ::= "bool" | "int" | "float" | "string" | "Vector3" | "Color" | "Texture" | "Material" | "GameObject" | "Object" [MOCHI3006]
| props の型 | 書ける値 |
|---|
bool | Bool |
int | Int |
float | Number |
string | String。束縛で読んだ数と bool は、その文字になります |
Vector3 | Vector3 |
Color | Color |
Texture | Path。画像・.asset に保存した Texture2D・.renderTexture |
Material | Path。.mat |
GameObject | Path。prefab かモデル |
Object | 同じ prefab の中の GameObject へのパス(下の表) |
| |
|---|
| アセットの確認 | Texture・Material・GameObject は、ファイルと .meta があることを確認します(.meta が無ければ MOCHI2009)。Unity がインポートした種類も確認します(合わなければ MOCHI2008) |
| 型に合わない値 | MOCHI3006 です |
Object の値 | 使う所に書いたパスを、使う所から数えます。相対パスは部品を使った要素の GameObject から、/ で始めれば使う所のファイルのルートからです |
Object を書ける所 | 部品の中で、同じ prefab の中の物を指す属性・付けた <UdonBehaviour> の物を持つ公開変数の値全体と、UnityEvent の要素のパス(onClick="{target}:Open")です。ほかの部品の Object の props へもそのまま渡せます。それ以外の所に書くと MOCHI3006 です |
Object の誤り | パスの先が無い(MOCHI2015)・属性の型のコンポーネントが無い(MOCHI2016)ときは、パスを書いた使う所を指してエラーになります |
組み込みの属性は、次の 32 行の規則で読みます。
| 要素 | 属性 | 規則 | 束縛 |
|---|
| ホスト | name・key | Text | 使える |
| ホスト | position・rotation・scale | Vector3 | 使える |
| ホスト | size | Vector3(各 0 以上) | 使える |
| ホスト | pivot | Vector3(各 0〜1) | 使える |
| ホスト | active | Bool | 使える(実行時に変わる値も) |
| ホスト | static | Static | 使える |
| ルート要素 | prefab | Bool | 使えない |
| エントリポイントのルート要素 | walkFrom | Vector3 | 使えない |
| エントリポイントのルート要素 | playerRadius | Number 1 つ(0.1 以上) | 使えない |
| エントリポイントのルート要素 | playerHeight・minPassageWidth | Number 1 つ(0 より大きい) | 使えない |
<Prefab> | src | Path(.prefab) | 使える |
<Prefab> | fill | FillPattern | 使えない |
<Prefab> | overflow | "repeat" | 使えない |
<Prefab> | gap | Vector3 | 使える |
<Row> | spacing | Number 1 つ(0 以上) | 使える |
<Grid> | spacing | Number 1 つか、#x20 で区切った 2 つ(各 0 以上) | 使える |
<Row>・<Grid> | align | EnumValue | 使える |
<Grid> | columns | Int(1〜10000) | 使える |
<For> | each | Name | 使えない |
<For> | in | DataSource | 使えない |
<If> | test | Bool(生成時に決まる値・違えば MOCHI5003) | 使える |
<Slot> | name | Name | 使えない |
<Slot> | path | PrefabPath | 使えない |
| 中身の要素 | slot | Name | 使えない |
<At> | path | PrefabPath | 使えない |
<At> | active | Bool | 使える(実行時に変わる値も) |
<Prop> | name | String | 使えない |
<Prop> | type | PropType | 使えない |
<Prop> | default | type の型の値(Object には書けない) | 使えない(Escaped は書ける) |
<Prop> | runtime | Bool | 使えない |
| 部品のタグ | props | props の型の値(props の値) | 使える |
| コンポーネントのタグ | C# のプロパティ名 | コンポーネントの一覧の型 | 使える(T# スクリプトを持つ部品の中では実行時に変わる値も) |