Bagaimana saya bisa membuat partikel bersinar dan memberi cahaya pada sekitarnya?

22

Saat ini saya mencoba untuk membuat efek kunang-kunang di hutan yang gelap. Levelnya memiliki cahaya yang sangat rendah dan pemain adalah salah satu dari sedikit sumber cahaya. Agar pemain melihat level lebih baik, saya mencoba membuat kunang-kunang yang bersinar muncul secara acak di peta. Salah satu caranya adalah dengan menggunakan sistem partikel. Tapi aku tidak bisa membuat partikel-partikel itu melemparkan cahaya ke sekelilingnya. Apakah ada cara untuk melakukan ini?

DarkDestry
sumber
3
Masalah sebenarnya di sini adalah "cahaya itu mahal." Anda mungkin lebih baik menempatkan beberapa lampu titik tetap yang menerangi area secukupnya, memanggang lampu menjadi peta cahaya, kemudian menggunakan partikel untuk menjelaskan dari mana sumber cahaya berasal, daripada menggunakan lusinan lampu dinamis yang sangat mahal.
Draco18s
@ Draco18s Tidak akan ada puluhan kunang-kunang. Mereka hanya akan muncul dalam tampilan pemain. Ini top-down dan mudah dikendalikan. Dan pada waktu tertentu hanya akan ada kurang dari 10 kunang-kunang. Saya kira 10 lampu titik dinamis tidak mahal?
DarkDestry
Secara default, Unity hanya memungkinkan dua lampu dinamis aktif menerangi geometri sekaligus (walaupun mungkin berbeda untuk pengaturan 2D). Anda dapat meningkatkan ini, tentu saja, tetapi perlu diingat bahwa cahaya +1 adalah dampak x2 pada panggilan draw.
Draco18s
2
@ Draco18 ini mungkin benar untuk jalur render maju, tetapi seperti yang dinyatakan dalam dokumen "Saat menggunakan Deferred Shading, tidak ada batasan jumlah lampu yang dapat memengaruhi suatu objek" - Banyak lampu kecil yang hanya memengaruhi sebagian kecil dari layar persis jenis use case jalur rendering yang ditangguhkan unggul dalam penanganan secara efisien. (Dengan biaya khas satu panggilan undian per cahaya unik, daripada pengali seperti rendering maju)
DMGregory
Itu poin yang bagus. Saya lupa tentang jalur render yang berbeda sebagian besar waktu.
Draco18s

Jawaban:

7

Partikel pemancar cahaya sekarang menjadi fitur Unity bawaan pada 5.5.

Cukup aktifkan Lampu di inspektur partikel, masukkan referensi ke prefab cahaya (lampu titik dan tempat bekerja), dan ubah Rasio ke 1.

masukkan deskripsi gambar di sini

Dan voila, partikel yang memancarkan cahaya: ! [masukkan deskripsi gambar di sini

Ternyata, ini adalah pengaturan yang agak dioptimalkan, berjalan pada 1500 + fps di rig saya bahkan dengan lampu maksimum di ratusan.

Sunting: Setelah beberapa pengamatan, tampak bagi saya bahwa lampu partikel beralih antara pencahayaan per fragmen dan pencahayaan vertex (mungkin untuk optimasi?). Ini mungkin menghasilkan sejumlah kecil artefak visual jika lampu maksimum disetel terlalu tinggi.

Sunting2: Seperti yang ditunjukkan oleh DMGregory, artefak adalah produk sampingan dari optimasi rendering maju. Pencahayaan yang ditangguhkan memecahkan masalah ini. Menambahkan gif yang lebih bagus

ahli ekologi
sumber
1
Itu kabar baik! :) Jawaban ini akan lebih baik lagi jika itu termasuk beberapa petunjuk langkah demi langkah untuk cara mengatur ini dengan fitur sistem partikel baru.
DMGregory
1
Perilaku pencahayaan vertex yang Anda lihat terdengar agak seperti beberapa optimisasi yang diterapkan Unity dalam rendering maju. Apakah Anda melihat perilaku yang sama saat menggunakan jalur yang ditangguhkan?
DMGregory
Kamu benar! Artefak tidak lagi ada saat menggunakan jalur render yang ditangguhkan.
Ahli Ekologi
31

