Unity3D - переместить объект пользовательского интерфейса в центр экрана, сохраняя его родительский элемент

У меня есть изображение пользовательского интерфейса, которое связано с контейнером RectTransform, который связан с панелью пользовательского интерфейса, которая связана с Canvas.

Я хочу иметь возможность перемещать это изображение пользовательского интерфейса в центр экрана (т.е. холст), оставляя родительскую иерархию. Моя цель — анимировать изображение пользовательского интерфейса из центра туда, где оно сейчас. Не могли бы вы сообщить мне, как будет выглядеть этот код?

введите здесь описание изображения


person IHateATMFees    schedule 25.07.2017    source источник
comment
Немного запутался в том, что вы спрашиваете. Вы пытаетесь расположить ячейку в центре перед запуском приложения?   -  person ryeMoss    schedule 25.07.2017
comment
@ryemoss, когда сцена загружается, я хочу, чтобы ячейка начиналась в центре экрана (вместе с сотнями других), а затем я анимирую ячейки в их предполагаемых положениях. Положение UICell на скриншоте инспекторов показывает, где я хочу, чтобы был пункт назначения.   -  person IHateATMFees    schedule 25.07.2017
comment
есть ли причина, по которой вы разместили родительские объекты в этих конкретных местах x и y? Где окажется UICell, если вы установите все их позиции в (0,0)?   -  person ryeMoss    schedule 25.07.2017
comment
@ryemoss я сделал еще один скриншот, который, я надеюсь, лучше объясняет, почему я размещаю вещи где. Спасибо. imgur.com/a/GvEfM   -  person IHateATMFees    schedule 26.07.2017


Ответы (2)


Чтобы ответить на ваш первоначальный вопрос, вы можете поместить UICell в центр экрана, используя:

private RectTransform rect;

void Start() 
{
    rect = GetComponent<RectTransform>();
    rect.position = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width / 2, Screen.height / 2, 10));
}

Затем есть несколько способов переместить ячейку в нужное место. Одним из способов может быть использование Vector2.Lerp. Однако из-за характера вашей прямоугольной родительской иерархии преобразования все немного усложнится с позиционированием — ниже приведен пример того, как вы можете выполнить движение.

float t;

void Update()
{
    t += Time.deltaTime;
    rect.localPosition = Vector2.Lerp(rect.localPosition, new Vector2(0, 0), t/3f);
}
person ryeMoss    schedule 26.07.2017
comment
К сожалению, похоже, что первый фрагмент помещает UICell в нижний левый угол экрана/холста. - person IHateATMFees; 26.07.2017
comment
Можете ли вы изменить режим рендеринга холста на Screen space - camera? - person ryeMoss; 26.07.2017
comment
хм.. Я использую орфографическую камеру, которая никогда не двигается, так что я думаю, что смогу, попробую сегодня вечером. благодарю вас. - person IHateATMFees; 26.07.2017
comment
спасибо за помощь, хотя это не привело меня туда, заставило меня подумать о том, что сделало: изменить родительские элементы UICell на холст, установить его в середине, а затем снова изменить родительские элементы. Будет опубликован как отдельный ответ. Извините, что не присудил вам поддельные интернет-очки, я должен вам пиво. - person IHateATMFees; 27.07.2017

В итоге сработало изменение родителя изображения пользовательского интерфейса на холст, перемещение изображения пользовательского интерфейса в середину холста (т.е. экрана) и восстановление исходного родительского отношения изображения пользовательского интерфейса. Оттуда мне просто нужно было анимировать исходное локальное положение.

var rectTransform = gameObject.GetComponent<RectTransform>();
var canvasRendererRectTransform = gameObject.transform.parent.parent.parent.GetComponent<RectTransform>();

rectTransform.SetParent(canvasRendererRectTransform);
rectTransform.localPosition = Camera.main.ScreenToViewportPoint(Vector3.one * 0.5f);
rectTransform.SetParent(gridRendererRectTransform);
person IHateATMFees    schedule 11.08.2017