Як я можу змусити частинки світитися і кидати світло на його оточення?


22

Наразі я намагаюся зробити ефект світляка на темному лісі. Рівень освітлення дуже низький, а плеєр - одне з небагатьох джерел світла. Щоб гравець краще бачив рівень, я намагаюся зробити світяться світлячки на карті випадковим чином. Один із способів - використовувати систему частинок. Але я не можу змусити частинки кидати світло оточенням. Чи є спосіб це зробити?


3
Справжня проблема тут полягає в тому, що "світло дороге". Можливо, вам краще буде розмістити кілька фіксованих точок, які достатньо освітлюють область, розпечіть вогні в світлові карти, а потім скористайтеся частинками, щоб пояснити, звідки береться джерело світла, а не використовувати десятки жахливо дорогих динамічних вогнів.
Draco18s

@ Draco18s Там не буде десятки світлячків. Вони з'являться лише в полі зору гравця. Це зверху вниз і як таке легко керувати. І в будь-який момент часу має бути лише менше 10 світлячків. Я не думаю, що 10 динамічних точкових променів дорогі?
DarkDestry

За замовчуванням Unity дає змогу одночасно висвітлювати геометрію лише двох активних динамічних вогнів (хоча це може бути інакше для налаштування 2D). Ви можете, звичайно, це збільшити, але майте на увазі, що світло +1 має х2 вплив на дзвінки дзвінка.
Draco18s

2
@ Draco18s це може бути правдою для шляху візуалізації вперед, але як зазначено в документах "При використанні відкладеного затінення, немає обмеження на кількість вогнів, які можуть впливати на об'єкт". - Багато невеликих вогнів, які впливають лише на невелику частину Екран - це саме той спосіб, де відкладені випадки відкладеного шляху рендерінгу відрізняються ефективністю при обробці. (За типовою ціною одного дзвінка за унікальне світло, а не для мультиплікатора, як при
передаванні

Це хороший момент. Я забуваю про різні контури візуалізації більшу частину часу.
Draco18s

Відповіді:


7

Частинки, що випромінюють світло, тепер є вбудованою функцією Unity в 5.5.

Просто увімкніть Світло в інспекторі частинок, киньте посилання на світловий збірник (працюють як точкові, так і точкові світильники) та змініть Коефіцієнт на 1.

введіть тут опис зображення

І вуаля, частинки, що випромінюють світло: ! [введіть тут опис зображення

Виявляється, це досить оптимізована установка, яка працює на 1500 + fps на моїй установці навіть при максимальних світлах у сотні.

Редагувати: Після деякого спостереження мені здається, що вогні частинок перемикаються між освітленням фрагментів та освітленням вершин (імовірно, для оптимізації?). Це може призвести до невеликої кількості візуальних артефактів, якщо максимальне освітлення встановлено занадто сильно.

Edit2: Як вказував DMGregory, артефакти є побічним продуктом оптимізації візуалізації вперед. Відкладене освітлення вирішує проблему. Додано приємніший gif


1
Це гарна новина! :) Ця відповідь була б ще кращою, якби вона включала кілька покрокових інструкцій, як налаштувати це за допомогою нових функцій системи частинок.
DMGregory

1
Поведінка освітлення вершин, яку ви бачите, трохи схожа на деякі оптимізації, які Unity застосовує при візуалізації вперед. Чи бачите ви таку саму поведінку, коли використовуєте відкладений шлях?
DMGregory

Ти правий! Артефакти більше відсутні при використанні відкладеного шляху візуалізації.
екльміст

31

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, з рекламним квадратом та світлом, приєднаним до користувальницького сценарію руху / блимання, оскільки отримання переконливої ​​мандрівки потребує більшої артистичності системи, ніж Я знаю. ;)


