Создание объекта UI в позиции другого объекта с сохранением Canvas в качестве родительского - PullRequest
0 голосов
/ 25 марта 2020

Столкнулся с проблемой пользовательского интерфейса, которую я изо всех сил пытаюсь решить (пользовательский интерфейс всегда является проблемой для меня). Суть проекта в том, что у меня есть массив точек появления (Positions [i]), массив, состоящий из префабов противника (Enemies [j]) и просто префаб панели пользовательского интерфейса с текстовым компонентом (EnemyHUD). Когда я передаю имена строк через определенную функцию, пока есть готовый сборный дом с таким же именем и позицией, он загружается во врага. Теперь, для каждого загруженного префаба противника, я хотел бы, чтобы префаб "EnemyHUD" создавал экземпляры на позициях противника и с текстом, отображающим имя врага.

GameObject HUD = Instantiate(EnemyHUB, Positions[i].position, Positions[i].rotation);

Эта строка порождает префаб EnemyHUD в правильное местоположение, но оно определяет их за пределами холста, чтобы они отображались в виде красных крестиков. Поэтому я добавил это:

HUD.transform.SetParent(GameObject.Find("Canvas").transform, false);

Это устраняет проблему создания экземпляра за пределами холста, но также (раздраженно) сбрасывает позицию создания экземпляра и смущающе, я не уверен, как установить его обратно, при этом убедившись, что это остается ребенком холста. Пока событие не касалось части изменения имени.

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

1 Ответ

0 голосов
/ 26 марта 2020

Прежде всего, я настоятельно рекомендую по возможности избегать Find! Скорее уже ссылаться на соответствующий Canvas и хранить его ссылку. В особенности i давайте предположим, что вы делаете это в al oop, поэтому многократное использование Find крайне неэффективно!

// Drag you Canvas object into this field via the Inspector in Unity
[SerializeField] private Canvas _parentCanvas;

private void Awake()
{
    // use this only as fallback an only ONCE
    if(!_parentCanvas) _parentCanvas = GameObject.Find("Canvas");

    if(!_parentCanvas) Debug.LogError("Could not get Canvas!", this);
}

Ну, а затем второй параметр Transform.SetParent называется

worldPositionStays
Если true, положение, масштаб и вращение родительского элемента изменяются таким образом, что объект сохраняет тот же мир позиция пробела, вращение и масштаб, как и раньше .

И

Значение по умолчанию для аргумента worldPositionStays равно true.

Просто оставьте это как

HUD.transform.SetParent(_parentCanvas);
// this equals
//HUD.transform.SetParent(_parentCanvas, true);

или вы можете сделать это за один go уже в Object.Instantiate, который принимает дополнительный параметр

parent
Родитель, который будет назначен новому объекту.

// This directly instantiates the new hud as child of _parentCanvas
// while still taking the position and rotation in absolute worldspace
GameObject HUD = Instantiate(EnemyHUB, Positions[i].position, Positions[i].rotation, _parentCanvas);
...