«Прикрепление» созданного сборного элемента к gameobject

#unity3d

#unity3d

Вопрос:

У меня есть 2 игровых объекта (2D-проект):

 GameObject enemy1 = GameObject.Find("Enemy1"); // Sprite Renderer "Order in Layer" 1
GameObject enemy2 = GameObject.Find("Enemy2"); // Sprite Renderer "Order in Layer" 2
  

Создается экземпляр сборного элемента fire (просто анимация огня):

 GameObject go = Instantiate(Resources.Load<GameObject>("Animations/Fire1")); // Sprite Renderer "Order in Layer" 5
go.transform.SetParent(enemy1.transform);
go.transform.position = enemy1.transform.position;
  

Поскольку средство визуализации спрайтов fire prefab Order in Layer равно 5, оно всегда поверх обоих врагов.

Я бы хотел, чтобы огонь отображался над enemy1, но позади enemy2, независимо от того, на что они Order in Layer изменены. В принципе, это должно выглядеть так, как будто враг загорается, даже если он движется или меняется порядок слоев.

Как этого можно достичь? Я думал, что создание сборного элемента fire дочерним элементом вражеского gameobject сделает это, но это не так.

Редактировать: создание анимации огня дочерним элементом врага вручную в редакторе работает отлично. Как мне повторить это с помощью кода?

Комментарии:

1. очевидно, но, если вы хотите, чтобы огонь отображался над enemy1, но за enemy2, соответствующим образом установите слои из 3 элементов. Например, enemy1 layer1, explosion layer2 и enemy2 layer3. Это не работает?

2. Это сработает … но позже у меня будет еще много врагов. Как следует перестраивать слои, когда enemy6 загорается?

3. Я не очень разбираюсь в 2D-разработке, но если это сработает, если уровень 1 работает для врагов под огнем, вы можете обработать в коде статус «Под огнем» и присвоить этому слою всех врагов, которые на самом деле находятся под огнем. Можете ли вы?

4. На самом деле я вообще не хочу иметь дело с упорядочением слоев. Если я вручную перетаскиваю анимацию и делаю ее дочерним элементом врага, она работает отлично! Я хочу повторить это с помощью кода.

Ответ №1:

Создание экземпляра сборного элемента таким образом устранило проблему:

go = Instantiate(Resources.Load<GameObject>("Animations/Fire1"), enemy1.transform);

Изменение добавленных сборных sortingOrder элементов также было необходимо, чтобы все работало правильно:

go.GetComponent<SpriteRenderer>().sortingOrder = enemy1.GetComponent<SpriteRenderer>().sortingOrder;

После этого возникла небольшая проблема — созданный сборный элемент случайным образом появлялся позади или перед врагом. Это было исправлено путем добавления Sorting Group компонента в сборный элемент fire.