Unityフレームワーク学習_ResManager、リソースのロードとアンロードを効率的に管理します
目次
1.ブログ紹介
このブログでは、Unity3Dリソースの動的なロードとアンロード、およびそれらを効率的に管理する方法を紹介します。この記事のアイデアは、サンダルのUnity3DフレームワークのQFrameworkにリソースをロードする方法から完全に派生しています。ブロガーは、リソースをロードするためのResourcesメソッドやAssetBundleリソースのロードなど、アイデアを適用してコンテンツを追加しました。 。
2.コンテンツ
(1)ガイダンス
リソース:https://blog.csdn.net/Mr_Sun88/article/details/94147069
AssetBundle:https://blog.csdn.net/Mr_Sun88/article/details/86553465
ResourcesメソッドとAssetBundleパッケージのロードに慣れていない人は、他の2つのブロガーの記事に直接ジャンプできます。
(2)メインロジック
リソースタイプタグ:ResType
public enum ResType
{
ResSingle,//Res单个资源
ResGroup,//Res组资源
AssetBundle,//AB包资源
}
ResType列挙型。現在ロードされているリソースのタイプをマークします。
抽象リソーススクリプト:Res.cs
/// <summary>
/// 资源容器成员属性和方法
/// </summary>
public interface IRes
{
ResType AssetType { get; set; }//资源类型标记
string AssetKey { get; set; }//资源标记
Object Asset { get; set; }//单体资源
Object[] Assets { get; set; }//资源组
int ReferenceCount { get; set; }//引用计数
void Reference();//引用执行
void Release();//释放执行
void Destroy();//摧毁执行
}
IRを継承するResにロードする必要のある各リソースを抽象化し、各Resには上記の属性とメソッドがあります。
AssetType | 単一のリソース、リソースグループ、またはABパッケージのいずれであるかにかかわらず、現在のリソースのタイプを記録します |
AssetKey | リソースがロードされるときに、リソースパスをキー値として使用します |
資産 | 単一のリソースまたはABパッケージの場合は、Resを構築するときにリソースをAssetに割り当てます。 |
資産 | リソースグループの場合は、Resを構築するときにリソースグループをアセットに割り当てます |
ReferenceCount | リソースが引用された回数を記録します |
参照() | リソースが参照されるときに呼び出されます、ReferenceCount ++ |
Release() | リソースが解放されたときに呼び出され、リソースへの参照がある場合はReferenceCount--、参照がない場合はリソースが解放されます |
破壊() | リソース参照に関係なく、直接リリースします |
パブリックリソースコンテナ:PublicLoadingResList
/// <summary>
/// 公共容器 储存所有动态资源
/// </summary>
public static List<Res> PublicLoadingResList = new List<Res>();
ローダーによって動的にロードされるすべてのリソースは、パブリックコンテナーPublicLoadingResListに格納されます
リソースローダー:ResLoader.cs
/// <summary>
/// 资源的加载容器属性和方法
/// </summary>
public interface IResLoader
{
List<Res> SelfLoadingResList { get; set; } //储存当前容器加载的资源
T AssetLoad<T>(string assetPath) where T : Object; //Resources单个资源的同步加载
T[] AssetsLoad<T>(string folderPaht) where T : Object; //Resources目录下全部资源加载
IEnumerator AssetLoadAsync<T>(string assetPath, Action<T> callback) where T : Object; //异步加载Resources下的单个资源
AssetBundle ABLoadFromMemory(string assetPath); //直接加载AB包
IEnumerator ABLoadFromMemoryAsync(string assetPath, Action<AssetBundle> callback); //LoadFromMemoryAsync 异步加载AB包
AssetBundle ABLoadFromFile(string assetPath); //LoadFromFile直接加载本地AB包
IEnumerator ABLoadFromFileAsync(string assetPath, Action<AssetBundle> callback); //从本地异步加载AB资源
IEnumerator ABLoadWWW(string assetPath, Action<AssetBundle> callback); //WWW放置加载AB包
IEnumerator ABLoadWebRequest(string assetPath, Action<AssetBundle> callback); //WebRequest请求AB包
void UnloadAll();//卸载当前加载器资源
}
SelfLoadingResList | 現在のローダーによって動的にロードされたリソースを保存します |
AssetLoad <T>(文字列assetPath) | Resourcesディレクトリにパスリソースをロードします |
AssetsLoad <T>(string folderPaht) | Resourcesディレクトリのファイルの下にあるすべてのリソースをロードします |
AssetLoadAsync <T>(文字列assetPath、Action <T>コールバック) | Resourcesディレクトリに単一のリソースを非同期的にロードします |
ABLoadFromMemory(文字列assetPath) | ABパッケージリソースをロードするためのLoadFromMemoryメソッド |
ABLoadFromMemoryAsync(string AssetPath、Action <AssetBundle>コールバック) | LoadFromMemoryAsyncメソッドはABパッケージリソースを非同期的にロードします |
ABLoadFromFile(文字列assetPath) | ABパッケージリソースをロードするためのLoadFromFileメソッド |
ABLoadFromFileAsync(string AssetPath、Action <AssetBundle>コールバック) | LoadFromFileAsyncメソッドは、ABパッケージリソースを非同期的に記録します |
ABLoadWWW(文字列assetPath、Action <AssetBundle>コールバック) | WWWメソッドはABパッケージリソースを非同期的にロードします |
ABLoadWebRequest(文字列assetPath、Action <AssetBundle>コールバック) | UnityWebRequestAssetBundleメソッドはABパッケージリソースを非同期的にロードします |
UnloadAll() | 現在のローダーリソースをアンロードします |
リソースを動的にロードする必要がある場合は、ResLoaderをインスタンス化し、ローダーを使用して現在のページに必要なすべてのリソースをロードします。リソースをロードするときは、リソースのAssetKeyに従って、リソースがローダーコンテナまたは存在するかどうかパブリックコンテナに存在する場合は、リロードせずに直接戻ります。存在しない場合は、リソースがロードされてコンテナに追加されます。これにより、リソースの繰り返しのロードを回避できます。現在のページが破棄されたときに、現在のページのローダーメソッドUnloadAllを直接呼び出すことができます。()リソース管理を容易にするために、ロードされたリソース、さまざまなページインスタンスのさまざまなローダーを解放します。
リソースローダーの管理:
/// <summary>
/// 资源管理属性方法
/// </summary>
public interface IResManager
{
ResLoader GetResLoader();//获取资源加载器实例
}
GetResLoader() | リソースローダーResLoaderのインスタンスを取得します |
現在のマネージャーには、ローダーのインスタンスを取得するためのメソッドが1つしかなく、今後も追加されます。
3.プッシュ
エンジニアリングデモGithub: https://github.com/KingSun5/Study_ResManager
凉鞋チャット:https://gitbook.cn/books/5b36e7d3dc52aa6b10c03a29/index.html
QFramework:https://gitbook.cn/books/5b36e7d3dc52aa6b10c03a29/index.html
4.結論
コンテンツが多いため、すべての主要な実装ロジックコードがブロガーによってリリースされるわけではありません。これらはすべてブロガーのGithubデモプロジェクトに含まれています。必要な学生は、ブロガーのGithubに直接ジャンプできます。ブロガーの記事が悪いことではありませんが、ブロガーに注意を払い、ブログ投稿を気に入ってもらえると思います。また、ブロガーの能力には限界があります。投稿に誤りがある場合は、コメントして批判してください。
QQ交換グループ:806091680(中国人)
このグループは、CSDNブロガーのChinarによって作成されました。お勧めします。私もグループにいます!
この記事はオリジナル記事ですので、有名作家の出典を転載してトップにこだわってください!!!!