コンテンツにスキップ

導入と生成

.mochi.xml を書いてから、Unity が prefab を生成し、ワールドをアップロードするまでの扱いです。

部品は、.mochi.xml の 1 ファイルが表す、名前の付いたオブジェクトの組です。次の例では、Assets/Hall/ のエントリポイントが Assets/Parts/ の部品 Sign を使っています。

Assets/Hall/Hall.mochi.xml
<Hall prefab="true">
<Sign position="0 2 0"/>
</Hall>
<!-- file: Assets/Parts/Sign.mochi.xml -->
<Sign>
<Object name="Board" scale="2 1 0.1">
<MeshFilter mesh="builtin:Cube"/>
</Object>
</Sign>
ファイル名<部品の名前>.mochi.xml です。拡張子は小文字の .mochi.xml だけを部品として扱います
ルート要素部品の名前と同じ名前です。大文字と小文字も区別します
ファイルの作り方Project ウィンドウで Assets > Create > MoCHI File を選ぶと、選んだフォルダにエントリポイントの雛形を作ります。入力した名前がファイル名とルート要素の名前になり、空白は _ になります。部品の名前に使えない名前のときは作らず、Console に理由が出ます
部品の使い方部品の名前をタグとして書きます(<Sign/>)
部品を探す範囲プロジェクトの Assets/ と Packages/ のフォルダの下の全部です(Unity がパッケージのキャッシュにだけ置いているパッケージは探しません)。import の記述はありません
部品の名前の重複同じ名前の部品が 2 つあると、その名前を使った所でエラーになります。使わなければエラーになりません
使えない名前Object・Prefab・Props・Prop・For・If・Else・Slot・At・Row・Grid・Transform は、部品の名前にできません(組み込みの要素の名前と、要素ではない Transform)
部品の中の部品書けます。ただし、部品が自分自身を使うとエラーになります
書き方番号例
ファイル名と大文字小文字が違うルート要素MOCHI1003root-name-mismatch
2 つのフォルダにある同じ名前の部品MOCHI3002duplicate-part-name
組み込みの要素と同じ名前のファイルMOCHI3003builtin-part-name
自分自身を使う部品MOCHI3004part-cycle

エントリポイントは、ルート要素に prefab="true" を書いたファイルです。保存すると、MoCHI がこのファイルから prefab を 1 つ生成します。

