Bagaimana cara menutup lampu di Unity3D?

9

Pertama, saya memiliki Unity Pro.

Saya sudah mencari-cari di lampu oklusi ketika mereka tidak dilihat untuk sementara waktu sekarang untuk meningkatkan kinerja. Metode utama yang saya gunakan adalah menggunakan BecameVisible () dan menguji frustrasi kamera.

Masalah utama saya adalah jika pemain melihat area yang akan diterangi oleh cahaya, saya masih ingin lampu menyala.

Saat ini saya menggunakan metode yang memeriksa untuk melihat apakah area yang menyala di dalam frustum kamera, tetapi masalahnya adalah kadang-kadang lampu berada di frustum tanpa benar-benar terlihat oleh pemain (misalnya dinding di antara mereka dan pemain). Saya sudah mencoba raycasting kepada mereka tetapi Anda tidak pernah bisa mendapatkan cukup detail untuk area yang sebenarnya menyala (yang terbaik yang saya bisa pikirkan adalah menggunakan renderer.bounds.extent dan renderer.bounds.center untuk menghitung titik menyala maksimum dari cahaya).

Adakah yang tahu cara mudah di Unity Pro untuk menutup lampu? Atau bisakah Anda memberi tahu saya cara yang baik untuk menggunakan metode titik tumpu kamera yang saya bicarakan?

Timothy Williams
sumber
1
Anda dapat memeriksa apakah kamera frustum dan lampu frustum berpotongan, tetapi saya berharap persatuan sudah melakukan ini.
Archy
1
Di Unity Pro, OcclusionCulling juga harus menangani lampu.
Archy
Baiklah, artis saya mengatakan bahwa Occlusion Culling tidak akan berfungsi untuk lampu. Jadi saya mungkin hanya mengatur berbagai sumber cahaya saya sebagai oklusi di area oklusi yang sudah saya atur?
Timothy Williams
Dan sesuatu seperti memeriksa kamera dan frustrasi ringan terhadap satu sama lain dapat bekerja, meskipun saya membutuhkannya untuk bekerja dalam 360 derajat.
Timothy Williams
Penyisihan oklusi tampaknya tidak bekerja dengan lampu, terlepas dari apa yang saya dan artis coba. Bagaimana tepatnya saya menutup cahaya?
Timothy Williams

Jawaban:

1

Anda dapat menulis skrip Anda sendiri untuk menutup lampu. Sesuatu seperti ini melekat pada kamera utama:

List<Light> Lights = new List<Light>();
const float OccludeDist = 100;
void Update()
{
    foreach (Light light in Lights)
    {
        if ((transform.position - light.transform.position).sqrMagnitude > OccludeDist * OccludeDist))
        {
            light.enabled = false;
        }
        else{
            light.enabled = true;
        }
    }
}

Anda juga dapat memeriksa apakah titik berada dalam sudut pada sumbu Y kamera (sumbu lainnya hanya akan membuat Anda sakit). Jadilah sedikit murah hati dengan sudut, mungkin 2 kali frustrasi kamera, sehingga lampu tidak mati ketika mereka sedang menerangi area dalam tampilan kamera. Jika Anda memilih untuk menambahkan optimasi tambahan ini (yang mungkin tidak diperlukan), pastikan Anda menggunakan jarak sebagai broadphase karena jauh lebih murah.

JPtheK9
sumber
Bagus dan sederhana :)
Ḟḹáḿíṅḡ Ⱬỏḿƀíé