Координаты transform.position не совпадают с тем, что пишет Debug.Log(transform.position)

Пишу свою 2d игру и столкнулся с проблемой:

Есть карта, её игрок будет свайпать влево или вправо (как в игре Reigns). Основная логика работает через интерфейсы IDragHandler, IBeginDragHandler, IEndDragHandler. Ниже показана реализация.

Замечу, что объект добовляется в Canvas. Когда я "переношу" карту, я меняю ей координаты по оси x. Когда я пишу это в Log, координаты работают корректно, но на сцене ничего не происходит. Замечу, что координата по оси z меняется (я проверил это включив 3d режим), но x и y неподвижны. Стоит отметить, что этот код работал, но я решил переписать игровую логику и архитектуру игры. После этого, по классике, всё сломалось.

public class ItemBehaviour : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{

    private Camera cam;

    private Vector3 offset;

    private bool dropCard = true;
    private bool goRightCard = false;
    private bool goLeftCard = false;

    [Header("GameMaster")]
    [SerializeField]
    private GameMaster gm;

    [Header("CardParametrs")]
    [SerializeField]
    private float rotationCoef;
    [SerializeField]
    private float speedComebackCam;

    void Awake()
    {
        cam = Camera.allCameras[0];
        gm = transform.GetComponentInParent<GameMaster>();
    }
    void Update()
    {
        //Добавляем немного наклона
        transform.eulerAngles = new Vector3(0, 0, transform.position.x * rotationCoef);
        //если карту отпустили раньше времени, нужно вернуть её на изначальное место
        if (dropCard)
        {
            transform.position = Vector3.MoveTowards(transform.position, new Vector3(0, 0, 0), Time.deltaTime * speedComebackCam);
        }
        //Если карта ушла влево или вправо, позволим ей уйти полностью с экрана перед уничтожением
        if (goRightCard)
        {
            transform.Translate(Vector3.right * speedComebackCam * 1.2f * Time.deltaTime);
            goLeftCard = goRightCard = false;
            Invoke("DestroyObject", 0.5f);
        }
        if (goLeftCard)
        {
            transform.Translate(Vector3.left * speedComebackCam * 1.2f * Time.deltaTime);
            goLeftCard = goRightCard = false;
            Invoke("DestroyObject", 0.5f);
        }
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        offset = transform.position - cam.ScreenToWorldPoint(eventData.position);
        offset.y = transform.position.y;
        dropCard = false;
    }

    public void OnDrag(PointerEventData eventData)
    {
        Vector3 newPos = cam.ScreenToWorldPoint(eventData.position);
        //newPos.z = 0f;
        newPos.y = transform.position.y;
        transform.position = newPos + offset;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        dropCard = true;
    }

    private void DestroyObject()
    {
        Destroy(transform.gameObject);
    }

    //нужно для уничтожения карты
    private void OnTriggerEnter2D(Collider2D collision)
    {
        //Соприкосновение с Destroycardleft and right
        if (collision.transform.gameObject.tag == "DestroyCardRight")
        {
            transform.gameObject.GetComponent<BoxCollider2D>().enabled = false;
            gm.gameSettings.canSpawn = true;
            goRightCard = true;
        }
        if (collision.transform.gameObject.tag == "DestroyCardLeft")
        {
            transform.gameObject.GetComponent<BoxCollider2D>().enabled = false;
            gm.gameSettings.canSpawn = true;
            goLeftCard = true;
        }
    }
}

На первом скриншоте координаты в инспекторе, на втором - координаты в дебаггере transform.position, на третьем скриншоте координаты в дебаге с localPosition

Я нашёл один кейс в интернете, в нём советовалось проверять и смотреть и менять transform.localPosition. Так вот это не работает. Он также меняет его только в Debug.Log(), в inspector ничего не происходит. Я также убедился, что transform не static и что я работаю с тем объектом, с которым предполагаю.

Подозреваю, что дело может быть в RectTransform, но не понимаю, почему до реворка всё работало, потому что по факту ничего изменено не было.

Inspector Debug.Log("pos: " + transform.position) "pos: " + transform.localPosition


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

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

Я понял, в чём была проблема и решил её

У меня был включен аниматор на этой карте. Когда я инстантил карту, я проигрывал анимацию. После того, как я выключил аниматор, я смог изменять координаты карты также, как это было до реворка.

Я думаю, что это связано с тем, что ключи последнего кадра в анимации не давали карте двигаться влево и вправо, в связи с этим я не мог влиять на них из скрипта.

Мораль: относитесь внимательнее к ключам анимации.

→ Ссылка