Instance de matériau

Le MaterialInstance comportement aides dans le suivi de la durée de vie des documents d’instance et détruit automatiquement les matériaux instanciés pour l’utilisateur. Ce composant utilitaire peut être utilisé pour remplacer le convertisseur. Material ou Renderer. Materials.

Notes

Les MaterialPropertyBlocks sont préférables à l’instanciation du matériel, mais ne sont pas toujours disponibles dans tous les scénarios.

Pourquoi l’utilisation du convertisseur est-elle un problème ? Si vous ajoutez le code ci-dessous à une scène Unity et que vous appuyez sur lire, l’utilisation de la mémoire continuera à augmenter et à grimper :

public class Leak : MonoBehaviour
{
    private void Update()
    {
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        // Memory leak, the material allocated is not tracked & destroyed.
        cube.GetComponent<Renderer>().material.color = Color.red;
        ...
        Destroy(cube);
    }
}

Notes

Le comportement de fuite ci-dessus se bloquera si l’exécution est trop longue.

Essayez plutôt d’utiliser le MaterialInstance comportement :

public class NoLeak : MonoBehaviour
{
    private void Update()
    {
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        // No memory leak, the material allocated is tracked & destroyed by MaterialInstance.
        cube.EnsureComponent<MaterialInstance>().Material.color = Color.red;
        ...
        Destroy(cube);
    }
}

Usage

Lorsque vous appelez le convertisseurde l’unité, Unit (s), Unity instancie automatiquement les nouveaux matériaux. Il incombe à l’appelant de détruire les documents lorsqu’un matériau n’est plus nécessaire ou que l’objet de jeu est détruit. Le MaterialInstance comportement permet d’éviter les fuites matérielles et de préserver la cohérence des chemins d’accès au cours de la modification et de l’exécution.

Lorsqu’un MaterialPropertyBlock ne peut pas être utilisé et qu’un matériau doit être instancié, MaterialInstance peut être utilisé comme suit :

public class MyBehaviour : MonoBehaviour
{
    // Assigned via the inspector.
    public Renderer targetRenderer;

    private void OnEnable()
    {
        Material material = targetRenderer.EnsureComponent<MaterialInstance>().Material;
        material.color = Color.red;
        ...
    }
}

Si plusieurs objets ont besoin de la propriété de l’instance de matériau, il est préférable de prendre une propriété explicite pour le suivi de référence. (Une interface facultative appelée IMaterialInstanceOwner existe pour faciliter la propriété.) Voici un exemple d’utilisation :

public class MyBehaviour : MonoBehaviour,  IMaterialInstanceOwner
{
    // Assigned via the inspector.
    public Renderer targetRenderer;

    private void OnEnable()
    {
        Material material = targetRenderer.EnsureComponent<MaterialInstance>().AcquireMaterial(this);
        material.color = Color.red;
        ...
    }

    private void OnDisable()
    {
        targetRenderer.GetComponent<MaterialInstance>()?.ReleaseMaterial(this)
    }

    public void OnMaterialChanged(MaterialInstance materialInstance)
    {
        // Optional method for when materials change outside of the MaterialInstance.
        ...
    }
}

Pour plus d’informations, consultez l’exemple d’utilisation présenté dans le ClippingPrimitive comportement.

Voir aussi