MCP サーバの inspect に mochi 引数を渡すと、.mochi.xml を MoCHI でコンパイルして診断・生成する物の数・レイアウトの数を JSON で返します。inspect はディスクのファイルを読むので、先に保存するか、保存していない本文を text と files で渡します。
{ "mochi": { "path": "Assets/Gallery/Gallery.mochi.xml", "tree": true } }
mochi の中に書ける引数は次の 7 個です。
| 引数 | 内容 |
|---|
path | ワールド全体を記述するエントリポイントの .mochi.xml です。プロジェクトのルートからのパス(Assets/ か Packages/ で始まる)で書きます。プロジェクトの中の絶対パスも受け付けます |
projectPath | Unity のプロジェクトのフォルダです。省略すると、サーバの起動時に渡されたフォルダを使います |
text | path のファイルの本文です。渡すと、path に保存されている内容の代わりにこの本文を読みます。path にファイルが無くても構いません |
files | 部品や表の本文の配列([{ "path": …, "text": … }])です。同じパスに保存されているファイルの代わりに読み、保存されていない部品も、保存されている部品と同じように見つけます。パスは path と同じ書き方です |
tree | true で tree を返します。既定では返しません |
svg | true で layout.svg を返します。既定では返しません |
gltf | true で、svg と同じ箱を 3D のファイル(.gltf)にしてプロジェクトの Library/MoCHI/Preview/ の下に書き、layout.gltf にパスを返します。既定では書きません |
保存していない本文を渡す例です。
{ "mochi": { "path": "Assets/Go/GoPuzzle.mochi.xml", "text": "<GoPuzzle prefab=\"true\">…</GoPuzzle>",
"files": [ { "path": "Assets/Kit/Frame.mochi.xml", "text": "<Frame>…</Frame>" } ] } }
| |
|---|
projectPath の省略 | Tsukimi MCP のウィンドウで設定したクライアントは、起動時にプロジェクトのフォルダを渡すので、通常は省略できます |
source・sources との同時指定 | ツールのエラー(isError: true)になります |
| 部品のファイル | 部品は使われた所で確認するので、部品のファイルを渡すと、default の無い props が MOCHI3008 になります |
prefab="true" | 見ません。渡したどの .mochi.xml もエントリポイントとしてコンパイルします |
| 読む物と書く物 | ディスクの内容と、text・files で渡した本文を読みます。書くのは gltf: true のときの .gltf 1 つだけで、生成物ではありません。text と files の本文はプロジェクトに書きません |
| 止めてある定義 | Unity に生成させないように X.mochi.xml.txt の名前で置いた定義も、本文を text に入れ、path を .mochi.xml のパスにすれば確認できます(.txt のパスのまま渡すと MOCHI2001 です) |
| T# スクリプトを持つ部品 | 本文だけでは確認できません。Unity が保存された .cs から作るプログラムアセットが必要なためです |
| 同じパスを 2 回渡す・形が違う | ツールのエラー(isError: true)になります |
最上位のキーは次の 14 個です(counts・layout・tree は compiles が true のときと T# スクリプトのコンパイルを待っているときだけ在り、outputs は compiles が true のときだけ在ります)。
| キー | 内容 |
|---|
schemaVersion | JSON の形式の版です(今は 1) |
entry | 正規化したエントリポイントのパスです |
project | root(プロジェクトのフォルダ)と from(argument か startup)です |
compiles | エラーが無く、prefab を書ける状態なら true です。ワールドの見た目の正しさは表しません |
diagnostics | 診断の配列です(診断の要素) |
diagnosticsOmitted | 診断が 100 件を超えたときだけ在ります。省いた件数を書いた文です |
summary | total・bySeverity・byOrigin です。省いた診断も数えます |
waitingForCompile | エラーは無いが、T# スクリプトのコンパイルを待っている場合だけ在ります。message と files(生成する <Name>.Mochi.cs のパス)です |
counts | objects(ルートを含む GameObject の数)・prefabInstances(prefab のインスタンスの数。中は数えません)・components(MoCHI が足したコンポーネントの数)・partsUsed(部品の名前ごとの使用回数。エントリポイント自身は数えません)です |
layout | 箱の数・重なりとはみ出しの数・歩く距離です(layout) |
tree | tree: true のときだけ在ります。展開した GameObject を 1 行に 1 つ並べた文字の配列です(tree) |
treeOmitted | 行が 300 行を超えたときだけ在ります |
outputs | prefab(bytes と sha256)・files(マテリアルの複製と .meta の path と bytes)・behaviourFiles(生成する <Name>.Mochi.cs の path と bytes)です。prefab のパスは含みません |
generated | Unity がこのエントリポイントから作った prefab が、今の入力から作った物かです。state・prefab(prefab のパス。notGenerated では null)・message(英語の説明)を持ち、いつも在ります(generated) |
| キー | 内容 |
|---|
code | MOCHInnnn の番号です |
severity | error か warning です |
message | 英語の説明です |
location | file(プロジェクトのルートからのパス)・startLine・startCol・endLine・endCol です。始まりと終わりは同じ位置で、位置の無い診断は 1 行 1 列です |
origin | 原因の区分です(原因の区分) |
explain・fix・witness・path | T# の診断とキーの並びを揃えるためのキーで、常に null です |
| キー | 内容 |
|---|
sizeFrom | 使った箱の大きさの由来のうち、最も粗い物です。written(書いた大きさ)・mesh(メッシュの境界)・collider(当たり判定)の順に粗くなります。書いた size と、<Row> と <Grid> の箱と、ルートに size のある部品を置いた所は written です。<Row> と <Grid> が size を書いていない <Prefab> を中の見えるメッシュの境界で測って並べたときも、<Row> と <Grid> の箱は written で、並べた prefab の中の箱は mesh か collider です |
measured | size を持つ GameObject の数です |
notMeasured | size を持たない GameObject の数です。これらは、メッシュか当たり判定から箱を作れたときだけ、重なりとはみ出しに数えます |
boxes | 由来ごとの箱の数です(written・mesh・collider。3 つとも必ず在ります)。メッシュと当たり判定の箱は、1 つにつき 1 つです |
skipped・trigger・disabled・mesh・model・other | 箱にしなかった物の数を、理由ごとに数えた物です。trigger(すり抜ける当たり判定)・disabled(enabled が false の当たり判定か Renderer)・mesh(大きさを読めないメッシュ。Unity がまだ読んでいないモデルの中のメッシュなど)・model(置いたモデルの中の物)・other(Terrain・TerrainCollider・WheelCollider・CharacterController)です。5 つとも必ず在ります |
overlapCount・overlaps | 重なる組の数と、組の配列(a・b・depth)です。組は物ごとに数え、同じ 2 つの物が複数の箱で重なっても 1 件で、a・b は最も深く重なる箱です。深い順に最大 50 件です |
overflowCount・overflows | はみ出しの数と、配列(object・container・amount)です。大きい順に最大 50 件です |
overlapsOmitted・overflowsOmitted | 配列から省いた物があるときだけ在ります |
canvasCount・canvases・sizeDelta・height | World Space の Canvas のルートの数と、配列です。要素は path・identity・at・sizeDelta(value と、from が written か default)・width と height(矩形の幅と高さ。メートル)を持ちます。木の順に最大 50 件です |
inFrontOfCanvasCount・inFrontOfCanvas・canvas | Canvas の見る側にあって Canvas に重なって見えるメッシュと当たり判定の数と、配列です(Canvas の手前)。要素は canvas(path・identity・at)・object(overlaps の a と同じ形)・distance(Canvas の平面からの距離。メートル)を持ち、active でない箱には inactive が付きます。近い順に最大 50 件です |
canvasesOmitted・inFrontOfCanvasOmitted | 配列から省いた物があるときだけ在ります。省いた件数を書いた文です |
svg | svg: true のときだけ在ります。上から見た平面図です |
svgOmitted | 箱が 150 を超え、図を省いたときだけ在ります |
gltf | gltf: true で書けたときだけ在ります。path(プロジェクトのルートからのパス)・boxes(箱の数)・bytes・sha256 です |
gltfOmitted | gltf: true で書かなかったときだけ在ります。理由の文です(Library/ が無い・コンパイルが通らない・箱が多すぎる・書けない) |
walk | 歩き始めが在るときだけ在ります(layout.walk) |
walkOmitted | 歩かなかったときだけ在ります。理由の文です(歩き始めが無い・床が無いなど)。walk と walkOmitted はどちらか 1 つだけ在ります |
a・b・object・container | overlaps の要素の a・b と、overflows の要素の object・container は、path(ルートからの名前の並び)・identity(同一性)・at(書いた場所 ファイル:行:列)・from(箱の由来)を持ちます。置いた prefab の中の箱は inside(prefab のルートからの名前の並び)を、メッシュと当たり判定の箱は component(箱を作ったコンポーネントの型)も持ちます。path は一意とは限らないので、<For> の兄弟は identity で区別します |
| |
|---|
| 重なり | 箱どうしを、向きのある箱で判定します。箱は、書いた大きさ(size を書いた物・<Row> と <Grid>・ルートに size のある部品を置いた所)と、MoCHI が読めるメッシュと当たり判定から作ります。size を書いた物は、自分のメッシュと当たり判定から箱を作りません。面が接するだけの組・書いた大きさの箱とその子孫の箱の組・同じ物の箱どうし(同じ prefab のインスタンスの中の箱どうしを含みます)は数えません |
| はみ出し | 書いた大きさを持つ最も近い祖先の箱から、外へ出た距離です。メッシュと当たり判定の箱は容れ物にしません。容れ物の厚みが 0 の向き(床のような平らな物)は測りません |
| 数の丸め | メートルで 0.0001 単位に丸めた十進です |
| svg の図 | 右が +X、上が +Z、単位はメートルです。重なる組は小さいほうの箱だけを赤く塗り(同じ大きさなら両方)、はみ出した箱は縁を橙にします。メッシュと当たり判定の箱は破線です。箱ごとの <title> に、ルートからの名前の並びが入ります |
| |
|---|
| 重なりとの違い | Canvas とその下の UI は箱を持たないので、Canvas の前に立つ物は重なりに数えません。layout.inFrontOfCanvas は、その代わりに Canvas の手前にある物を挙げます |
| 対象の矩形 | マークアップに書いた World Space の Canvas のルートの矩形です。大きさは sizeDelta、位置は pivot と GameObject の位置・回転・拡大で決まり、厚みは 0 です |
| 見る側 | Canvas のローカル座標の −Z の向きです |
| 数える箱 | メッシュと当たり判定の箱のうち、矩形の見る側に 0.5 m 以内まで来ていて、矩形の平面へ写すと矩形と重なる物です。矩形を貫く箱は距離 0 で数えます。active でない箱も数え、inactive を付けます |
| 数えない物 | 矩形と同じ平面の板・矩形の奥の物・縁が接するだけの物・書いた大きさ(size)の箱・その Canvas とその下の物の箱・Screen Space の Canvas・入れ子の Canvas・置いた prefab の中の Canvas です |
| まとめ方 | Canvas と物の組ごとに 1 件で、物の箱のうち最も近い物を残します |
歩き始めから床の上を体の幅で歩き、道をふさぐ物ごとの距離と、そこまで来られる体の幅を返します。歩き方は、エントリポイントのルート要素の属性で変えます。
<Gallery prefab="true" walkFrom="0 0 -4" minPassageWidth="1.2">
| |
|---|
| 設定 | エントリポイントのルート要素の walkFrom(歩き始め)・playerRadius(体の半径)・playerHeight(体の高さ)・minPassageWidth(欲しい通路の幅)です。値と既定値はルート要素にあります。prefab には書かれません。エントリポイントでない部品のルート要素に書くと MOCHI1005、範囲の外の値と束縛 {…} は MOCHI1009 です。エントリポイントを別のエントリポイントの部品として使ったときは、その設定は適用されません |
| 歩き始め | walkFrom が優先です。無ければ、マークアップに書いた VRCSceneDescriptor の spawns の最初の行き先です。置いた prefab の中の VRCSceneDescriptor は読みません。VRCSceneDescriptor が 2 つ以上あるときと、spawns が空のときは walkOmitted です |
| 床 | 歩き始めの真下にあり、上面が歩き始めの y から 0.05 m 以内の箱のうち、最も高い上面が床の高さです。上面がその高さから 0.05 m 以内の箱を全部床にして、0.1 m の格子で歩きます。段・坂・別の高さの床は上りません |
| 道をふさぐ物 | 床の高さの 0.05 m 上から、playerHeight に 0.4 m を足した高さまでの間に掛かる箱です。当たり判定の無いメッシュの箱もふさぎます。ほかの箱の容れ物になる箱(<Row>・<Grid>・size と子を持つ物)は通り抜けます |
| 距離 | 格子の上の道の長さです。直線より最大で約 8% 長く出ます |
| 図 | svg と gltf には描きません |
| キー | 内容 |
|---|
start・position・spawnCount・spawn | 歩き始めです。from(walkFrom か spawns)・position(prefab のルートからの座標)・at(書いた場所)です。spawns のときは spawnCount(spawns の数)と spawn(最初の行き先の名前の並び)も在ります |
floor・y・cells・area | 歩く床です。y(床の高さ)・boxes(床にした箱の数)・cells(0.1 m の格子の数)・area(立てる面積。平方メートル)です |
values・playerRadius・playerHeight・minPassageWidth・value・bodyWidth・blocksFrom・blocksTo・grid・widthLimit | 使った値です。playerRadius・playerHeight・minPassageWidth は value と from(default か written)を持ちます(minPassageWidth の既定値は null)。ほかに bodyWidth(体の幅)・blocksFrom と blocksTo(道をふさぐ高さの範囲)・grid(格子の間隔 0.1)・widthLimit(測る幅の上限)です |
blockers・containers・inactive | 道をふさぐ箱・通り抜けた容れ物の箱・active でないので無視した箱の数です |
exhibitCount・reachedCount・unreachedCount | 道をふさぐ物(展示物)の数と、そのうち届く物と届かない物の数です。展示物は箱を物ごとにまとめた物です |
exhibits・reached・distance・width・via | 展示物の配列です。届く物を近い順に、届かない物を後に、最大 50 件並べます。object(path・identity・at。置いた prefab の中の物は inside も)・reached・distance(触れられる所まで歩く距離。届かなければ null)・width(そこまで来られる一番太い体の幅)です。via は、台に載る物や壁に埋めた物のように隣に立つ空きが無い物が、接している物を通して届いたときだけ在り、通した物を指します。そのときの distance と width は、通した物の値です |
exhibitsOmitted | 展示物が 50 を超えたときだけ在ります |
unreachableAreaCount・unreachableAreas・min・max・point | 体の入る広さがあるのに、歩き始めから届かない床の数と配列です。大きい順に最大 20 件で、area・min と max(x と z)・point(中の 1 点の x と z)・width(そこへ行ける一番太い体の幅)を持ちます |
unreachableAreasOmitted | 届かない床が 20 を超えたときだけ在ります |
narrowest・toward | 届く展示物への道のうち最も狭い width と、それを決めた point(x と z)と、その道の先の物(toward)です。届く物が在るときだけ在ります |
belowMinPassageWidth・belowMinPassageWidthOmitted | minPassageWidth を書いたときだけ在ります。width が minPassageWidth より狭い展示物を、狭い順に最大 50 件並べた配列(object・width・reached)と、省いた物があるときの文です |
state は次の 7 種類です。判定は Unity が生成するときと同じ規則で、text か files を渡したときは、渡した本文と比べます(message にもそう書かれます)。
| state | 意味 |
|---|
upToDate | 今の入力から作った prefab が在ります |
stale | prefab が今の入力と違うか、まだ作っていません。保存した変更は、Unity がインポートして作り直すまでこの状態です |
handEdited | 生成した後に生成物が手で変更されたので、生成を止めています |
failed | エラーがあって作れません。message は最初のエラーです |
stopped | prefab が削除されたので、生成を止めています |
waitingForCompile | 部品の T# スクリプトのコンパイルを待っています |
notGenerated | Unity が prefab を作らないファイルです。ルート要素に prefab="true" の無い部品・Packages/ の下のファイル・text で渡しただけで保存されていないエントリポイントです。prefab は null です |
| |
|---|
| 並び | 字下げ・名前・<書いたタグ>・@ファイル:行:列(親と同じファイルならファイルを省きます)・既定と違う pos・rot・scale・size・pivot・prefab <パス>・mount <付け先>・components A,B・overrides n・inactive です |
| 用途 | 人と AI が読むための形式で、区切りは決まった形式ではありません |
診断の origin は次の 3 種類で、直す場所が違います。
| 区分 | 意味 | 対処 | 番号の数 |
|---|
subset | MoCHI が受け付けないか、まだ対応していない書き方です | マークアップを直します | 45 |
environment | プロジェクトの物(ファイル・画像・表の行・インポート)が無いか、準備ができていません | プロジェクトを直します | 14 |
tool | 書き手の誤りではない見込みが高いエラーです | そのファイルを添えて報告します | 2 |
| 番号 | 意味と対処 |
|---|
MOCHI9001 | まだ対応していない書き方です。別の書き方にします。欠陥として報告する物ではありません |
MOCHI2009 | アセットに .meta がまだありません。Unity にインポートさせてから、もう一度確認します |
MOCHI8001 | 部品か、関数を呼ぶ束縛が T# を必要としますが、この環境には T# がありません |
MOCHI3016 | T# スクリプトが、MoCHI の生成物と一緒にコンパイルできません。示された場所を直します。場所は .cs か、生成物の失敗した行の元になった .mochi.xml の束縛です |
MOCHI2014 | 不要になった <Name>.Mochi.cs が残っています(警告)。使っていなければ削除します |
全部の番号はエラーにあります。
| 対象 | 扱い |
|---|
| ワールドの見た目・光・歩いた感触 | 答えません。Unity で確認します |
| 箱の無い物どうしの衝突 | 数えません。箱は書いた大きさと、MoCHI が読めるメッシュと当たり判定からだけ作ります。重なりが 0 でも、ぶつかっていないことの根拠にはなりません。Canvas とその下の UI も箱を持たないので、手前の物が UI を隠す配置は layout.inFrontOfCanvas で見ます |
| Unity がまだインポートしていない変更 | generated はディスクのファイルと比べるので、保存した変更は Unity がインポートするまで stale です |
| 保存していない変更 | text と files で渡さない限り見えません |
| T# のコンパイルの状態 | 最新のソースでコンパイルしたかは判定できません(2 段の生成) |
| MOCHI の番号の説明 | T# の diagnostics ツールは TUKI の番号だけを扱い、MOCHI の番号は載っていません。原因の区分で判断します |