using System.Collections.Generic;
public static void Main()
var locator = ExternalAssetsLocatorFactory.Create();
var asset = locator.LoadAsset<string>("assetA");
System.Console.WriteLine("asset="+asset);
var source = locator.LocateSource("assetA");
asset = source.LoadAsset<string>("assetA");
var bundleSource = source as AssetBundleSource;
var actualBundle = bundleSource.unityBundle;
System.Console.WriteLine("asset="+asset);
public static class ExternalAssetsLocatorFactory{
public static IAssetLocator Create(){
new Map(new Dictionary<string,string>(){
new IAssetSourceLocator[]{
new EmbeddedBundleLocator()
public class Map : IBundledAssetsMap{
private Dictionary<string,string> map;
public Map(Dictionary<string,string> map){
public string GetBundleIdFromAssetId(string assetId){
public class EmbeddedBundleLocator : IAssetSourceLocator{
public IAssetSource LoadFromBundleId(string bundleId ){
return new AssetBundleSource(){
unityBundle = new AssetBundle()
public interface IAssetLocator{
IAssetSource LocateSource(string assetId);
T LoadAsset<T>(string assetId);
public interface IAssetSource{
T LoadAsset<T>(string assetId);
void Unload(bool includeAssets);
public interface IAssetSourceLocator{
IAssetSource LoadFromBundleId(string bundleId );
public interface IBundledAssetsMap{
string GetBundleIdFromAssetId(string assetId);
public class AssetLocator : IAssetLocator{
private ICollection<IAssetSourceLocator> locators;
private IBundledAssetsMap map;
public AssetLocator(IBundledAssetsMap map, ICollection<IAssetSourceLocator> providers){
this.locators = locators;
public IAssetSource LocateSource(string assetId){
var bundleId = map.GetBundleIdFromAssetId(assetId);
foreach(var locator in locators){
var bundle = locator.LoadFromBundleId(bundleId);
public T LoadAsset<T>(string assetId){
var source = LocateSource(assetId);
var asset = source.LoadAsset<T>(assetId);
public class AssetBundleSource : IAssetSource{
public AssetBundle unityBundle;
public T LoadAsset<T>(string assetId){
return unityBundle.Load<T>(assetId);
public void Unload(bool includeAssets){
unityBundle.Unload(includeAssets);
public class LevelSourceAssetLocator : IAssetSourceLocator{
public IAssetSource LoadFromBundleId(string bundleId ){
return new LevelDatabaseSource(){
public class LevelDatabaseSource : IAssetSource{
public T LoadAsset<T>(string assetId){
return (T)LevelDatabaseCollection.Editor_GetDatabase(assetId);
public void Unload(bool includeAssets){
public static class LevelDatabaseCollection{
public static object Editor_GetDatabase(string mapIdentifier){return null;}
public class AssetBundle{
public T Load<T>(string assetId){return default(T);}
public void Unload(bool includeAssets){}