夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

バッチファイルで任意の階層にjsonファイルを作成する

本日はバッチファイルを触っていきます。

先日作業の関係でUnityのmanifest.jsonをignoreしないといけないけど、ignoreした場合Clone時などにmanifest.jsonが存在せず自動で作られることで依存関係がエラーを吐いてしまうことがありました。

これは通常UnityではPackageとして読み込まれるファイルがmanifest.jsonに記載されていますが、ignoreに加えられることでCloneした際などに存在しないファイルとして新規で作成されることになる際に、実際に使用しているパッケージと新規で自動作成されたmanifest.json記載のパッケージが異なることが原因です。

今回はこれを解消するためにバッチファイルを作成しました。

バッチファイルとはWindows上で実行できるファイルでコマンドなどを実行することができます。

今回はこれを使用してmanifest.jsonが存在しない場合中身付きで任意のファイルを作成していきます。

①テキストファイルを作成します。

②テキストファイルの拡張子を.batに変更します。

これによりバッチファイルが作成されます。

③VisualStudioCodeやメモ帳などでバッチファイルを開きます。

④次のコードを書き込みます。

@echo off
setlocal

set "dir=%~dp03Unity\Packages"
set "file=%dir%\manifest.json"

if not exist "%dir%" (
    mkdir "%dir%"
)

(
echo {
echo   "dependencies": {
echo     "com.unity.collab-proxy": "1.15.18",
echo     "com.unity.ide.rider": "3.0.14",
echo     "com.unity.ide.visualstudio": "2.0.15",
echo     "com.unity.ide.vscode": "1.2.5",
echo     "com.unity.render-pipelines.universal": "12.1.7",
echo     "com.unity.test-framework": "1.1.31",
echo     "com.unity.textmeshpro": "3.0.6",
echo     "com.unity.timeline": "1.6.4",
echo     "com.unity.ugui": "1.0.0",
echo     "com.unity.visualscripting": "1.7.8",
echo     "com.unity.xr.interaction.toolkit": "2.3.2",
echo     "com.unity.xr.management": "4.3.3",
echo     "com.unity.xr.openxr": "1.4.2",
echo     "com.unity.modules.ai": "1.0.0",
echo     "com.unity.modules.androidjni": "1.0.0",
echo     "com.unity.modules.animation": "1.0.0",
echo     "com.unity.modules.assetbundle": "1.0.0",
echo     "com.unity.modules.audio": "1.0.0",
echo     "com.unity.modules.cloth": "1.0.0",
echo     "com.unity.modules.director": "1.0.0",
echo     "com.unity.modules.imageconversion": "1.0.0",
echo     "com.unity.modules.imgui": "1.0.0",
echo     "com.unity.modules.jsonserialize": "1.0.0",
echo     "com.unity.modules.particlesystem": "1.0.0",
echo     "com.unity.modules.physics": "1.0.0",
echo     "com.unity.modules.physics2d": "1.0.0",
echo     "com.unity.modules.screencapture": "1.0.0",
echo     "com.unity.modules.terrain": "1.0.0",
echo     "com.unity.modules.terrainphysics": "1.0.0",
echo     "com.unity.modules.tilemap": "1.0.0",
echo     "com.unity.modules.ui": "1.0.0",
echo     "com.unity.modules.uielements": "1.0.0",
echo     "com.unity.modules.umbra": "1.0.0",
echo     "com.unity.modules.unityanalytics": "1.0.0",
echo     "com.unity.modules.unitywebrequest": "1.0.0",
echo     "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
echo     "com.unity.modules.unitywebrequestaudio": "1.0.0",
echo     "com.unity.modules.unitywebrequesttexture": "1.0.0",
echo     "com.unity.modules.unitywebrequestwww": "1.0.0",
echo     "com.unity.modules.vehicles": "1.0.0",
echo     "com.unity.modules.video": "1.0.0",
echo     "com.unity.modules.vr": "1.0.0",
echo     "com.unity.modules.wind": "1.0.0",
echo     "com.unity.modules.xr": "1.0.0"
echo   }
echo }
) > "%file%"

endlocal

コードの解説を少々行うとバッチファイルは以下のような定型文を使用しています。

@echo off
setlocal
  ・・・・・
endlocal

@echo offは結果の表示を非表示にしています。今回はファイルが作られていれば結果が確認できるためです。

setlocal~endlocalは一時的な環境変数(パス)を使用するために宣言しています。

set "dir=%~dp03Unity\Packages"
set "file=%dir%\manifest.json"

if not exist "%dir%" (
    mkdir "%dir%"
)

(
echo {
echo   "dependencies": {
      ーーーJsonの中身ーーー
echo   }
echo }
) > "%file%"

では実際の処理ですがset "dir=%~dp03Unity\Packages"dirという環境変数を定義しています。

%~dp03は、バッチファイルを起動したディレクトリ(カレントディレクトリ)のパスを表します。 つまり%~dp03Unity\Packagesで現在バッチファイルを実行した階層を基準にPackagesのフォルダを参照しています。

次の行のset "file=%dir%\manifest.json"では、fileという環境変数を定義しています。

dir環境変数を使用して、manifest.jsonのパスを組み立てています。

これによってパスが定まり、もし階層がない場合は階層を作成しています。

if not exist "%dir%" (
    mkdir "%dir%"
)

この際に"%dir%"と後述の分によってJsonの中身を宣言しています。

(
echo {
echo   "dependencies": {
      ーーーJsonの中身ーーー
echo   }
echo }
) > "%file%"

これによって任意のパッケージを記載することでバッチファイルを実行することで期待するmanifest.jsonが作成されUnityで正しくパッケージをインポートできるようになります。

〇参考

it-trend.jp