не знаю как вы, а я делаю все просто:
Vector3 pos = RectTransformUtility.WorldToScreenPoint (Camera.main, target.position );
//pos.z=-1f;
transform.position = pos;
(не знаю зачем эта обертка, вызывается все равно метод камеры, только сейчас референс провел и помотрел как и что)
Canvas в overlay стоит, иначе пляски с бубном начинаются.
А если канва в WorldSpace, то там объекты находятся в мировом пространстве и нужно сделать сначала WorldToScreen а потом ScreenToWorld, но уже с z-глубиной канваса, иначе все будет смещаться . (не знаю другого способа трансформировать координаты относительно матрицы вида камеры)
Тут еще смещение может быть из-за того, что точка объекта выше самого объекта. Как у меня тут:
Трансформ-бокс стоит строго по центру, но анхор у флажка выдвинут по z вперед, что бы относительно нуля стоял, а так как камера перспективная - получается такое смещение.