The answer is entirely dependent on Canvas Render Mode and Canvas Scaler. “It’s complicated.”
Your best bet with UI is just PUT a blank object in the center of the screen and use it.
To see what I mean by “complicated”, put this script on a single UI thing under a canvas and put it dead-center.
Now go wiggle the render mode and scaling modes and watch the Debug.Log()
using UnityEngine;
[ExecuteInEditMode]
public class ReportPosition : MonoBehaviour
{
void Update()
{
var pos = transform.position;
Debug.Log( name + " at " + pos.x.ToString( "N2") + ", " + pos.y.ToString( "N2"));
}
}
Also, I think that this might just be all you need for this problem:
Here are some notes on UI Anchoring, Scaling, CanvasScaler, etc: