Custom Graphic or MaskableGraphic does not show

I am trying to create a custom class to use in my UI layout, but it does not appear to do anything, there is a function OnPopulateMesh() that is never called, I have also tried to call SetAllDirty() in OnEnable() but that function is still never called and then nothing appears on screen.

For example this code does nothing for me: Unity - Scripting API: Graphic

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


[ExecuteInEditMode]
public class BevelBox : Graphic
{
    protected override void OnPopulateMesh(VertexHelper vh)
    {
        Debug.Log("populating mesh");
        Vector2 corner1 = Vector2.zero;
        Vector2 corner2 = Vector2.zero;

        corner1.x = 0f;
        corner1.y = 0f;
        corner2.x = 1f;
        corner2.y = 1f;

        corner1.x -= rectTransform.pivot.x;
        corner1.y -= rectTransform.pivot.y;
        corner2.x -= rectTransform.pivot.x;
        corner2.y -= rectTransform.pivot.y;

        corner1.x *= rectTransform.rect.width;
        corner1.y *= rectTransform.rect.height;
        corner2.x *= rectTransform.rect.width;
        corner2.y *= rectTransform.rect.height;

        vh.Clear();

        UIVertex vert = UIVertex.simpleVert;

        vert.position = new Vector2(corner1.x, corner1.y);
        vert.color = color;
        vh.AddVert(vert);

        vert.position = new Vector2(corner1.x, corner2.y);
        vert.color = color;
        vh.AddVert(vert);

        vert.position = new Vector2(corner2.x, corner2.y);
        vert.color = color;
        vh.AddVert(vert);

        vert.position = new Vector2(corner2.x, corner1.y);
        vert.color = color;
        vh.AddVert(vert);

        vh.AddTriangle(0, 1, 2);
        vh.AddTriangle(2, 3, 0);
    }

    protected override void OnEnable()
    {
        Debug.Log("enabled");
        base.OnEnable();
        SetAllDirty();
    }
}

I am using Unity version 2021.1.22f1

What am I doing wrong?

OK, so I have created a test project with Unity 2018 and it worked, perfectly I don’t know but at least OnPopulateMesh() was called…then I upgraded it to Unity 2021 and it still worked. But when creating the same project directly in Unity 2021 it won’t work, I have no idea why and I’m going to submit a bug report.

ETA: so, after submitting the bug report, I’ve been told that it was because the Canvas Renderer was missing. The difference was because Unity 2018 creates the canvas renderer as soon as you drop the script on the component and Unity 2021 does not.

4 Likes