Reaper Hunt: Survivor
27 постов
27 постов
Ссылка на скачивание всех файлов: https://drive.google.com/file/d/1JMFbpmPtTw0qn_EQdWtqJkBVeQDLXdao/view
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 к системе частиц.
Настройте ссылку на объект в инспекторе укажите ссылку на объект (например, игрока)
Результат:
