コンテンツにスキップ

値の文法

属性の値の文法を、XML 1.0 の仕様と同じ記法の EBNF で定義します。どの属性がどの規則で読まれるかは、末尾の属性ごとの規則にあります。

記法意味
A ::= …規則 A の定義
"text"その文字の並び
[0-9]範囲の中の 1 文字
[^…]挙げた文字以外の 1 文字
A?0 回か 1 回
A*0 回以上
A+1 回以上
A BA の後に B
A | BA か B
A - BA のうち、B に当たらない物
#x20空白(U+0020)
/* … */注記
[MOCHInnnn]規則を満たさないときに出る診断の番号です。部品のタグに書く props と <Prop default> では、型に合わない値はどれも MOCHI3006 です
改行とタブXML の規則で、属性の値の中の改行とタブは空白(#x20)に置き換わってから読まれます。改行は &#10; と書きます(text="1 行目&#10;2 行目")
文字参照&quot;・&amp; などは、XML が文字に戻した後の値を読みます
AttributeValue ::= Escaped | Binding | Plain
Escaped ::= ( "{{" Char* ) - ( "{{" Char* "}}" Char* ) /* 先頭の "{" を 1 つ除いた文字になる */ [MOCHI5002]
Binding ::= "{" S* Reference S* "}" [MOCHI5002]
Plain ::= [^{]* /* "{" を含まない */ [MOCHI5002]
Char ::= /* 任意の 1 文字 */
S ::= /* 空白 */
Plain属性の型(float・Vector3・パスなど)の値として読みます
Bindingprops か <For> の行の値を読み、属性の型に変換します(束縛)
Escaped{ で始まる文字を書くときの形です。先頭の { を 1 つ除くだけで、ほかは変えません。"{{draft}" は {draft}、"{{score} pts}" は {score} pts} という文字です
{{ で始まり、そのあとに }} がある値"{{score}}" と "{{score}} pts" は MOCHI5002 です(その }} がそのまま残り、{score}} pts になるためです)。{score} は "{{score}"、{score} pts は "{{score} pts" と書きます。{ で始まり }} を含む文字は、この書き方では書けません
Assets/Example/Notes.mochi.xml
<Notes prefab="true">
<Object name="{{draft}"/>
</Notes>
書き方番号例
{{ で始まり }} で終わる値MOCHI5002literal-brace-closing
{{ で始まり、途中に }} がある値MOCHI5002literal-brace-closing-middle

束縛は、属性の値を {名前} か {行.列} と書いて、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 です
Assets/Example/Rooms.mochi.xml
<Rooms prefab="true">
<For each="art" in="folder('../Gallery/art/')">
<Object key="{art.key}" name="Room {art.title}"/>
</For>
</Rooms>
書き方番号例
文字の途中の束縛MOCHI5002binding-in-text
名前の無い {}MOCHI5002binding-empty
. が 2 つある束縛MOCHI5002binding-two-dots
- を含む props の名前の束縛MOCHI5002binding-name-hyphen
列を書かない行の名前MOCHI5002row-without-column
部品の中から読む、使う側の <For> の行MOCHI5001caller-row-not-visible
default の中の束縛MOCHI5001default-with-binding
関数を呼ぶ束縛MOCHI5002binding-call
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]
Sign ::= "+" | "-"
Digits ::= [0-9]+
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 桁です
Assets/Hall/Hall.mochi.xml
<Hall prefab="true">
<Props>
<Prop name="題名" type="string" default="Welcome"/>
<Prop name="count" type="int" default="2.0"/>
</Props>
<Object name="{ 題名 }" position="+1 .5 2." scale="1 1 1" static=""/>
<Grid columns="{count}">
<Object size="1 1 0"/>
</Grid>
<Object name="Lamp">
<Light color="#ffe6cc80"/>
</Object>
</Hall>
Vector3 ::= Sp* Number Sp+ Number Sp+ Number Sp* [MOCHI1009]
Sp ::= #x20
区切り空白だけです。空白はいくつ続けてもよく、前後の空白も読み飛ばします。カンマは書けません
Color ::= "#" Hex Hex Hex Hex Hex Hex ( Hex Hex )? [MOCHI1009]
Hex ::= [0-9A-Fa-f]
成分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 は、その文字として読みます
書き方番号例
指数表記の数(1e3)MOCHI1009number-exponent
カンマで区切った Vector3MOCHI1009vector-comma
数が 2 つの Vector3MOCHI1009vector-two-numbers
色の名前(orange)MOCHI1009color-name
3 桁の色(#FFF)MOCHI1009color-short
大文字で始まる FalseMOCHI1009bool-capital
空の nameMOCHI1009name-empty
Path ::= PathChar+ /* 先頭の "/" は書けない */ [MOCHI2001]
PathChar ::= [^\:] /* "\" と ":" 以外 */ [MOCHI2001]
Assets/・Packages/ で始まるパスプロジェクトのルートからのパスです。大文字と小文字を区別するので、assets/ は相対パスになります
それ以外のパスそのパスを書いたファイルのフォルダからの相対パスです。表の列に書いたパス(file 列と、パスとして使うほかの列)は、表のファイルからの相対パスです
部品へ渡したパス渡した側のファイルから解決します
props の default のパス部品のファイルから解決します
.・..・空の区切り. と // は読み飛ばし、.. は 1 つ上のフォルダです
プロジェクトの外Assets/ と Packages/ の外を指すパスは書けません(MOCHI2001)
builtin: で始まる名前パスではありません。: を含むので、パスを書く所に書くと MOCHI2001 です
指す物の確認ファイルが無ければ MOCHI2002、.meta が無ければ MOCHI2009、アセットの種類が違えば MOCHI2008 です
Assets/Example/Entrance.mochi.xml
<Entrance prefab="true">
<Prefab src="Assets/Kit/KitFrame.prefab" name="FromRoot"/>
<Prefab src="../Kit/KitFrame.prefab" name="FromHere" position="1 0 0"/>
</Entrance>

次の例では、部品 Picture が Assets/Parts/ にあり、渡した画像のパスは Assets/Gallery/Wall.mochi.xml から、default の画像のパスは Assets/Parts/Picture.mochi.xml から解決します。

Assets/Gallery/Wall.mochi.xml
<Wall prefab="true">
<Picture name="Left" label="Sea" image="art/01_Sea.png"/>
<Picture name="Right" label="Moon" position="2 0 0"/>
</Wall>
<!-- file: Assets/Parts/Picture.mochi.xml -->
<Picture>
<Props>
<Prop name="label" type="string"/>
<Prop name="image" type="Texture" default="../Gallery/art/02_Moon.png"/>
</Props>
<Object name="{label}">
<MeshFilter mesh="builtin:Quad"/>
<MeshRenderer material="../Art/Frame.mat" mainTexture="{image}"/>
</Object>
</Picture>
書き方番号例
\ で区切ったパスMOCHI2001path-backslash
Assets/ の外を指すパスMOCHI2001path-outside

<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拡張子を除いたファイル名
titlename から、先頭の番号と区切り(_・-・空白・.)を除いた物。01_Sea は Sea です
keyファイル名(拡張子を含む)。この行の key です
index0 から数えた順番
Assets/Gallery/Room.mochi.xml
<Room prefab="true">
<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}"/>
</Object>
</For>
</Room>
形式.csv か .json です(拡張子の大文字と小文字は区別しません)。ほかの拡張子は MOCHI2007 です
CSV1 行目が見出しです。" で囲むと , と改行を含められ、"" は " 1 つです。欄の前後の空白は値に残ります。値は全部 string です
JSON平らなオブジェクトの配列です。値は文字・数・true/false です。数は指数表記(1e3)も読みます
行の keyid 列があればその値で、無ければ file 列に書いた文字です。id 列を置いた表は、全部の行で id を埋めます。JSON では、どれかの行に id があれば、全部の行に id が必要です
file 列表のファイルから解決し、ファイルがあることを確認します。束縛で読むと、プロジェクトのルートからのパスです
予約された列名key・index は列の名前にできません。行の key は id 列で与えます
自動で付く列key・index です(意味は folder() と同じ)
並ぶ順表に書いた順です
Assets/Example/Index.mochi.xml
<Index prefab="true">
<For each="r" in="table('rooms.csv')">
<Object name="{r.title}" key="{r.key}"/>
</For>
</Index>
<!-- file: Assets/Example/rooms.csv -->
id,title
east,"East Room, upstairs"
west,West Room
Assets/Example/Index.mochi.xml
<Index prefab="true">
<For each="r" in="table('rooms.json')">
<Object name="{r.title}" key="{r.key}" active="{r.open}"/>
</For>
</Index>
<!-- file: Assets/Example/rooms.json -->
[
{ "id": "east", "title": "East Room", "open": true },
{ "id": "west", "title": "West Room", "open": false }
]
書き方番号例
二重引用符で囲んだ引数MOCHI2007data-source-double-quote
key という名前の列MOCHI2005table-key-column
id 列も file 列も無い表MOCHI2006table-row-without-key
id を空にした行MOCHI2006table-empty-id
Static ::= Sp* ( StaticWord ( Sp+ StaticWord )* )? Sp* [MOCHI1009]
StaticWord ::= "lighting" | "occluder" | "batching" | "occludee" | "reflection"

