UnityでuGUIを使用する場合、複数の解像度に対応するため、Canvas Scalerを割り当てます。

canvas_scaler

しかし、Canvas Scalerを与えたCanvasにおいて、子要素の座標をスクリプトから制御しようとした場合、transform.positionにCanvas Scalerの拡大率が考慮されないため、うまく制御できません。これは、Unity Editor上では、Canvas Scalerで指定した座標系で設定できるのが、スクリプトでは実座標系で設定することになるのが原因です。

スクリプトからも、Canvas Scalerで指定した座標系で値を設定するには、anchoredPosition3Dを使用します。

具体的に、
 gameObject.transform.position=v;
ではなく、
 gameObject.GetComponent<RectTransform>().anchoredPosition3D=v;
と記述することで、Canvas Scalerを適用しても、適切な位置に子要素を設定することができます。