Просмотр исходного кода

资源管理类应该不需要热更

tanghai 8 лет назад
Родитель
Сommit
70a8c3d6b2

+ 145 - 0
Unity/Assets/Scripts/Component/ResourcesComponent.cs

@@ -0,0 +1,145 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using UnityEngine;
+
+namespace Model
+{
+	[ObjectEvent(EntityEventId.ResourcesComponent)]
+	public class ResourcesComponent: Component
+	{
+		public static AssetBundleManifest AssetBundleManifestObject { get; set; }
+
+		private readonly Dictionary<string, UnityEngine.Object> resourceCache = new Dictionary<string, UnityEngine.Object>();
+
+		private readonly Dictionary<string, AssetBundle> bundleCaches = new Dictionary<string, AssetBundle>();
+		
+		public K GetReference<K>(string bundle, string prefab, string key) where K : class
+		{
+			GameObject gameObject = this.GetAsset<GameObject>(bundle, prefab);
+			return gameObject.GetComponent<ReferenceCollector>().Get<K>(key);
+		}
+
+		public K GetAsset<K>(string bundleName, string prefab) where K : class
+		{
+			string path = $"{bundleName}.unity3d/{prefab}".ToLower();
+
+			UnityEngine.Object resource = null;
+			if (this.resourceCache.TryGetValue(path, out resource))
+			{
+				return resource as K;
+			}
+			
+			if (Define.LoadResourceType == LoadResourceType.Async)
+			{
+				if (!this.bundleCaches.ContainsKey($"{bundleName}.unity3d".ToLower()))
+				{
+					return null;
+				}
+
+				throw new Exception($"异步加载资源,资源不在resourceCache中: {bundleName} {path}");
+			}
+
+			try
+			{
+				resource = ResourceHelper.LoadResource(bundleName, prefab);
+				this.resourceCache.Add(path, resource);
+			}
+			catch (Exception e)
+			{
+				throw new Exception($"加载资源出错,输入路径:{path}", e);
+			}
+
+			return resource as K;
+		}
+
+		public async Task DownloadAndCacheAsync(string uri, string assetBundleName)
+		{
+			assetBundleName = (assetBundleName + ".unity3d").ToLower();
+
+			AssetBundle assetBundle;
+			// 异步下载资源
+			string url = uri + "StreamingAssets/" + assetBundleName;
+			int count = 0;
+			TimerComponent timerComponent = Game.Scene.GetComponent<TimerComponent>();
+			while (true)
+			{
+				WWWAsync wwwAsync = null;
+				try
+				{
+					++count;
+					if (count > 1)
+					{
+						await timerComponent.WaitAsync(2000);
+					}
+
+					if (this.Id == 0)
+					{
+						return;
+					}
+
+					wwwAsync = new WWWAsync();
+					
+					await wwwAsync.LoadFromCacheOrDownload(url, ResourcesComponent.AssetBundleManifestObject.GetAssetBundleHash(assetBundleName));
+					assetBundle = wwwAsync.www.assetBundle;
+					
+					break;
+				}
+				catch (Exception e)
+				{
+					Log.Error(e.ToString());
+				}
+				finally
+				{
+					wwwAsync?.Dispose();
+				}
+			}
+
+			if (!assetBundle.isStreamedSceneAssetBundle)
+			{
+				// 异步load资源到内存cache住
+				UnityEngine.Object[] assets;
+				AssetBundleLoaderAsync assetBundleLoaderAsync = null;
+				try
+				{
+					assetBundleLoaderAsync = new AssetBundleLoaderAsync(assetBundle);
+					
+					assets = await assetBundleLoaderAsync.LoadAllAssetsAsync();
+					
+				}
+				finally
+				{
+					assetBundleLoaderAsync?.Dispose();
+				}
+
+
+				foreach (UnityEngine.Object asset in assets)
+				{
+					string path = $"{assetBundleName}/{asset.name}".ToLower();
+					this.resourceCache[path] = asset;
+				}
+			}
+
+			if (this.bundleCaches.ContainsKey(assetBundleName))
+			{
+				throw new Exception($"重复加载资源: {assetBundleName}");
+			}
+			this.bundleCaches[assetBundleName] = assetBundle;
+		}
+
+		public override void Dispose()
+		{
+			if (this.Id == 0)
+			{
+				return;
+			}
+
+			base.Dispose();
+
+			foreach (var assetBundle in bundleCaches)
+			{
+				assetBundle.Value?.Unload(true);
+			}
+		}
+	}
+}

+ 12 - 0
Unity/Assets/Scripts/Component/ResourcesComponent.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 509cf7df1ed2a52438a824cb162c208a
+timeCreated: 1498124686
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 5 - 8
Unity/Unity.csproj

@@ -12,15 +12,12 @@
     <ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier>
     <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
-    <TargetFrameworkProfile>
-    </TargetFrameworkProfile>
-    <CompilerResponseFile>
-    </CompilerResponseFile>
+    <TargetFrameworkProfile></TargetFrameworkProfile>
+    <CompilerResponseFile></CompilerResponseFile>
     <UnityProjectType>Game:1</UnityProjectType>
     <UnityBuildTarget>StandaloneWindows64:19</UnityBuildTarget>
     <UnityVersion>2017.1.0b8</UnityVersion>
-    <RootNamespace>
-    </RootNamespace>
+    <RootNamespace></RootNamespace>
     <LangVersion>6</LangVersion>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -377,6 +374,7 @@
     <Compile Include="Assets\Scripts\Component\NetInnerComponent.cs" />
     <Compile Include="Assets\Scripts\Component\NetOuterComponent.cs" />
     <Compile Include="Assets\Scripts\Component\NetworkComponent.cs" />
+    <Compile Include="Assets\Scripts\Component\ResourcesComponent.cs" />
     <Compile Include="Assets\Scripts\Component\TimerComponent.cs" />
     <Compile Include="Assets\Scripts\Config\ACategory.cs" />
     <Compile Include="Assets\Scripts\Config\AConfig.cs" />
@@ -440,7 +438,6 @@
     <Compile Include="Assets\Scripts\Object\ObjectEvents.cs" />
     <Compile Include="Assets\Scripts\ReferenceCollector.cs" />
   </ItemGroup>
-  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="GenerateTargetFrameworkMonikerAttribute" />
-</Project>
+</Project>