Насправді ... хоча я сказав не використовувати тіньовий ефір для світлячків, я просто спробував увімкнути його на своєму прикладі, і це не спричинило жодних проблем. Те, як тіні розгойдуються, коли світлячки передають об’єкти, дійсно класно, і це може додати моторошну атмосферу. Ваш пробіг може змінюватись залежно від складності вашої сцени та вашого цільового обладнання, тому профіль не забудьте бути впевненим, але це може бути випадком передчасної оптимізації з мого боку. :)
DMGregory

Як ви створюєте легкий збірний?
DarkDestry

Також чомусь ParticleSystem.Particle посилається на застарілу частинку. Для цього немає методу GetCurrentColor або GetCurrentSize.
DarkDestry

@DarkDestry Я додав примітку до відповіді про створення збірок. Щодо відсутніх функцій, це може бути проблемою з версією - я працюю в 5.3, в попередніх версіях Unity ви можете зробити це по-іншому. Давайте обговоримо деталі реалізації у чаті , використовуючи люб’язно створений номер Hamza Hasan.
DMGregory

Отже, легкий збірник такий же, як і звичайний збірний. Заплутався, коли згадується як легкий збірний.
DarkDestry

3

Роки тому, перед тим, як динамічні світильники були доступними, ми просто використали би ефект із 2D-білбордами з добавками. Це освітлило б сцену білим кольором. Намалювавши його з правильною глибиною світлячка, ви отримаєте майже правильне сортування. Адитивна альфа не потребує сортування при переоціненні себе порівняно з альфа-змішуванням. Це не засвітить ВСЮ сцену, але засвітить область навколо світлячка. Потім ви можете взяти динамічне світло і вибрати одну з світлячок кожні кілька секунд, щоб насправді запалити сцену, якщо вам це потрібно.

Вже є питання та відповідь щодо ефектів світіння. Як досягти такого освітлення в Unity для 2D ігор?


0

На жаль, я не мав великого досвіду роботи з Unity в його нинішньому вигляді (я грав із цим багато років тому), тому я не знаю точно, з якими наборами функцій ви маєте працювати з двигуном.

У будь-якому випадку, незалежно від того, з яким двигуном ви працюєте, динамічні ліхтарі - це те, чого слід уникати, коли зможете. Вони дуже дорого обчислюються і, як правило, додають складності сцени дуже експоненціально. Однак, як і порядок дня для більшості 3D-рендерінгу, існує багато способів, як можна домогтися подібних ефектів шляхом обману;

Можливий спосіб досягти подібного ефекту - це нанести попередньо текстуру світіння на місцевість нижче ваших світлячків (припускаючи систему Y = координата вгору / вниз) з позиціями X і Z, що контролюють розташування світіння на місцевості та зміщення Y з місцевості, яка контролює альфа текстури (яскравіше = ближче до місцевості)

Звичайно, є кілька недоліків у цього методу. Ви не будете кидати тіні, оскільки не використовується світло, і ви не вплинете на будь-яку іншу геометрію у світі (реквізит, листя та ін.)


-2

Використовуйте Lightбіля джерела вогню і грайте з його розмірами в сценарії, щоб це дало ефект горіння. І використовуйте вашу систему частинок :)


На сцені немає пожежі. У них дефіцитні частинки з'являються в і не існують. Для частинок взагалі немає фіксованого положення. Прочитайте, будь ласка, питання.
DarkDestry

Отже, яка угода? ви можете прикріпити світло до збірки частинок, а не за попередньо визначеними положеннями
Хамза Хасан

Питання в тому, як це зробити. Я використовую систему частинок єдності. І я не бачу там збірну. Якщо ви не попросите мене просто створити збірну, яка має світло та генерує базу на сценарії
DarkDestry

Отже, у вас на сцені є гра з частинками. Приєднайте світло до того ж ігрового об’єкта та зробіть його збірним шляхом, перетягнувши цю груObject до Unity File Explorer.
Гамза Хасан

У мене на сцені є система Particle SystemObject. Не частинка.
DarkDestry
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.