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.