Работа с 2D играми в Unity предлагает упрощенную разработку и лучшую оптимизацию, однако достижение современных стандартов графики в мобильном гейминге с использованием только 2D может быть вызовом. Один из способов преодолеть это ограничение - создание 2.5D эффектов, в частности, реалистичных теней. В этой статье мы рассмотрим, как создать тени с возможностью редактирования их длины для вашей 2D игры. Часть материалов взята из публикации, отдельное спасибо пользователю badcceb

В Unity 2D не предусмотрено ограничения размера тени. Так если мы добавим Light2D => Spot на сцену и будем использовать его как солнце, тени будут бесконечно большие

Финальный результат: с тенью / без тени
Финальный результат: с тенью / без тени

Перенос Проекта на Universal Render Pipeline (URP)

Первым шагом в создании теней для вашей 2D игры является перенос проекта на Universal Render Pipeline (URP) в Unity. Этот процесс начинается с установки URP через Package Manager. Создайте новый URP Asset и активируйте его в настройках проекта (Edit → Project Settings → Graphics). Далее, обновите все материалы проекта для совместимости с URP, используя опцию "Upgrade Project Materials to UniversalRP Materials". Важно сохранить копию вашего проекта перед переносом, чтобы предотвратить потерю данных.

Импорт Библиотеки com.unity.render-pipelines.universal

Следующим шагом является копирование библиотеки com.unity.render-pipelines.universal из Library/PackageCache в Packages. Это делается для того, чтобы обеспечить доступ и возможность редактирования файлов, которые в противном случае были бы ограничены в Unity и перезаписывали на дефолтные значения.

Копируем из Library/PackageCache в Packages
Копируем из Library/PackageCache в Packages

Изменение Скриптов

Теперь необходимо изменить следующие скрипты: Light2D.cs, Light2DEditor.cs, и ShadowRendering.cs. Эти изменения позволяют вам контролировать интенсивность и радиус теней в вашем проекте.

Light2D.cs - Изменения

а) Пройдитесь по скрипту и найдите область m_ShadowIntensity и m_ShadowVolumeIntensity. Добавьте следующее:

[Range(0,1.42f)]

[SerializeField] float m_ShadowRadius = 1.42f);

б) Затем перейдите вниз туда, где указан «Public LightType LightType» и под ним добавьте следующее: public floatshadowRadius { get => m_ShadowRadius; set => m_ShadowRadius = значение; }

Закройте и сохраните Light2d.cs.

Light2DEditor.cs — Изменения

а) Найдите «private static class Styles», и в этой функции добавьте следующее:

public static GUIContent GeneralShadowRadius = EditorGUIUtility.TrTextContent("Shadow Radius");

б) Продвигайтесь вниз по классу, пока не найдете раздел, в котором есть несколько переменных SerializedProperty, и добавьте следующее: SerializedProperty m_ShadowRadius;

в) Перейдите к методу «OnEnable» и добавьте следующее:

m_ShadowRadius = serializedObject.FindProperty("m_ShadowRadius");

г) В методе «DrawSpotLight» добавьте следующее:

EditorGUILayout.Slider(m_ShadowRadius, 0, 1.42f, Styles.generalShadowRadius);

Закройте и сохраните Light2DEditor.cs.

ShadowRendering.cs — Изменения

a) Найдите метод «Public Static Bool RenderShadows», в нем «if (hasShadow)» найдите «var shadowRadius» и отредактируйте код таким образом:

var shadowRadius = light.shadowRadius * light.boundingSphere.radius;

Закройте и сохраните ShadowRendering.cs.

Применение Изменений и Тестирование

После внесения изменений, загрузите ваш проект и добавьте источник света Light2D, выберите Spot. Включите тени и используйте ползунок "Shadow Radius", чтобы наблюдать за изменениями в длине и интенсивности теней.

На объекты, которые должны отбрасывать тени обязательно добавьте ShadowCaster2D

Заключение

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

Дополнительные материалы

Прикрепляю ниже ссылку на папку где хранится com.unity.render-pipelines.universal@14.0.8 с отредактированными скриптами для правильной работы теней

Hidden text

Комментарии (2)


  1. aamonster
    07.12.2023 17:19
    +1

    А почему у вас кусты (или это стены?) тень не отбрасывают?

    Ну и что танки летают (форма тени) – тоже не очень. Или они и правда летающие?


  1. Algrinn
    07.12.2023 17:19
    +1

    Это что ещё за реалистичные тени? :-) Смотрим, как сделано в Herc's Adventures на первой плойке и повторяем. Тень, это просто овальчик под текстурой. Кстати, отличная зельда-стайл игра с достаточно редкой механикой и качественным движком.