Aracılığıyla paylaş


Malzeme örneği — MRTK2

Davranış, MaterialInstance örnek malzeme ömrünü izlemeye yardımcı olur ve kullanıcı için örneklenen malzemeleri otomatik olarak yok eder. Bu yardımcı program bileşeni Renderer.material veya Renderer.materials yerine kullanılabilir.

Not

MaterialPropertyBlocks , malzeme kullanımı yerine tercih edilir ancak tüm senaryolarda her zaman kullanılamaz.

Renderer.material'ın kullanılması neden sorun olabilir? Bir Unity sahnesine aşağıdaki kodu eklerseniz ve yürütmeye isabet ederseniz bellek kullanımı tırmanmaya ve tırmanmaya devam eder:

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);
    }
}

Not

Yukarıdaki Sızıntı davranışı, çok uzun süre çalıştırılırsa Unity'yi kilitler !

Alternatif olarak şu davranışı kullanmayı MaterialInstance deneyin:

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);
    }
}

Kullanım

Unity'nin Renderer.material'leri çağrılırken Unity otomatik olarak yeni malzemelerin örneğini oluşturur. Artık bir malzeme gerekli olmadığında veya oyun nesnesi yok edildiğinde malzemeleri yok etmek arayanın sorumluluğudur. Bu davranış, MaterialInstance malzeme sızıntılarını önlemeye yardımcı olur ve düzenleme ve çalışma zamanı sırasında malzeme ayırma yollarını tutarlı tutar.

MaterialPropertyBlock kullanılamadığında ve bir malzemenin örnek alınması gerektiğinde, MaterialInstance aşağıdaki gibi kullanılabilir:

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

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

Malzeme örneğinin birden çok nesneye sahip olması gerekiyorsa, başvuru izleme için açık sahiplik almak en iyisidir. (Sahiplik ile yardımcıya adlı IMaterialInstanceOwner isteğe bağlı bir arabirim vardır.) Aşağıda örnek kullanım verilmiştir:

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.
        ...
    }
}

Daha fazla bilgi için lütfen davranış içinde ClippingPrimitive belirtilen örnek kullanıma bakın.

Ayrıca bkz.