Skip to content

Instantly share code, notes, and snippets.

@yanonono
Last active August 7, 2021 06:10
Show Gist options
  • Select an option

  • Save yanonono/32a213c1f7329a65c3c7e57ae82bfd1d to your computer and use it in GitHub Desktop.

Select an option

Save yanonono/32a213c1f7329a65c3c7e57ae82bfd1d to your computer and use it in GitHub Desktop.
Upgrade unity2018 to unity2019 for VRChat Avatars.

WIP

Upgrade unity2018 to unity2019 for VRChat Avatars.

はじめに

このPowerShellスクリプトは、2021年08月04日のVRChatのUnity2019対応用に作成したツールです。

できること

  • Unity(2018) Projectのコピーとzipファイル作成
  • VRCSDKのバージョンアップ(VRCSDK2 と VRCSDK3-Avatars)
  • Unity2018からUnity2019へのアップグレード

できないこと

  • World用のVRChat unity2019 Update
  • UnityEditor 2019.4.xのインストール
  • UnityEditor 2018, 2019それぞれのライセンス認証
  • Assets Storeからダウンロード。
    • Unity2019からAssetStoreでDynamicBoneなどをダウンロードしておくことをおすすめします。
  • UDON(SDK3)やClothの対応

動作環境

  • Windows 10
  • PowerShell 5.1
    • PowerShell 7.1.xでは正常に動作しません。
  • UnityHub 2.4.1
    • UnityHub 3.0 betaでは正常に動作しません。

動かし方

Google Chromeの場合です。

ダウンロードからPowerShellスクリプトを実行するまで

  1. GitHub GistからPowerShellスクリプトをダウンロード
    1. vrchat_avatar_upgrade_to_unity2019_2021????_????.ps1 の右側にあるRAWボタンの上で右クリックして「名前を付けてリンク先を保存」
    2. 任意の場所にファイルを保存してください。このとき、最後の拡張子が.ps1であることを確認してください。
  2. Windowsのエクスプローラーにて、保存したPowerShellスクリプトファイルを選択。※ダブルクリックしないこと
  3. PowerShellスクリプトファイルを選択した状態にて、右クリック。「PowerShellで実行」を選択。

操作

  1. Unity2018 project folder : が表示される
  2. エクスプローラーなどで、VRCHat Unity2018のアバター用のProjectフォルダーを、"Unity2018 project folder"が表示しているあたりにD&D
  3. D&Dで入力後、エンターキーを押下
  4. 複数回UnityEditorが起動しています。
  5. step 01: Unity2018で実行されます。unity projectを開くだけの作業です。問題がなければすぐに終わります。
  6. step 02: unity2018に最新のVRCSDKを自動ダウンロード&インストールします。ちょっと処理時間がかかります。
  7. step 03: unity2019でAssets Database Upgradeなどを実行して待ちます。かなり、処理時間かかります。
  8. 一連の処理が完了後、普通にUnityHubなどから、unity2019にて普通に開いていただいて問題ありません。

FAQ, Frequently Asked Questions.

Q. DynamicBoneが有効になっていない?

A. 新しくUnityEditor 2019をインストールしたとき、Dynamic BoneがUnity上で認識されないことがあるようです。 改めてAssetStoreからDynamic Boneなどをダウンロードしてみてください。

Q. Unity2019へのアップグレードが途中で強制終了してしまう

A. Unity2018からUnity2019へアップグレードしようとするUnity projectのパスに、漢字・ひらがな・カタカナなどのASCIIコード以外の文字が含まれていると強制終了してしまうようです。C:\TEMP\などの単純な名前のパスで実行するとアップグレード処理ができました。

Q. 動作が異常に遅い。

A. Unity projectの中にファイルが大量にある場合、すごく時間がかかりました。 一部のフォルダを削除すると軽量化するようですが、UnityEditorを使い込んでいないため詳しいことは不明です。

Q. 動作が異常に遅い(Googleドライブ使用時)

A. Unity projectが新しいGoogleドライブ上に保存してある場合、Googleドライブの仕様上、すごく時間がかかります。 作業する前に、フォルダの設定を「オフラインアクセス」(オフラインで使用可能にする)に設定することをおすすめします。

更新履歴

  • 2021-08-07 15:00
    • GiHub Gistへ正しく更新できていなかったため、版を更新
  • 2021-08-07 09:00
    • VRCSDKのバージョンが判定できないときエラーになるように修正
    • エラー表示時、すぐに終了しないようにキー入力するように修正
  • 2021-08-06 18:00
    • 初版公開

ライセンス

MIT

