Ejemplo simple con vida, monedas y menú de pausa.

using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class UIManager : MonoBehaviour
{
    [Header("HUD")]
    [SerializeField]
    private Slider barraVida;

    [SerializeField]
    private TMP_Text textoVida;

    [SerializeField]
    private TMP_Text textoMonedas;

    [Header("Pausa")]
    [SerializeField]
    private GameObject panelPausa;

    [SerializeField]
    private InputActionReference pauseAction;

    private bool pausado;

    void Update()
    {
        if (pauseAction.action.WasPressedThisFrame())
        {
            CambiarPausa();
        }
    }

    public void ActualizarVida(
        int actual,
        int maxima)
    {
        barraVida.maxValue = maxima;
        barraVida.value = actual;

        textoVida.text =
            $"{actual} / {maxima}";
    }

    public void ActualizarMonedas(int monedas)
    {
        textoMonedas.text =
            monedas.ToString();
    }

    public void CambiarPausa()
    {
        pausado = !pausado;

        panelPausa.SetActive(pausado);

        Time.timeScale =
            pausado ? 0f : 1f;

        Cursor.visible = pausado;

        Cursor.lockState =
            pausado
                ? CursorLockMode.None
                : CursorLockMode.Locked;
    }
}

Qué incluye


Mejoras posibles