public static AssetBundle TryLoadBundle(IAssetBundleResource resource)
        {
            AssetBundleRequestOptions requestOptions = GetOptions(resource);

            if (requestOptions == null)
            {
                Debug.LogFormat("[{0}.{1}] Missing RequestOptions", nameof(AssetBundleCache), nameof(TryLoadBundle));
                return(null);
            }
            if (assetBundles.TryGetValue(requestOptions.BundleName, out LoadedAssetBundle loadedAssetBundle))
            {
                if (loadedAssetBundle.Matches(requestOptions) && loadedAssetBundle.assetBundle != null)
                {
                    Debug.LogFormat("[{0}.{1}] assetBundle={2} already loaded", nameof(AssetBundleCache), nameof(TryLoadBundle), requestOptions.BundleName);
                    return(loadedAssetBundle.assetBundle);
                }
                Debug.LogFormat("[{0}.{1}] assetBundle={2} unloading", nameof(AssetBundleCache), nameof(TryLoadBundle), requestOptions.BundleName);
                loadedAssetBundle.Unload();
            }
            Debug.LogFormat("[{0}.{1}] assetBundle={2} loading", nameof(AssetBundleCache), nameof(TryLoadBundle), requestOptions.BundleName);
            AssetBundle assetBundle = resource.GetAssetBundle();

            loadedAssetBundle = new LoadedAssetBundle(requestOptions.BundleName, requestOptions.Hash, requestOptions.Crc, assetBundle);
            assetBundles[requestOptions.BundleName] = loadedAssetBundle;
            Debug.LogFormat("[{0}.{1}] assetBundle={2} loaded={3}", nameof(AssetBundleCache), nameof(TryLoadBundle), requestOptions.BundleName, assetBundle != null);
            return(assetBundle);
        }
            internal static T LoadBundleFromDependecies <T>(IList <object> results) where T : class, IAssetBundleResource
            {
                if (results == null || results.Count == 0)
                {
                    return(default(T));
                }

                IAssetBundleResource bundle = null;
                bool firstBundleWrapper     = true;

                for (int i = 0; i < results.Count; i++)
                {
                    var abWrapper = results[i] as IAssetBundleResource;
                    if (abWrapper != null)
                    {
                        //only use the first asset bundle, even if it is invalid
                        abWrapper.GetAssetBundle();
                        if (firstBundleWrapper)
                        {
                            bundle = abWrapper;
                        }
                        firstBundleWrapper = false;
                    }
                }

                return(bundle as T);
            }
 private static AssetBundleRequestOptions GetOptions(IAssetBundleResource resource)
 {
     if (resource == null)
     {
         return(null);
     }
     return(ReflectionUtils.GetPrivateFieldValue <AssetBundleRequestOptions>(resource, "m_Options"));
 }