提交 70a8c3d6 编写于 作者: T tanghai

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

上级 321d68bc
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);
}
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: 509cf7df1ed2a52438a824cb162c208a
timeCreated: 1498124686
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
......@@ -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>
\ No newline at end of file
</Project>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册