2D Тени на Unity. Длина тени объекта
Работа с 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
Изменение Скриптов
Теперь необходимо изменить следующие скрипты: 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
https://drive.google.com/file/d/17i9l7lDfeEy62-saBbcvCv6ZNRQowhBg/view? usp=sharing