Created
August 29, 2016 16:24
-
-
Save tsubaki/8ae46cbb496c6c105d4e5990621d0e5b to your computer and use it in GitHub Desktop.
アセットバンドルシミュレーターもどき
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine.SceneManagement; | |
public class AssetBundleSimulator | |
{ | |
private AssetBundleSimulator (){} | |
private static AssetBundleSimulator instance = new AssetBundleSimulator (); | |
public static AssetBundleSimulator Instance { | |
get { | |
return instance; | |
} | |
} | |
// assetBundle name / assetbundle | |
// 一度読み込んだAssetBundleはキャッシュしておく(複数回呼出しても大丈夫なように) | |
Dictionary<string, AssetBundle> assetBundleCache = new Dictionary<string, AssetBundle> (); | |
public void Init () | |
{ | |
// AssetBundleの一覧を用意(有無チェック面倒) | |
#if ASSETBUNDLE_SIMULATOR && UNITY_EDITOR | |
foreach( var assetBundleName in UnityEditor.AssetDatabase.GetAllAssetBundleNames()) | |
{ | |
assetBundleCache.Add(assetBundleName, null); | |
} | |
#else | |
var ab = AssetBundle.LoadFromFile(string.Format("{0}/{1}",Application.streamingAssetsPath, "StreamingAssets")); | |
var manifest = ab.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); | |
foreach( var assetBundleName in manifest.GetAllAssetBundles()) | |
{ | |
assetBundleCache.Add(assetBundleName, null); | |
} | |
ab.Unload(false); | |
#endif | |
} | |
public void LoadScene (string assetBundleName, string sceneName, LoadSceneMode sceneMode) | |
{ | |
#if ASSETBUNDLE_SIMULATOR && UNITY_EDITOR | |
string[] levelPaths = UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundleAndAssetName (assetBundleName, sceneName); | |
if (sceneMode == LoadSceneMode.Additive) | |
UnityEditor.EditorApplication.LoadLevelAdditiveInPlayMode (levelPaths [0]); | |
else | |
UnityEditor.EditorApplication.LoadLevelInPlayMode (levelPaths [0]); | |
#else | |
GetAssetBundle(assetBundleName); | |
SceneManager.LoadScene(sceneName, sceneMode); | |
#endif | |
} | |
public IEnumerator LoadSceneAsync (string assetBundleName, string sceneName, LoadSceneMode sceneMode) | |
{ | |
#if ASSETBUNDLE_SIMULATOR && UNITY_EDITOR | |
string[] levelPaths = UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundleAndAssetName (assetBundleName, sceneName); | |
if (sceneMode == LoadSceneMode.Additive) | |
yield return UnityEditor.EditorApplication.LoadLevelAdditiveAsyncInPlayMode (levelPaths [0]); | |
else | |
yield return UnityEditor.EditorApplication.LoadLevelAsyncInPlayMode (levelPaths [0]); | |
#else | |
GetAssetBundle(assetBundleName); | |
yield return SceneManager.LoadSceneAsync(sceneName, sceneMode); | |
#endif | |
} | |
public T LoadAsset<T> (string assetBundleName, string assetName) where T : UnityEngine.Object | |
{ | |
#if ASSETBUNDLE_SIMULATOR && UNITY_EDITOR | |
string[] assetPaths = UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundleAndAssetName (assetBundleName, assetName); | |
var obj = UnityEditor.AssetDatabase.LoadAssetAtPath<T> (assetPaths [0]); | |
return obj; | |
#else | |
return GetAssetBundle(assetBundleName).LoadAsset<T>(assetName); | |
#endif | |
} | |
public T[] LoadAllAssets<T>(string assetBundleName) where T : UnityEngine.Object | |
{ | |
#if ASSETBUNDLE_SIMULATOR && UNITY_EDITOR | |
string[] assetPaths = UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundle (assetBundleName); | |
List<T> assetList = new List<T>(); | |
for(int i=0; i<assetPaths.Length; i++){ | |
var asset = UnityEditor.AssetDatabase.LoadAssetAtPath<T>(assetPaths[i]); | |
if( asset != null ){ | |
assetList.Add(asset); | |
} | |
} | |
return (T[])assetList.ToArray(); | |
#else | |
return GetAssetBundle(assetBundleName).LoadAllAssets<T>(); | |
#endif | |
} | |
public AssetBundle GetAssetBundle(string assetBundleName) | |
{ | |
var assetBundle = assetBundleCache[assetBundleName]; | |
if( assetBundle == null){ | |
var path = string.Format("{0}/{1}",Application.streamingAssetsPath, assetBundleName); | |
assetBundle = AssetBundle.LoadFromFile(path); | |
assetBundleCache [assetBundleName] = assetBundle; | |
} | |
return assetBundle; | |
} | |
public void UnloadAssetBundle(string assetBundleName) | |
{ | |
var assetBndle = assetBundleCache [assetBundleName]; | |
if (assetBndle != null) { | |
assetBndle.Unload (false); | |
} | |
assetBundleCache [assetBundleName] = null; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment