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 がうまくいない
- スクリプトリファレンスに記載されているAPIは AssetDatabase.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 を定義してどこまで行ってるか見る
- AssetDatabase-ImportPackageCallback でそれぞれのタイミングでLogを吐き出させる
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できました。