Как правильно переместить родительский объект вслед за дочерним?

Я хочу сдвинуть объект родителя, «держась» за его дочерний элемент. Я пытаюсь написать инструмент для Editor. Поэтому мой скрипт помечен атрибутом [ExecuteInEditMode]. Но атрибут имеет лишь косвенное отношение к вопросу.

Решение «в лоб» вот такое:

[ExecuteInEditMode]
public class MoveController : MonoBehaviour
{
    [SerializeField] private Transform _child;

    private void Update()
    {
        transform.position = _child.position;
    }
}

Оно же было принято как ответ вот в этом обсуждении: https://forum.unity.com/threads/moving-parent-with-child-component.502310/

Однако последний комментарий вполне четко описывает проблему с таким решением:

если мы перемещаем ребенка ... с постоянной скоростью, ... то ребенок будет продолжать ускоряться за пределами экрана

Я перемещаю дочерний элемент инструментом Move («стрелками»). Но получаю точно такой же результат. Очевидно, что при перемещении родителя происходит и новое перемещение потомка, которое прибавляется к исходному перемещению, что приводит к быстрому и неконтролируемому возрастанию скорости перемещения.

Напрашивается некая дельта, которую нужно учесть при перемещении. Нечто подобное обсуждалось вот здесь: https://answers.unity.com/questions/726548/how-to-move-parent-when-child-moves.html

Но код из обсуждения, принятый в качестве ответа ( transform.parent.position = transform.position - transform.localpostiion;) по сути оставляет родителя на своем месте.

Я предположил, что нужно учесть дельту локального смещения. Написал такой код:

private void Update()
{
    Vector3 delta = _child.localPosition - _oldChildLocalPosition;
    _child.position -= delta;
    transform.position += delta;

    _oldChildLocalPosition = _child.localPosition;
}

Однако результат мало отличается от первой версии. Родитель всё ещё непредсказуемо ускоряется при перемещении потомка. Или я где-то допустил глупую ошибку или я упускаю какую-то важную, но неочевидную деталь.


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