Apprentissage du framework Unity - Gestionnaire de ressources

Plan de chargement des ressources

1. Faites glisser et déposez
        les variables dans le script en utilisant public dans la fenêtre Inspecteur, puis faites glisser les ressources à charger vers les variables du script dans la fenêtre Inspecteur.
        Non recommandé pour une utilisation dans les grands projets. Ne l'utilisez pas non plus dans des projets d'entreprise.
        Si vous êtes un développeur de jeux indépendant, vous pouvez l'utiliser.
        Les mises à jour à chaud ne sont pas prises en charge.

2. Resources
        utilise la méthode Resources.Load, la méthode Resources.LoadAsync et la méthode Resources.LoadAll pour charger les ressources.
        Peut être utilisé dans des projets commerciaux, y compris des projets d'entreprise. Cependant, les ressources pouvant être stockées dans le dossier Ressources sont limitées et seulement environ 2 Go de ressources peuvent être stockées, utilisez-le donc avec prudence.
        Les mises à jour à chaud ne sont pas prises en charge.

3. AssetBundle
       utilise la méthode AssetBundle.LoadFromXXX pour charger les ressources.
       Un schéma de chargement de ressources couramment utilisé pour les projets commerciaux. Si vous travaillez sur un projet dans une entreprise, il est recommandé de charger les ressources de cette manière.
       C'est plus efficace que le chargement des ressources et prend moins de mémoire. Après la sortie officielle du jeu, les ressources prendront également moins de place.
       Prise en charge de la mise à jour à chaud.

4. Les adressables (système de ressources adressables)
      peuvent être compris comme un AssetBundle avancé, et la gestion des ressources est automatiquement effectuée dans Unity.
      Mais il est encore en développement et peut contenir des bugs. Les jeux commerciaux grand public utilisent AssetBundle pour charger des ressources.
       Prise en charge de la mise à jour à chaud.

5. AssetDatabase
      utilise la méthode AssetDatabase.LoadAssetAtPath pour charger les ressources.
      Limité au mode éditeur, principalement utilisé pour modifier des fichiers locaux avec du code en mode éditeur.
      Ce schéma ne sera pas utilisé pour charger des ressources lorsque le jeu est en cours d'exécution.
      Les mises à jour à chaud ne sont pas prises en charge.

Les ressources chargent dynamiquement les ressources

Un dossier nommé Resources doit être créé dans le projet avant utilisation. Ce nom est fixe.

        Plusieurs dossiers nommés Ressources peuvent être créés dans un projet et ils peuvent être placés n'importe où dans le dossier Actifs. Lors du chargement à l'aide de la méthode Ressources, chaque dossier Ressources sera recherché.
        Remarque : S'il existe plusieurs dossiers Ressources dans un projet, vous devez vous assurer que les chemins relatifs des fichiers qu'ils contiennent ne se répètent pas. Si tel est le cas, lors du chargement à l'aide de la méthode Resources.Load, seul le premier fichier portant ce nom trouvé sera chargé.

Dans le même dossier, les noms de fichiers ne doivent pas avoir le même nom. S'ils ont le même nom, utilisez des génériques pour charger le type spécifié lors du chargement des fichiers .

Lors du chargement à l'aide de Resources.Load ou Resources.LoadAll, le chemin commence à partir du dossier du dossier Ressources. Par exemple, il y a un dossier Audio dans le dossier Ressources, et il y a également un dossier Musique dans le dossier Audio. Le dossier Musique a un Pour un fichier .mp3 appelé Chanson, le chemin est "Audio/Musique/Chanson"

N'écrivez pas de suffixe à la fin du nom du fichier dans le chemin. Si vous écrivez un suffixe, le chargement échouera.

Les chemins peuvent être écrits avec des barres obliques inverses. "Audio/Musique/Chanson" peut être écrit comme suit :
        "Audio\\Musique\\Chanson"
        ou
        @"Audio\Musique\Chanson".
Il n'est pas recommandé d'utiliser des barres obliques inverses pour écrire le chemin. Il est recommandé d'utiliser des barres obliques pour écrivez-le uniformément.

La valeur de retour Resources.Load (chemin de chaîne de la ressource à charger)
est de type objet.
Chargez les ressources de manière synchrone dans le dossier Ressources.
S'il existe plusieurs ressources avec le même chemin, seule la première ressource trouvée sera renvoyée.

Resources.Load (chemin de chaîne de la ressource à charger, objet System.Type Type du type de ressource à charger)
la valeur de retour est le type d'objet.
Chargez de manière synchrone les ressources du type spécifié dans le dossier Ressources.
S'il existe plusieurs ressources du même type et du même chemin, seule la première ressource trouvée sera renvoyée.

Ou utilisez la surcharge de fonctions pour spécifier le type :

GameObject go = Resources.Load("Prefabs/Cube",typeof(GameObject)) as GameObject ;

Resources.Load <type de ressource à charger> (chemin de chaîne de la ressource à charger)
la valeur de retour est le type de ressource à charger.
Chargez de manière synchrone les ressources du type spécifié dans le dossier Ressources.
S'il existe plusieurs ressources du même type et du même chemin, seule la première ressource trouvée sera renvoyée.

La valeur de retour Resources.LoadAll (chaîne le chemin du dossier ou le chemin du fichier de la ressource à charger)
est de type Object[].
Chargez de manière synchrone toutes les ressources du dossier avec le chemin spécifié dans le dossier Ressources, y compris toutes les ressources des dossiers descendants, puis renvoyez-le dans un tableau Object[].
Si le chemin est un fichier, seul le fichier sera chargé et un tableau Object[] sera renvoyé.
Si aucune ressource n'est chargée, un tableau Object[] sans aucun élément est renvoyé.

Resources.LoadAll (chemin du dossier de chaîne ou chemin du fichier de la ressource à charger, objet System.Type Type du type de ressource à charger)
la valeur de retour est de type Object[].
Charge de manière synchrone toutes les ressources du type spécifié dans le dossier avec le chemin spécifié dans le dossier Ressources, y compris toutes les ressources du type dans les dossiers descendants, puis les renvoie dans un tableau Object[].
Si le chemin est un fichier du type spécifié, seul le fichier sera chargé et un tableau Object[] sera renvoyé.
Si aucune ressource n'est chargée, un tableau Object[] sans aucun élément est renvoyé.

Resources.LoadAll<T>(string Chemin du dossier ou chemin du fichier de la ressource à charger)
Charge de manière synchrone toutes les ressources du type spécifié dans le dossier avec le chemin spécifié dans le dossier Ressources, y compris toutes les ressources de ce type dans les dossiers descendants ressource, puis la renvoie à un tableau Object[].
Si le chemin est un fichier du type spécifié, seul le fichier sera chargé et un tableau Object[] sera renvoyé.
Si aucune ressource n'est chargée, un tableau Object[] sans aucun élément est renvoyé.

Resources.LoadAsync (chemin de chaîne de la ressource à charger, logique UnityAction<Object> à exécuter après le chargement de la ressource)
la valeur de retour est de type ResourceRequest.
Généralement utilisé en conjonction avec des coroutines. Le retour de rendement peut être utilisé dans les coroutines pour attendre le chargement des ressources.
Chargez de manière asynchrone les ressources dans le dossier Ressources.
S'il existe plusieurs ressources avec le même chemin, seule la première ressource trouvée sera chargée.
Le paramètre du rappel est la ressource chargée.

if (GUI.Button(new Rect(150,0,150,80),"异步加载单个资源"))
        {
            StartCoroutine(LoadAsyncCoroutine());
        }

        IEnumerator LoadAsyncCoroutine()
        {
            //开始异步加载
            ResourceRequest resourceRequest = Resources.LoadAsync<GameObject>("Prefabs/Cube");
            //等待资源加载完毕
            yield return resourceRequest;
            //加载成功加载的资源--资源加载完毕后执行的逻辑
            Instantiate(resourceRequest.asset);
        }

Resources.LoadAsync (chemin de chaîne de la ressource à charger, objet System.Type Type de la ressource à charger, logique UnityAction<Object> à exécuter après le chargement de la ressource) La
valeur de retour est le type ResourceRequest.
Généralement utilisé en conjonction avec des coroutines. Le retour de rendement peut être utilisé dans les coroutines pour attendre le chargement des ressources.
Chargez de manière asynchrone les ressources du type spécifié dans le dossier Ressources.
S'il existe plusieurs ressources avec le même chemin, seule la première ressource trouvée sera chargée.
Le paramètre du rappel est la ressource chargée.

Resources.LoadAsync <type de ressource à charger> (chemin de chaîne de la ressource à charger, logique UnityAction <type de ressource à charger> à exécuter après le chargement de la ressource) la valeur de retour est de type ResourceRequest
.
Généralement utilisé en conjonction avec des coroutines. Le retour de rendement peut être utilisé dans les coroutines pour attendre le chargement des ressources.
Chargez de manière asynchrone les ressources du type spécifié dans le dossier Ressources.
S'il existe plusieurs ressources du même type et du même chemin, seule la première ressource trouvée sera chargée.
Le paramètre du rappel est la ressource chargée.

Les ressources chargées avec Resources.Load, Resources.LoadAsync et Resources.LoadAll occuperont de la mémoire même si elles ne sont pas utilisées dans la scène. Pour les libérer à ce stade, vous pouvez utiliser la méthode Resources.UnloadUnusedAssets et la méthode Resources.UnloadAssets.

La valeur de retour Resources.UnloadUnusedAssets
est de type AsyncOperation.
Déchargez de manière asynchrone toutes les ressources chargées en mémoire à l’aide de ressources et qui ne sont actuellement utilisées nulle part.
Peut être utilisé avec des coroutines.
Par exemple, si vous souhaitez décharger un préfabriqué chargé à l'aide de ressources, vous devez vous assurer que tous les objets créés par le préfabriqué dans la scène ont été détruits et que la ressource préfabriquée n'est affectée à aucune variable dans aucun script.
Si tel est le cas, vous pouvez attribuer la variable à null afin que cette méthode puisse la libérer avec succès.

Resource.UnloadAsset(Object La ressource à décharger)
n'a aucune valeur de retour.
Désinstallez la ressource spécifiée.
Seuls les types non GameObject et les types de composants, tels que Mesh, Texture, Material et Shader, peuvent être déchargés. Si vous désinstallez une ressource dont la désinstallation n'est pas autorisée, une erreur sera signalée.
Toutes les scènes ou ressources chargées ultérieurement qui font référence à cette ressource entraîneront le chargement d’une nouvelle instance de la ressource à partir du disque. Cette nouvelle instance sera indépendante de l'objet précédemment déchargé.


Resources.FindObjectsOfTypeAll<Type to be found>()
renvoie les objets chargés du type spécifié dans un tableau du type spécifié.
Y compris, mais sans s'y limiter, les objets de jeu, les préfabriqués, les matériaux, les maillages, les textures, etc.
Cette méthode renvoie également les objets internes d'Unity dans ce tableau, gérez donc les objets renvoyés avec soin.
Tant que l'objet est du type spécifié et a été chargé, il sera renvoyé dans ce tableau même s'il est désactivé.

Resources.FindObjectsOfTypeAll (objet Type Type du type à trouver)
renvoie les objets chargés du type spécifié dans un tableau de type Object[].
Y compris, mais sans s'y limiter, les objets de jeu, les préfabriqués, les matériaux, les maillages, les textures, etc.
Cette méthode renvoie également les objets internes d'Unity dans ce tableau, gérez donc les objets renvoyés avec soin.
Tant que l'objet est du type spécifié et a été chargé, il sera renvoyé dans ce tableau même s'il est désactivé.

La valeur de retour Resources.InstanceIDToObject (ID d'instance int de l'objet)
est de type objet.
Renvoie un objet en fonction de son ID d'instance.
L'ID d'instance d'un objet peut être obtenu via Object.GetInstanceID().

Synchrone Asynchrone

Synchronisation : faites une chose, et après l'avoir terminée, faites la suivante. Il faut faire une chose avant d’en faire une autre.

Asynchrone : lorsque vous commencez à faire quelque chose, vous n'attendez pas que la chose se termine pour commencer immédiatement à faire la chose suivante. Plusieurs choses peuvent être faites ensemble.

La plus grande différence entre la synchronisation et l'asynchrone est que la synchronisation bloquera le thread principal et que l'asynchrone ne bloquera pas le thread principal.
 

Encapsule le chargement asynchrone de ResourcesManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

/// <summary>
/// 资源管理器
/// </summary>
public class ResourcesManager : SingletonPatternBase<ResourcesManager>
{
    /// <summary>
    /// 异步加载Resources文件夹中指定类型的资源
    /// </summary>
    public void LoadAsync<T>(string path,UnityAction<T> callback = null) where T:Object
    {
        MonoManager.Instance.StartCoroutine(LoadAsyncCoroutine<T>(path, callback));
    }

    IEnumerator LoadAsyncCoroutine<T>(string path, UnityAction<T> callback = null) where T : Object
    {
        //开始加载资源
        ResourceRequest resourceRequest = Resources.LoadAsync<T>(path);
        //等待资源加载完毕
        yield return resourceRequest;
        //执行资源加载完毕后的动作
        callback?.Invoke(resourceRequest.asset as T);
    }

    /// <summary>
    /// 异步卸载资源,往往在切换场景的时候使用
    /// </summary>
    /// <param name="callback"></param>
    public void UnloadUnusedAssets(UnityAction callback=null)
    {
        MonoManager.Instance.StartCoroutine(UnloadUnusedAssetsCoroutine(callback));
    }

    IEnumerator UnloadUnusedAssetsCoroutine(UnityAction callback = null)
    {
        //开始卸载资源
        AsyncOperation asyncOperation = Resources.UnloadUnusedAssets();
        //等待资源卸载
        while(asyncOperation.progress < 1)
        {
            //等待一帧
            yield return null;
        }
        //资源卸载之后的逻辑
        callback?.Invoke();
    }
}

Guess you like

Origin blog.csdn.net/zaizai1007/article/details/132361056