Head-Up:

Jawaban ini sudah usang. Persatuan sekarang mendukung partikel titik cahaya secara asli. Silakan lihat jawaban ini untuk perincian lengkap.

Saya akan meninggalkan posting ini di sini untuk siapa pun yang ingin tahu, atau menggunakan Unity versi lama, atau membutuhkan lebih banyak kontrol manual daripada yang ditawarkan metode asli - cukup perhatikan bahwa dukungan asli cenderung jauh lebih efisien dan terukur daripada pendekatan yang disajikan di bawah ini.


Saya tidak yakin mengapa begitu banyak jawaban mengklaim ini sulit atau tidak mungkin. Menangani beberapa lusin lampu titik dinamis cukup konvensional untuk pipa render yang ditangguhkan modern berjalan pada PC.

Berikut adalah contoh cepat yang saya buat: Contoh kunang-kunang dengan lampu

Saya menggunakan skrip ini untuk secara dinamis memunculkan cukup lampu untuk partikel maks saya (pastikan Anda menyesuaikan pengaturan Sistem Partikel Anda sehingga maks masuk akal - standar 1000 tidak akan membuat kartu grafis Anda sangat bahagia), dan kemudian memperbarui mereka untuk mengikuti aktif partikel:

[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);
        }
    }
}

Sunting: Anda dapat membuat cetakan dengan terlebih dahulu membuat objek game (dalam hal ini, Buat -> Cahaya -> Cahaya Titik), mengaturnya dengan nama / parameter / skrip / anak-anak yang Anda inginkan, kemudian menyeretnya dari Hierarki ke dalam Penjelajah Proyek Anda. Ini menyimpan objek sebagai aset yang dapat Anda gunakan kembali di banyak layar & skrip, dengan tingkat pewarisan. Anda dapat menghapus salinan di adegan Anda dan aset akan tetap di folder Aset Anda untuk direferensikan saat diperlukan.

Pastikan lightPrefab memiliki jangkauan yang relatif kecil dan tidak membayangi, untuk memberi Anda ruang kepala paling berkinerja untuk semua yang terjadi dalam adegan Anda. Anda tidak perlu membuat lightPrefab itu sendiri hijau (atau warna kunang-kunang) - itu akan mengambilnya dari warna partikel.

Anda mungkin menemukan bahwa Anda memiliki kontrol yang lebih baik terhadap penerbangan kunang-kunang jika Anda membuat masing-masing GameObject sendiri, dengan quad billboard dan lampu yang terpasang dengan skrip pergerakan / blinkig kustom, karena mendapatkan penjelajahan yang meyakinkan membutuhkan lebih banyak sistem sistem partikel daripada Aku tahu. ;)

DMGregory
sumber
Sebenarnya ... walaupun saya mengatakan untuk tidak menggunakan shadowcasting untuk kunang-kunang, saya hanya mencoba menyalakannya dalam adegan contoh saya dan itu tidak menimbulkan masalah. Cara bayangan bergerak ketika kunang-kunang melewati benda-benda benar-benar keren, dan bisa menambah suasana seram. Jarak tempuh Anda mungkin bervariasi berdasarkan kompleksitas pemandangan dan perangkat keras target Anda, jadi pastikan profilnya, tetapi ini mungkin merupakan kasus optimasi prematur di pihak saya. :)
DMGregory
Bagaimana Anda membuat cetakan rumah?
DarkDestry
Juga, untuk beberapa alasan, ParticleSystem.Particle mengacu pada partikel warisan. Tidak ada metode GetCurrentColor atau GetCurrentSize untuk itu.
DarkDestry
@DarkDestry Saya telah menambahkan catatan pada jawaban tentang membuat prefab. Adapun fungsi yang hilang, ini bisa menjadi masalah versi - Saya bekerja di 5.3, di versi Unity sebelumnya Anda mungkin melakukan ini dengan cara yang berbeda. Mari kita bahas detail implementasi dalam obrolan , menggunakan ruangan yang diciptakan Hamza Hasan.
DMGregory
Jadi cetakan rumah sama dengan cetakan biasa. Bingung ketika itu disebut sebagai cetakan cetakan.
DarkDestry
3