語は次の 5 個で、Unity の Static のフラグに 1 つずつ対応します。フラグは書いた GameObject だけに付き、下の GameObject には付きません(下の物にも付けるときは、それぞれに書きます)。

語Unity のフラグ
lightingContribute GI
occluderOccluder Static
batchingBatching Static
occludeeOccludee Static
reflectionReflection Probe Static
EnumValue ::= EnumName [MOCHI1009]
ComponentEnum ::= Sp* EnumName ( Sp+ EnumName )* Sp* [MOCHI1009]
/* 2 つ以上の名前は、組み合わせ([Flags])の列挙だけ */
EnumName ::= /* 属性ごとの一覧の名前。大文字と小文字を区別する */
属性規則名前
<Row>・<Grid> の alignEnumValuebottom・center・top
<Prefab> の overflowEnumValuerepeat
コンポーネントの属性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 の型書ける値
boolBool
intInt
floatNumber
stringString。束縛で読んだ数と bool は、その文字になります
Vector3Vector3
ColorColor
TexturePath。画像・.asset に保存した Texture2D・.renderTexture
MaterialPath。.mat
GameObjectPath。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・keyText使える
ホストposition・rotation・scaleVector3使える
ホストsizeVector3(各 0 以上)使える
ホストpivotVector3(各 0〜1)使える
ホストactiveBool使える(実行時に変わる値も)
ホストstaticStatic使える
ルート要素prefabBool使えない
エントリポイントのルート要素walkFromVector3使えない
エントリポイントのルート要素playerRadiusNumber 1 つ(0.1 以上)使えない
エントリポイントのルート要素playerHeight・minPassageWidthNumber 1 つ(0 より大きい)使えない
<Prefab>srcPath(.prefab)使える
<Prefab>fillFillPattern使えない
<Prefab>overflow"repeat"使えない
<Prefab>gapVector3使える
<Row>spacingNumber 1 つ(0 以上)使える
<Grid>spacingNumber 1 つか、#x20 で区切った 2 つ(各 0 以上)使える
<Row>・<Grid>alignEnumValue使える
<Grid>columnsInt(1〜10000)使える
<For>eachName使えない
<For>inDataSource使えない
<If>testBool(生成時に決まる値・違えば MOCHI5003)使える
<Slot>nameName使えない
<Slot>pathPrefabPath使えない
中身の要素slotName使えない
<At>pathPrefabPath使えない
<At>activeBool使える(実行時に変わる値も)
<Prop>nameString使えない
<Prop>typePropType使えない
<Prop>defaulttype の型の値(Object には書けない)使えない(Escaped は書ける)
<Prop>runtimeBool使えない
部品のタグpropsprops の型の値(props の値)使える
コンポーネントのタグC# のプロパティ名コンポーネントの一覧の型使える(T# スクリプトを持つ部品の中では実行時に変わる値も)