Позиция объекта не меняется

В скрипте я создаю объект, добавляю ему родителя canvas и привязываю к нему изображение.
Я хочу, чтобы он оказался в позиции (x,y,z), но изображение (а значит и объект) появляется в центре экрана и не меняет позицию. Пробовал по-разному менять положение, пробовал и у объекта, и у привязанного изображения менять позицию - все также в центре экрана. Причем изменение размера через rectTransform.sizeDelta работает отлично.

    GameObject newObject = new GameObject("ObjectName");
    newObject.transform.SetParent(GameCanvas.transform, false);
    RectTransform rectTransform = newObject.AddComponent<RectTransform>();
    rectTransform.sizeDelta = new Vector2(100, 100);
    Image image = newObject.AddComponent<Image>();
    image.sprite = Sprites[spriteNum];
    newObject.GetComponent<RectTransform>().anchoredPosition = new Vector3(targetPosition.x, 
    targetPosition.y, floatz);

Пробовал разные варианты, не помогло (anchoredPosition, localPosition, position):

1 вариант.
newObject.GetComponent().anchoredPosition = new Vector3(targetPosition.x, targetPosition.y, floatz);

2 вариант.
newObject.transform.localPosition = new Vector3(targetPosition.x, targetPosition.y, floatz);
newObject.transform.TransformPoint(new Vector3(targetPosition.x, targetPosition.y, floatz));`

3 вариант.
rectTransform = newObject.AddComponent();
rectTransform.position = new Vector3(targetPosition.x, targetPosition.y, floatz);

4 вариант.
transform.GetComponent().localPosition = new Vector3(targetPosition.x, targetPosition.y, floatz);
image.transform.position = new Vector3(targetPosition.x, targetPosition.y, floatz);` `image.rectTransform.localPosition = new Vector3(targetPosition.x, targetPosition.y, floatz);

5 вариант.
newObject.GetComponent<RectTransform>().transform.position = new Vector3(targetPosition.x, targetPosition.y, floatz);
image.rectTransform.anchoredPosition = new Vector3(targetPosition.x, targetPosition.y, floatz);
newObject.GetComponent().localPosition = new Vector3(targetPosition.x, targetPosition.y, floatz);

Update Поменял скрипт: в самом скрипте ничего не создаю, только передаю туда уже созданное на canvas'e изображение. Пытаюсь изменить его позицию в скрипте:

image.rectTransform.position = new Vector3(targetPosition.x, targetPosition.y, floatz);
Debug.Log(targetPosition.x);
Debug.Log(targetPosition.y);

Но изображение появляется не в targetPosition, a в левом нижнем углу экрана. Пробовал дебажить позицию: значения адекватные - в рамках экрана(не в центре и не в левом нижнем углу). Непонятно, почему такое происходит.


Ответы (1 шт):

Автор решения: Yaroslav

Ты не можешь добавить AddComponent<RectTransform>();, потому, что он уже есть.

anchoredPosition это не центр изображения, а абсолютно иное.

[DisallowMultipleComponent]

public class Foo : MonoBehaviour {

    [SerializeField] private Transform _canvas;
    [SerializeField] private Sprite _sprite;
    [SerializeField] private Vector3 _position;

    private void Awake () {
        GameObject NewObject = new GameObject("Name");
        NewObject.transform.SetParent(_canvas);
        RectTransform ObjectRect = NewObject.transform as RectTransform;
        ObjectRect.localPosition = _position;
        ObjectRect.localEulerAngles = Vector3.zero;
        ObjectRect.localScale = Vector3.one;
        Image Image = NewObject.AddComponent<Image>();
        Image.sprite = _sprite;
        ObjectRect.sizeDelta = new Vector2(Image.sprite.rect.width, Image.sprite.rect.height);
    }
}
→ Ссылка