# UnityHubのパス
$unityhub = "C:\Program Files\Unity Hub\Unity Hub.exe"
function VRC-Check-UnityVersions {
# VRChatの指定Unityバージョン 2021-08-06
$VrcUnityVersion = [PSCustomObject]@{
v2018 = "2018.4.20f1"
v2019 = "2019.4.29f1"
}
$UnityPath = [PSCustomObject]@{
v2018 = $NULL
v2019 = $NULL
}
# $result = Start-Process -FilePath ($unityhub) -ArgumentList "-- --headless editors --installed" -PassThru -Wait
& $unityhub -- --headless editors --installed | Set-Variable -Name "result"
foreach ($textline in $result) {
$r = $textline.split(",")
if ($r.Length -eq 2) {
# VRChatの指定Unityバージョンチェック
if ($r[0].trim() -eq $VrcUnityVersion.v2018) {
$UnityPath.v2018 = $r[1].Replace("installed at ", "").Trim()
}
if ($r[0].trim() -eq $VrcUnityVersion.v2019) {
$UnityPath.v2019 = $r[1].Replace("installed at ", "").Trim()
}
}
}
if ($NULL -ne $UnityPath.v2018) {
Write-Information ("Unity " + $VrcUnityVersion.v2018 + ", Installed at " + $UnityPath.v2018)
}
else {
Write-Error "Unity $VrcUnityVersion.v2018, not found"
exit
}
if ($NULL -ne $UnityPath.v2019) {
Write-Information ("Unity " + $VrcUnityVersion.v2019 + ", Installed at " + $UnityPath.v2019)
}
else {
Write-Error "Unity $VrcUnityVersion.v2019, not found"
exit
}
return $UnityPath
}
function VRC-Backup-UnityProject($projPath) {
$ProjectPath = [PSCustomObject]@{
v2018 = $projPath
v2018zip = $null
v2019 = $null
}
$ProjectPath.v2018zip = ($ProjectPath.v2018 + ".zip")
$ProjectPath.v2019 = $ProjectPath.v2018 + ".unity2019"
Write-Information ("Information Unity2018: " + $ProjectPath.v2018 )
Write-Information ("Information Unity2019: " + $ProjectPath.v2019 )
# zipファイルの作成
if ((Test-Path $ProjectPath.v2018zip) -eq $TRUE) {
Write-Error ("Already Unity2019 project zipfile. (`"$ProjectPath.v2018zip`")" )
exit
}
else {
Write-Host " Unity2018 Folder to Zip"
Compress-Archive -Path ($ProjectPath.v2018) -DestinationPath ($ProjectPath.v2018zip) -CompressionLevel Optimal
}
# フォルダごとコピー
if ((Test-Path ($ProjectPath.v2019)) -eq $TRUE) {
Write-Error ("Already Unity2019 project folder." + " (`"" + ($ProjectPath.v2019) + "`")")
exit
}
else {
Write-Host " COPY: Unity2018 to New Folder"
Write-Host " from: " ($ProjectPath.v2018)
Write-Host " to: " ($ProjectPath.v2019)
$rbcpFrom = $ProjectPath.v2018
$rbcpTo = $ProjectPath.v2019
robocopy.exe "$rbcpFrom" "$rbcpTo" /MIR
}
return $ProjectPath
}
function VRC-DownloadSDK($version) {
if ($version -eq "2") {
$SDKURL = "https://vrchat.com/download/sdk2"
}
elseif ($version -eq "3") {
$SDKURL = "https://vrchat.com/download/sdk3-avatars"
}
else {
exit
}
# SDKバージョンチェック
try {
Write-Host " Check VRCSDK public version."
$curlResult = cmd /C "curl -si $SDKURL"
$temp_name = ""
foreach ($str in $curlResult.Split(" ")) {
if ($str.StartsWith("https") -And $str.EndsWith(".unitypackage")) {
$temp_name = $str.Split('/')
}
}
$sdkPackage = $temp_name[-1]
}
catch {
Write-Host $Error[0]
}
Write-Host " Newest VRCSDK version is $sdkPackage."
if (Test-Path ".\$sdkPackage") {
Write-Host " SKIP. VRCSDK download."
}
else {
try {
$requestResult = Invoke-WebRequest $SDKURL -OutFile ".\$sdkPackage"
Write-Host " VRCSDK($sdkPackage) download complete."
}
catch {
Write-Error " ERROR: VRCSDK download."
$error[0]
}
}
$SDKPath = (Resolve-Path ".\$sdkPackage").Path
return $SDKPath
}
Write-Host "START."
Write-Host ""
Write-Host ""
Write-Host ""
Write-Host ""
Write-Host ""
Write-Host ""
Write-Host ""
Write-Host ""
##### UnityHubのインストールチェック
if ((Test-Path $unityhub) -ne $TRUE) {
Write-Error "UnityHub, not found"
exit
}
##### UnityEditorのインストールバージョンチェック
$UnityEditorPath = VRC-Check-UnityVersions
$InPath = Read-Host "Unity2018 project folder "
if (($PowerShellVersion.Major -eq "5") -and ($PowerShellVersion.Minor -eq "1")) {
if ($InPath.StartsWith("`"")) {
$InPath = $InPath.Substring(1)
}
if ($InPath.EndsWith("`"")) {
$InPath = $InPath.Substring(0, $InPath.Length - 1)
}
Write-Host $InPath
}
else {
Write-Error "PowerShell version 5.1 ONLY"
}
##### プロジェクトのバックアップ
Write-Host "----------"
Write-Host "STEP 00: Backup UnityProject."
$ProjectPath = VRC-Backup-UnityProject $InPath
# Write-Host "STEP 00: Backup UnityProject, complete"
Write-Host " for Unity2019: " $ProjectPath.v2019
Write-Host " Backup Zipfile: " $ProjectPath.v2018zip
##### Unityの実行
### step 01: Unity2018で起動テスト
Write-Host "----------"
Write-Host "STEP 01: Check project by Unity2018."
$logfile = ($ProjectPath.v2018) + ".unity2019.step0001.log"
Write-Host " UnityEditor2018 Logfile: $logfile"
& ($UnityEditorPath.v2018) -batchmode -nographics -projectPath ($ProjectPath.v2019) `
-quit -logfile ($logfile) | Set-Variable -Name "result"
if ($result) {
Write-Debug $result
}
### step 02: Unity2018で起動. VRCSDKのバージョンアップ
Write-Host "----------"
Write-Host "STEP 02: Update VRCSDK by Unity2018."
# SDK2 or SDK3-Avatar の判定
$VrcsdkVersion = $null
Write-Host "VRCSDK Version check."
if (Test-Path(Join-Path $ProjectPath.v2019 "Assets\VRCSDK\SDK2\")) {
$VrcsdkVersion = "2"
Write-Host " VRCSDK Version is SDK2."
$SdkPath = VRC-DownloadSDK("2")
}
elseif (Test-Path(Join-Path $ProjectPath.v2019 "Assets\VRCSDK\SDK3A\")) {
$VrcsdkVersion = "3"
Write-Host " VRCSDK Version is SDK3-Avatars"
VRC-DownloadSDK("3")
}
# SDK2, 古いバージョンフォルダの削除
if ($VrcsdkVersion -eq "2") {
Write-Host " DELETE: Old VRCSDK2."
Remove-Item (join-path $ProjectPath.v2019 "Assets\VRCSDK.meta")
Remove-Item (join-path $ProjectPath.v2019 "Assets\VRCSDK\") -Recurse
}
# Unity2018の起動
Write-Host " Import UnityPackage: $SdkPath"
$logfile = ($ProjectPath.v2018) + ".unity2019.step0002.log"
Write-Host " UnityEditor2018 Logfile: $logfile"
& ($UnityEditorPath.v2018) -batchmode -nographics -projectPath ($ProjectPath.v2019) `
-importPackage ($SdkPath) `
-quit -logfile ($logfile) | Set-Variable -Name "result"
if ($result) {
Write-Debug $result
}
### step 03: Unity2019で起動. Unity projectのアップグレード(2018 -> 2019)
Write-Host "----------"
Write-Host "STEP 03: Upgrade Unity project 2018 to 2019."
$logfile = ($ProjectPath.v2018) + ".unity2019.step0003.log"
Write-Host " UnityEditor2019 Logfile: $logfile"
Write-Warning " *** Please operate manually, 'Asset Database Upgrade'. *** "
& ($UnityEditorPath.v2019) -projectPath ($ProjectPath.v2019) -quit -logfile ($logfile) | Set-Variable -Name "result"
if ($result) {
Write-Debug $result
}
Write-Host "---------- " -BackgroundColor "DarkGreen" -ForegroundColor "White"
Write-Host "STEP 04: COMPLETE ALL !!" -BackgroundColor "DarkGreen" -ForegroundColor "White"
Write-Host "---------- " -BackgroundColor "DarkGreen" -ForegroundColor "White"
Write-Host ""
Write-Host ""
Write-Host ""
Write-Host "FINISH."
$DebugPreference = $originalDebugPreference
$InformationPreference = $originalInformationPreference
pause
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment