UnityEditor charge le modèle AssetBundle et devient rose

Lors du développement d'un jeu Unity, sous UnityEditor, nous utilisons généralement directement les ressources du jeu (code lua, préfabriqué, images, matériaux, etc.). Après la sortie du jeu, les actifs sont généralement exportés en tant que AssetBundle pour être utilisés dans le jeu.

Unity générera différents AssetBundles pour différentes plates-formes (android, ios, windows). Si nous utilisons directement l'AssetBundle généré pour la plate-forme android ou ios sous UnityEditor, il apparaîtra généralement en rose (échec du rendu du shader), la raison en est que sur Android Les shaders compilés (OpenGLES3, Vulkan) ne sont pas pris en charge sous Windows (Direct3D11,).

Solution 1 : La première modification des API graphiques sur la plate-forme Windows est OpenGLES3, et redémarrez l'éditeur.Après le redémarrage, le problème de perte de Shader (rose) est résolu, mais certaines versions de Unity (2021.1.24f1) ont des bugs dans l'inspecteur panneau

La méthode de fonctionnement est la suivante

 

 

Solution 2 : Une fois l'AssetBundle chargé, remplacez le code du shader comme suit :

Mais cette méthode présente également quelques problèmes, qui se reflètent dans la différence d'effet de certains shaders avec des variantes.

Par exemple, j'ai rencontré un problème ici. Le shader qui était rendu à l'origine dans le calque transparent était en effet rendu dans le calque opaque. Trouvez l'objet sous le panneau Hiérarchie, puis développez les paramètres de matériau dans le panneau Inspecteur et revenez au rendu des calques transparents.

 

_loaderData.assetObject = _assetBundleRequest.asset;
AssetUtil.Editor_ReplaceShader(_loaderData.assetObject as GameObject);
  [System.Diagnostics.Conditional("UNITY_EDITOR")]
        public static void Editor_ReplaceShader(GameObject go)
        {
            if (go == null)
            {
                return;
            }
            Renderer[] renderers = go.GetComponentsInChildren<Renderer>(true);
            foreach (var renderer in renderers)
            {
                UnityEngine.Material[] matArr = renderer.sharedMaterials;
                foreach (var mat in matArr)
                {
                    Editor_ReplaceShader(mat, go.name);
                }
            }

        }
        [System.Diagnostics.Conditional("UNITY_EDITOR")]
        public static void Editor_ReplaceShader(Material mat, string gameObjectName = null)
        {
            if (mat != null && mat.shader != null)
            {
                Shader shader = Shader.Find(mat.shader.name);
                if (shader != null)
                {
                    mat.shader = shader;
                }
                else
                {
                    UnityEngine.Debug.LogError($"can't find the shader material={mat}, gameObject={gameObjectName}, shader={mat.shader.name}");
                }
            }
        }

 

おすすめ

転載: blog.csdn.net/PangNanGua/article/details/127867543