LoginSignup
3
1

More than 3 years have passed since last update.

【Unity】 batch mode で Import Package するときにハマったこと

Posted at

TL;DR

  • Unityのバージョンは 2018.3.6f1 です。
  • 普通の AssetDatabase.ImportPackage だと処理完了前にprocess が終わってしまって取り込めない
  • internal Method だけど AssetDatabase.ImportPackageImmediately というのがあるのでそれをReflectionで使いましょう
importpackage.cs
public static void ImportPackage()
{
    var packageName = "Sample.unitypackage";
    var type = typeof(AssetDatabase);
    var binding = BindingFlags.NonPublic | BindingFlags.Static;
    var assetDatabaseMethodInfo = type.GetMethod("ImportPackageImmediately", binding);
    assetDatabaseMethodInfo.Invoke(type, new object[] {packageName});
}

batch mode で ImportPackage がうまくいない

importpackage.cs
public static void ImportPackage()
{
    //batch mode なので第2引数の interactive は false
    AssetDatabase.ImportPackage("Sample.unitypackage", false);
}
  • 結果、うまくインポートできてない
  • Logを見ても実行自体には成功している

MenuItem にしてGUI上で試す

importpackage.cs
[MenuItem("ImportPackage")]
public static void ImportPackage()
{
    //batch mode なので第2引数の interactive は false
    AssetDatabase.ImportPackage("Sample.unitypackage", false);
}
  • 普通にAsset/ImportAsset/CutstomPackage の流れでImportしたときと同じように取り込まれる
  • ちゃんと取り込まれてるのはGit差分でわかる。

????????

callback を定義してどこまで行ってるか見る

importpackage.cs
public static void ImportPackage()
{
    AssetDatabase.importPackageCompleted += ImportCompleted;
    AssetDatabase.importPackageCancelled += ImportCancelled;
    AssetDatabase.importPackageFailed += ImportCallBackFailed;
    AssetDatabase.importPackageStarted += ImportStarted;
    AssetDatabase.ImportPackage("Sample.unitypackage", false);
}

static void ImportCompleted(string packageName)
{
    Debug.Log ("Completed " + packageName);
    AssetDatabase.importPackageCompleted -= ImportCompleted;
}

static void ImportCancelled(string packageName)
{
    Debug.Log ("Cancelled " + packageName);
    AssetDatabase.importPackageCancelled -= ImportCancelled;
}

static void ImportCallBackFailed(string packageName, string _error)
{
    Debug.Log ("Failed " + packageName);
    AssetDatabase.importPackageFailed -= ImportCallBackFailed;
}

static void ImportStarted(string packageName)
{
    Debug.Log ("Started " + packageName);
    AssetDatabase.importPackageStarted -= ImportStarted;
}
  • 実行したLogを見ると Started Sample.unitypackage しか出てない
  • おかしいぞ?

AssetDatabaseの実装を見に行く

  • ImportPackageImmediately というのが ImportPackageとは別にあるのを見つける
  • 絶対これやんけ!!!
  • ただし、internal method なので普通には使えない
  • Reflectionで解決しよ。。。
importpackage.cs
public static void ImportPackage()
{
    var packageName = "Sample.unitypackage";
    var type = typeof(AssetDatabase);
    var binding = BindingFlags.NonPublic | BindingFlags.Static;
    var assetDatabaseMethodInfo = type.GetMethod("ImportPackageImmediately", binding);
    assetDatabaseMethodInfo.Invoke(type, new object[] {packageName});
}
  • 結果、無事 batchModeでImportPackageできました。
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1