Как создать атмосферный туман в Unity: пошаговое руководство
Ссылка на скачивание всех файлов: https://drive.google.com/file/d/1JMFbpmPtTw0qn_EQdWtqJkBVeQDLXdao/view
В этой статье мы рассмотрим, как создать атмосферный туман в Unity. Материал состоит из двух частей:
1. Создание тумана.
2. Реализация рассеивания тумана вокруг определённого объекта. (Игрока)
Часть 1: Создание тумана
Что понадобится?
Для создания тумана используется всего одна текстура, которую можно скачать по ссылке ниже:
Шаги создания
Создайте систему частиц
Добавьте систему частиц в сцену и настройте её параметры. В качестве примера можно взять следующую конфигурацию:
После настройки вы получите атмосферный туман, который можно использовать в ваших проектах.
Часть 2: Рассеивание тумана вокруг объекта
Чтобы добиться эффекта, когда туман рассеивается вокруг определённого объекта (например, игрока), нам потребуется немного дополнений в виде шейдера и скрипта.
Сначала скачайте шейдер по ссылке ниже, либо создайте и настройте его:
Если вы используете шейдер отдельно, убедитесь, что у него правильно настроено имя Reference для передачи значений из скрипта.
Создайте новый материал, используя скачанный шейдер.
Ниже приведён простой скрипт на C#, который будет передавать значения в шейдер для контроля рассеивания тумана:
using UnityEngine;
namespace _Code.Scripts.VFX
{
public class ParticleSystem_FogAvoidPlayer : MonoBehaviour
{
public Transform player;
public float minDistance = 2f;
public float maxDistance = 10f;
public float updateInterval = 0.1f;
private ParticleSystemRenderer particleRenderer;
private MaterialPropertyBlock propBlock;
private float nextUpdateTime;
private readonly int playerPosId = Shader.PropertyToID("_PlayerPosition");
private readonly int minDistId = Shader.PropertyToID("_MinDistance");
private readonly int maxDistId = Shader.PropertyToID("_MaxDistance");
public void Init(Transform playerTransform)
{
player = playerTransform;
}
void Start()
{
particleRenderer = GetComponent<ParticleSystemRenderer>();
propBlock = new MaterialPropertyBlock();
UpdateShaderParameters();
}
void Update()
{
if (Time.time >= nextUpdateTime)
{
UpdateShaderParameters();
nextUpdateTime = Time.time + updateInterval;
}
}
void UpdateShaderParameters()
{
if (player == null || particleRenderer == null)
return;
particleRenderer.GetPropertyBlock(propBlock);
propBlock.SetVector(playerPosId, player.position);
propBlock.SetFloat(minDistId, minDistance);
propBlock.SetFloat(maxDistId, maxDistance);
particleRenderer.SetPropertyBlock(propBlock);
}
}
}
Применение скрипта
Добавьте скрипт Прикрепите скрипт ParticleSystem_FogAvoidPlayer к системе частиц.
Настройте ссылку на объект в инспекторе укажите ссылку на объект (например, игрока)
Результат:
Лига Разработчиков Видеоигр
8.5K поста23.1K подписчик
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"