/// <summary> /// construct /// </summary> public AssetBundleLoadHandle( string path, AssetBundleInfo info, bool isSubAsset, Type type, Action onLoaded, Action <AssetLoadHandle> onError) : base(path, type, onLoaded, onError) { this.info = info; this.isSubAsset = isSubAsset; this.isMonoBehaviour = this.type.IsSubclassOf(typeof(MonoBehaviour)); //メインのアセットバンドルに参照ユーザー登録 var item = ReferencedAssetBundle.Get(this.info.assetBundleName); item.AddReferenceUser(this); //依存関係のアセットバンドルに参照ユーザー登録 foreach (var dependency in this.info.dependencies) { item = ReferencedAssetBundle.Get(dependency); item.AddReferenceUser(this); } }
/// <summary> /// アセットバンドルのロード /// </summary> private void LoadAssetBundle(int i) { //停止命令が来ていたら if (this.status == Status.StopProcessing) { //停止したことを通知 this.OnStop(onRestart: () => this.LoadAssetBundle(i)); return; } bool isLast = (i == this.info.dependencies.Length); //ロードするアセットバンドル名(最後にメインのアセットバンドルをロードする) string assetBundleName = isLast ? this.info.assetBundleName : this.info.dependencies[i]; var item = ReferencedAssetBundle.Get(assetBundleName); try { //ロード実行 item.Load(assetBundleName); } catch { //エラー:ファイルが無い this.OnError(ErrorStatus.FileNotFound, onRetry: () => this.LoadAssetBundle(i)); return; } //既にロード済みだった場合 if (item.request.isDone) { if (isLast) { //メインのアセットバンドルロード完了後にアセットロードする this.LoadAsset(item.request); } else { //次のアセットバンドルのロードを開始 this.LoadAssetBundle(i + 1); } } //まだロード完了してない場合 else { if (isLast) { //メインのアセットバンドルロード完了後にアセットロードする item.request.completed += this.LoadAsset; } else { //完了後に次のアセットバンドルのロードを開始 item.request.completed += (_) => this.LoadAssetBundle(i + 1); } } }
/// <summary> /// 破棄 /// </summary> public override void Unload() { //アセットバンドルへの参照を解除 if (this.info != null) { var item = ReferencedAssetBundle.Get(this.info.assetBundleName); item.Unload(this); foreach (var dependency in this.info.dependencies) { item = ReferencedAssetBundle.Get(dependency); item.Unload(this); } this.info = null; } base.Unload(); }
/// <summary> /// ロード完了時 /// </summary> protected override void OnLoaded() { //停止命令が来ていたら if (this.status == Status.StopProcessing) { //停止したことを通知 this.OnStop(onRestart: () => this.OnLoaded()); return; } if ((this.request as AssetBundleRequest).asset == null) { //エラー:アセットがnull var item = ReferencedAssetBundle.Get(this.info.assetBundleName); this.OnError(ErrorStatus.AssetIsNull, onRetry: () => this.LoadAsset(item.request)); return; } //ロード完了を通知 base.OnLoaded(); }