Assets/Example/Stage.mochi.xml
<Stage prefab="true" position="0 1 0">
<Object name="Floor"/>
</Stage>
ルート要素の属性prefab です。値は true か false です。エントリポイントのルート要素には、inspect の歩き方の設定 walkFrom・playerRadius・playerHeight・minPassageWidth も書けます(ルート要素)
エントリポイントの props値を渡す側が無いので、全部の props に default が必要です
prefab のルートGameObject の名前は部品の名前です。位置は原点で、変更できません
保存で生成する範囲Assets/ の下のエントリポイントだけです。Packages/ の下のファイルは、prefab="true" があっても保存では生成しません
書き方番号例
ルート要素に書いた positionMOCHI1005root-attribute
default の無いエントリポイントの propsMOCHI3008entry-prop-without-default
生成の契機エントリポイントか、それが読むファイル(部品・prefab・画像・表・マテリアル)が保存され、Unity がインポートした後です
Play モード中の保存Edit モードに戻ってから生成します
生成物の配置先Assets/MoCHI Generated/ の下に、エントリポイント 1 つにつきフォルダ 1 つを作ります。フォルダは、エントリポイントのパスから先頭の Assets/ と末尾の .mochi.xml を除いた名前です
配置先の例Assets/Gallery/Gallery.mochi.xml からは Assets/MoCHI Generated/Gallery/Gallery/Gallery.prefab を生成します
フォルダの中身prefab(<部品の名前>.prefab)と、マテリアルの複製(マテリアルの複製)と、生成の記録(.mochi-record)です
書くファイル中身が変わるファイルだけです
エラーの扱いprefab とマテリアルは書かず、前の出力を残します(生成の記録と、T# スクリプトを持つ部品の <Name>.Mochi.cs は書きます)。エラーは Console に [MoCHI] <ファイル>(<行>,<列>): error MOCHInnnn: <文> の形式で出ます
警告の扱い生成がファイルを書いたか消したときだけ、Console に [MoCHI] <ファイル>(<行>,<列>): warning MOCHInnnn: <文> の形式で出ます。何も変えない保存では出ません
成功の扱いConsole に [MoCHI] Generated <prefab のパス> from <エントリポイント>. と出ます
パッケージの更新後全部のエントリポイントを 1 回生成し直します
生成物の手での変更そのエントリポイントの生成は一時停止し、Console にエラーが出ます。ワールドのアップロードも停止します
変更の破棄生成物の Inspector の Regenerate (discard changes) か、TsukimiCode > MoCHI > Regenerate で、変更を捨てて生成し直します
生成物を変えたい場合.mochi.xml を変更するか、シーンに置いた prefab のオーバーライドを使います
変更せずに保存した prefab生成物の prefab を Unity で開き、何も変えずに保存しただけでは、手での変更と見なしません
生成物の prefab の削除そのエントリポイントは生成をやめた状態になります。Regenerate で再開し、生成が不要なら prefab="true" を外します
.mochi.xml の削除生成物は残り、Console に警告が出ます。不要なら、TsukimiCode > MoCHI > Clean Up Outputs Without a Source で削除します(元のファイルが無い生成物の削除)
Unity の中での移動と改名生成物のフォルダも一緒に移動します。prefab の GUID は変わらないので、シーンからの参照は保たれます

生成物の prefab を Inspector で開くと、上端に次の 5 種類の表示が出ます。

表示意味
Generated by MoCHI from <元のファイル>. Edit the source file; changes made here stop the next generation.生成物には常に出ます。Select source で元のファイルを選択します
This prefab was changed after it was generated, so generation is paused.手での変更で一時停止しています。Regenerate (discard changes) のボタンが出ます
The last generation failed (see the Console).前回の生成がエラーになりました
Generation from the source is stopped.生成をやめた状態です
Waiting for T# to compile the T# scripts of its parts. The prefab is updated after that.T# スクリプトのコンパイルを待っています(2 段の生成)
メニューTsukimiCode > MoCHI > Regenerate。Project ウィンドウの右クリックの MoCHI > Regenerate も同じです
選択する物.mochi.xml か、生成物のフォルダの中のアセット
動作手での変更を捨てて生成し直します。生成をやめていたエントリポイントも再開します
prefab="true" の無いファイル生成せず、Console に警告が出ます
全部を作り直すTsukimiCode > MoCHI > Regenerate All(右クリックの MoCHI にもあります)です。選択しなくても、Assets/ の下の全部のエントリポイントを同じように生成し直します

元のファイルが無い生成物の削除

Section titled “元のファイルが無い生成物の削除”
メニューTsukimiCode > MoCHI > Clean Up Outputs Without a Source。Project ウィンドウの右クリックのメニューにはありません
対象Assets/MoCHI Generated/ の下に生成の記録が残っていて、記録の元の .mochi.xml が無いエントリポイントです。選択は必要ありません。.mochi.xml が在れば、prefab="true" を外したエントリポイントも対象になりません
対象が無い場合何も削除せず、Console に [MoCHI] Every output generated by MoCHI still has its .mochi.xml. Nothing to clean up. と出ます
確認のウィンドウ削除の前に出ます。エントリポイントごとに元のパスと、生成物のファイルの数とフォルダを並べます(11 件目からは件数だけです)。Delete で削除し、Cancel では何も削除しません
削除する物生成の記録に載っている生成物のうち、今もフォルダの中にあるファイルと、生成の記録です。MoCHI が生成していないファイルは削除しません
フォルダの削除中が空になるフォルダだけを、Assets/MoCHI Generated/ の下で上へ順に削除します。ほかのファイル(別のエントリポイントの生成物を含みます)が残るフォルダは削除しません
シーンと prefab への影響削除した prefab のインスタンスは、置いていたシーンと prefab で Missing Prefab になります
終わったときの表示Console に [MoCHI] Deleted the files generated from n MoCHI source(s) that no longer exist: <元のパス>. と出ます。残したフォルダがあれば、同じ行の Kept <フォルダ>: … に出ます。削除できなかった物は、[MoCHI] Could not delete <パス>. の警告に出ます
Play の前Edit モードを出るときに、全部のエントリポイントを検査します。最新でない物は、Play モードに入った後で Console に警告します。Play は停止しません
ワールドのアップロードの前VRChat SDK でワールドをビルドするときに、Assets/ の下の全部のエントリポイントを検査します。アップロードするシーンが使う生成物の prefab のエントリポイントに、エラー・最新でない・手で変更された・コンパイル待ちのどれかが 1 つでもあれば、ビルドを停止します
シーンが使っていないエントリポイント検査して、問題があれば Console に警告します。ビルドは停止しません
アップロードを停止しない物生成をやめたエントリポイントと、元のファイルを削除したエントリポイントです
停止したときの文面[MoCHI] Build stopped: n generated prefab(s) do not match their source. に続けて、直し方が出ます