はじめに
「プロジェクトの中身は変えていないのに、Unityを立ち上げるたびにAndroidビルドでエラーになる」という不安定な状態が長いこと続いて困っていたのですが、後述の方法で解決しました。
「理由がわからない」「なぜか直った」など原因不明な時はたぶんこれです。
- Mac Monterey 12.4
- Unity 2019.4.31 ~ 2021.3.0
- AdMob SDK 7.0.2
追記:Unity Hub 3.2.0で解決したと発表がありました。。。さてどうでしょう。
Users on macOS reported an issue that prevented the PATH environment variable from being correctly provided to the Editor. This has now been resolved.
macOSのユーザーから、PATH環境変数がエディターに正しく提供されないという問題が報告されていました。これは現在解決されています。
エラー内容
今回、注目したエラー
CommandInvokationFailure: Failed to update Android SDK package list.
/Applications/Unity/Hub/Editor/2020.3.33f1/PlaybackEngines/AndroidPlayer/SDK/tools/bin/sdkmanager –list
調べたところ、Unityのバグなのかパソコン環境の問題なのか分かりませんが「Unityの起動と同時に JAVA_HOME のパスが無効になってしまう」のが原因のようでした。
Androidビルドでは、いろいろなエラーに翻弄されますが、後述の対処方法は汎用性が高いと思われます。 上記のエラーに限らず、まだであれば一度お試しください。
対処方法
対処方法1.手動でパスをリセットする
Unity
>Preferences
>External Tools
に移動します。- 「JDK」「Android SDK」「Android NDK」「Grandle」のチェックを無効にします。
- ビルドして、わざとエラーを発生させます。
- (2)で無効にしたチェックをすべて有効にします(Unityがツールを再インストールします)
以上です。ビルドして確認してみてください。
対処方法2.スクリプトを使って起動時にパスをリセットする
- 「Assets」内の管理しやすい場所にフォルダを作成して、名前を「Editor」とします。
- 後述のスクリプト「SetJavaHomeEditor」を「Editor」内に配置してUnityを再起動します。
- 再起動してConsoleに下記のようなログが表示されれば成功です。
以上です。ビルドして確認してみてください。
サンプルコード
using UnityEngine;
using UnityEditor;
using System;
[InitializeOnLoad]
public class SetJavaHomeEditor
{
//初回起動チェック用ダミーファイルパス
static readonly string tempFilePath = "Temp/SetJavaHomeEditor_InitFlag";
static SetJavaHomeEditor()
{
//初回起動(Fileがあるか)チェック
if (System.IO.File.Exists(tempFilePath) == true)
{
//ダミーファイルが既にあるので以降の処理スキップ
return;
}
Debug.Log("SetJavaHomeEditor 初回起動チェック用ダミーファイル作成");
System.IO.File.Create(tempFilePath);
//初回起動時のJAVA_HOMEパス
Debug.Log($"SetJavaHomeEditor JAVA_HOME in editor was: {Environment.GetEnvironmentVariable("JAVA_HOME")}");
string newJDKPath = EditorApplication.applicationPath.Replace("Unity.app","PlaybackEngines/AndroidPlayer/OpenJDK");
if(Environment.GetEnvironmentVariable("JAVA_HOME") != newJDKPath)
{
//JAVA_HOME パス書き換え
Environment.SetEnvironmentVariable("JAVA_HOME",newJDKPath);
}
//書き換え後のJAVA_HOMEパス
Debug.Log($"SetJavaHomeEditor JAVA_HOME in editor set to: { Environment.GetEnvironmentVariable("JAVA_HOME")}");
}
}
サンプルコード解説
[InitializeOnLoad]
[InitializeOnLoad] は UnityEditorのアトリビュートです。これを付与することで、UnityEditorの起動直後や、スクリプトコンパイル直後に呼び出されるようになります。
//初回起動(Fileがあるか)チェック
if (System.IO.File.Exists(tempFilePath) == true)
{
//ダミーファイルが既にあるので以降の処理スキップ
return;
}
Debug.Log(“SetJavaHomeEditor 初回起動チェック用ダミーファイル作成”);
System.IO.File.Create(tempFilePath);
[InitializeOnLoad] は、スクリプトコンパイル時に毎回呼び出されてしまうので、その対策です。初回起動時に「Temp」フォルダ以下に適当なファイルを作成して、ファイルの有無でスキップと実行を振り分けています。
if(Environment.GetEnvironmentVariable(“JAVA_HOME”) != newJDKPath)
{
//JAVA_HOME パス書き換え
Environment.SetEnvironmentVariable(“JAVA_HOME”,newJDKPath);
}
JAVA_HOMEパスが意図したパスでなければ書き換えています。
その他の対処方法
その他にJavaのバージョン8以外をアンインストールして対処する方法もあるようです。