Unity: изменение родительского объекта gameObject в пользовательском интерфейсе и его положения без перемещения дочернего объекта gameObject - PullRequest
0 голосов
/ 07 мая 2020

У меня есть пользовательский интерфейс в Unity, в котором я постоянно перемещаю элементы из одного места в другое.

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

Что я хочу: при изменении родительского элемента (то есть его перемещении, поскольку все мои родители имеют группы макетов) дочерний объект gameObject должен оставаться в той же позиции в мире

Что у меня: при изменении родительского элемента дочерний объект gameObject меняет мировую позицию

Что я могу сделать: я мог каждый раз сбрасывать положение дочернего объекта gameObject , как я делаю в первый раз, когда создается экземпляр gameObject с использованием этого кода (относительный gameObject растягивается)

Vector3[] corners = new Vector3[4];
transform.parent.parent.GetComponent<RectTransform>().GetWorldCorners(corners);
float width = corners[2].x - corners[0].x;
float height = corners[1].y - corners[0].y;
RectTransform itemTransform = item.transform.GetChild(1).GetComponent<RectTransform>();
itemTransform.position = new Vector3(width / 2, height / 2);

Что я хочу знать: есть ли что-то встроенное в Monobehavior или Unity, что предотвращает запуск дочернего gameObject перемещение

Вот пошаговые изображения одного из случаев, которые он может применить: Here I have a bag called

Здесь у меня есть сумка под названием «sa c a dos "в моей комнате

Now I have opened The bag, which shows up in the middle of the screen

Теперь я открыл сумку, которая отображается в центре экрана

I now have created a chest item called

Теперь я создал предмет сундука под названием "Coffre" в том же месте, в результате чего сумка будет помещена в качестве дочернего элемента контейнера сундука child gameObject

Here I opened the chest, showing the bag that was put as child of the chest's container child gameObject, and positioned at the right place

Здесь я открыл сундук, расположенный в нужном месте, и показал сумку, которая была помещена в качестве дочернего элемента контейнера сундука. Child gameObject

Here I opened the bag in the chest, causing the bag's child gameObject to be misplaced since the bag's position changed

Здесь я открыл сумку в сундуке, в результате чего дочерний объект gameObject мешка оказался не на своем месте, так как положение мешка изменилось

1 Ответ

0 голосов
/ 07 мая 2020

Думаю, вам следует отделить данные об элементах от их отображения.

Когда у вас есть общее отображение ваших элементов, напишите метод Show, в котором вы можете передать отображаемые данные элемента.

Пример:

public class ItemDisplay : MonoBehaviour
{
    public void Show(ItemData itemData)
    {
        this.gameObject.SetActive(true);

        foreach (var property in itemData.properties)
        {
            DisplayProperty(property);
        }
    }

    private void DisplayProperty(){...}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...