Bertahun-tahun yang lalu, sebelum lampu dinamis terjangkau, kami hanya akan menggunakan efek partikel 2D-billboarded dengan campuran aditif. Itu akan mencerahkan pemandangan menuju putih. Dengan menggambar dengan kedalaman kunang-kunang yang benar, Anda mendapatkan pemilahan yang hampir benar. Aditif alfa tidak perlu disortir ketika menarik dirinya sendiri dibandingkan dengan alfa blending. Itu tidak akan menerangi SEMUA pemandangan, tetapi itu akan menerangi area di sekitar kunang-kunang. Anda kemudian dapat mengambil cahaya yang dinamis dan memilih salah satu kunang-kunang setiap beberapa detik untuk benar-benar menerangi pemandangan, jika Anda membutuhkannya.

Sudah ada pertanyaan & jawaban tentang efek cahaya. Bagaimana mendapatkan pencahayaan seperti ini di Unity untuk game 2D?

Steven
sumber
0

Sayangnya, saya tidak punya banyak pengalaman dengan Unity dalam bentuknya saat ini (saya bermain-main dengannya bertahun-tahun yang lalu), jadi saya tidak tahu persis set fitur apa yang harus Anda kerjakan di mesin.

Bagaimanapun, tidak peduli mesin apa yang Anda gunakan, lampu dinamis adalah sesuatu yang harus dihindari kapan pun Anda bisa. Mereka sangat mahal secara komputasi, dan cenderung menambah kompleksitas adegan dengan cara yang sangat eksponensial. Namun, seperti urutan hari untuk sebagian besar rendering 3D, ada banyak cara Anda dapat mencapai efek yang sama dengan menipu;

Cara yang mungkin untuk mencapai efek yang sama adalah memetakan tekstur cahaya premade ke medan di bawah kunang-kunang Anda, (dengan asumsi sistem Y = atas / bawah coord.) Dengan posisi X dan Z yang mengendalikan lokasi cahaya pada medan dan offset Y dari medan yang mengendalikan alfa tekstur (lebih terang = lebih dekat ke medan)

Tentu saja ada beberapa kelemahan dari metode ini. Anda tidak akan membuang bayangan karena tidak ada cahaya yang digunakan, dan Anda tidak akan memengaruhi geometri lain di dunia (alat peraga, dedaunan, dll.)

JonBee
sumber
-2

Gunakan Lightpada titik asal api dan mainkan dengan ukurannya dalam skrip sehingga akan memberikan efek terbakar. Dan gunakan sistem partikel Anda :)

Hamza Hasan
sumber
Tidak ada api di tempat kejadian. Saya memiliki partikel yang langka muncul dan keluar dari keberadaan. Tidak ada posisi tetap untuk partikel sama sekali. Silakan baca pertanyaannya.
DarkDestry
Jadi, apa kesepakatannya? Anda dapat menempelkan cahaya ke prefab partikel Anda daripada di posisi yang ditentukan sebelumnya
Hamza Hasan
Pertanyaannya adalah bagaimana melakukan ini. Saya menggunakan sistem partikel persatuan. Dan saya tidak melihat cetakan di sana. Kecuali Anda meminta saya untuk hanya membuat cetakan yang memiliki cahaya dan menghasilkan basis pada skrip
DarkDestry
Jadi, Anda memiliki partikel gameObject di TKP. Pasang cahaya ke objek game yang sama dan buat prefab dengan menyeret gameObject ke Unity File Explorer.
Hamza Hasan
Saya memiliki GameObject Sistem Partikel di tempat kejadian. Bukan partikel.
DarkDestry