Как правильно переместить родительский объект вслед за дочерним?
Я хочу сдвинуть объект родителя, «держась» за его дочерний элемент. Я пытаюсь написать инструмент для 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;
}
Однако результат мало отличается от первой версии. Родитель всё ещё непредсказуемо ускоряется при перемещении потомка. Или я где-то допустил глупую ошибку или я упускаю какую-то важную, но неочевидную деталь.