Heads-Up:
Ця відповідь застаріла. Тепер Єдність підтримує частинки точкового світла спочатку. Будь ласка, дивіться цю відповідь для отримання детальної інформації.
Я залишу цю публікацію тут для тих, хто цікавиться, або використовує старі версії Unity, або потребує більш ручного керування, ніж пропонує рідний метод, - лише зауважте, що підтримка нативної програми, ймовірно, буде набагато ефективнішою та масштабованою, ніж підхід, представлений нижче.
Я не впевнений, чому так багато відповідей стверджують, що це важко чи неможливо. Поводження з декількома десятками динамічних точкових вогнів є доволі звичним для сучасного трубопроводу відкладеної візуалізації, який працює на ПК.
Ось короткий приклад, який я приготував:
Я використовую цей сценарій, щоб динамічно нереалізувати достатню кількість вогнів для моїх максимальних частинок (переконайтеся, що ви налаштуєте налаштування системи Particle System, щоб максимум розумний - 1000 за замовчуванням не зробить вашу відеокарту дуже щасливою), а потім оновить їх, щоб слідувати активним частинки:
[RequireComponent(typeof(ParticleSystem))]
public class ParticleLights : MonoBehaviour {
public Light lightPrefab;
ParticleSystem _system;
ParticleSystem.Particle[] _particles;
Light[] _lights;
void Start () {
_system = GetComponent<ParticleSystem>();
_particles = new ParticleSystem.Particle[_system.maxParticles];
_lights = new Light[_system.maxParticles];
for(int i = 0; i < _lights.Length; i++)
{
_lights[i] = (Light)Instantiate(lightPrefab);
_lights[i].transform.parent = transform;
}
}
void Update () {
int count = _system.GetParticles(_particles);
for(int i = 0; i < count; i++)
{
_lights[i].gameObject.SetActive(true);
_lights[i].transform.localPosition = _particles[i].position;
// Looks like the GetCurrentColor function was added in 5.3.
// You can use other methods in earlier Unity versions.
_lights[i].color = _particles[i].GetCurrentColor(_system);
}
for (int i = count; i < _particles.Length; i++)
{
_lights[i].gameObject.SetActive(false);
}
}
}
Редагувати: ви можете створити збірний засіб , спершу створивши ігровий об’єкт (у цьому випадку Створіть -> Світло -> Світло), встановивши його з потрібним ім'ям / параметрами / сценаріями / дітьми, а потім перетягніть його зі своєї Ієрархії в ваш дослідник проекту. Це зберігає об'єкт як актив, який ви можете повторно використовувати в декількох сценах і сценаріях, із ступенем спадкоємності. Ви можете видалити копію з сцени, і актив залишиться у папці Активи, на яку потрібно посилатись, якщо це потрібно.
Переконайтесь, що lightPrefab має порівняно невеликий діапазон і не є тіньовим, щоб забезпечити вам максимальну ефективність для всього, що відбувається на вашій сцені. Вам не потрібно робити lightPrefab самим зеленим (або кольором ваших світлячків) - це підбере його за кольором частинок.
Ви можете виявити, що у вас є кращий контроль над польотом світлячків, якщо ви зробите кожен свій GameObject, з рекламним квадратом та світлом, приєднаним до користувальницького сценарію руху / блимання, оскільки отримання переконливої мандрівки потребує більшої артистичності системи, ніж Я знаю. ;)