材質實例

MaterialInstance行為有助於在追蹤實例材質存留期,並自動終結使用者的實例材料。 這個公用程式元件可以用來取代轉譯器。材質或轉譯器的材質。

注意

MaterialPropertyBlocks 優先于材質實例,但在所有案例中都不會提供。

為何要使用轉譯器 。材質 有問題? 如果您將下列程式碼新增至 Unity 場景,而點擊播放記憶體使用量將會繼續進行順向和順向:

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

注意

如果執行太久,上述的洩漏行為 將會損毀

另一種方法是使用 MaterialInstance 下列行為:

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

使用方式

當叫用 Unity 的轉譯 器時, (s) ,Unity 會自動將新的資料具現化。 當不再需要材質或遊戲物件損毀時,呼叫者必須負責終結材質。 此 MaterialInstance 行為有助於避免材質流失,並在編輯和執行時間期間讓材質配置路徑保持一致。

當無法使用 MaterialPropertyBlock 且必須具現化資料時, MaterialInstance 可以使用如下所示的內容:

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

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

如果有多個物件需要材質實例的擁有權,最好是取得參考追蹤的明確擁有權。 (IMaterialInstanceOwner 具有擁有權之且有助於的選擇性介面。以下 ) 範例使用方式:

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

如需詳細資訊,請參閱在行為中示範的範例使用 ClippingPrimitive 方式。

另請參閱