Beispiel #1
0
    /// <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);
        }
    }
Beispiel #2
0
    /// <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);
            }
        }
    }
Beispiel #3
0
    /// <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();
    }
Beispiel #4
0
    /// <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();
    }