#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.