Salam!
Saya tahu, dan pada dasarnya Anda tahu apa yang hilang dari permainan kartu atau permainan tiga-dalam-satu Anda. Sistem siluman!
Dan tentu saja, setiap sistem siluman yang menghargai diri sendiri harus dapat memperhitungkan pencahayaan lingkungan di sekitar pemain. Saya kagum menggali topik dan menemukan sejumlah kecil informasi. Karena itu, saya cepat berbagi buah.
Hari ini kami tidak akan mengembangkan sistem siluman lengkap untuk pemain, kami akan mempertimbangkan interaksi murni dengan pencahayaan.
Metode 1: Colliders
Cara yang sederhana dan tidak terlalu intensif sumber daya.
Kami menambahkan collider bola ke setiap sumber cahaya. Kami membuatnya menjadi pemicu. Kami mengatur dimensi kira-kira sama dengan jari-jari cahaya.
Sisanya sejelas bayangan. Kami sedang menulis skrip sederhana, di mana di OnTriggerEnter () kami menempatkan aktivasi perhitungan cahaya (sehingga sumber cahaya tidak bekerja "idle" ketika pemain tidak ada)
Perhitungan pencahayaan itu sendiri akan terletak di Pembaruan (). Intinya, ini adalah Fisika biasa. Tayangan (). Jika itu mengenai pemain, pemain berada di zona cahaya. Jika tidak jatuh, itu berarti bahwa pemain berada di belakang rintangan dan, oleh karena itu, dalam bayangan.
Anda juga dapat menambahkan perhitungan jarak antara pemain dan sumber cahaya di sini. Jadi, untuk menentukan iluminasi, kita akan menggunakan pelampung sederhana, yang akan bervariasi tergantung pada jarak ke sumber cahaya. Dan Anda dapat menggunakannya di mana pun yang diinginkan hati Anda.
Contoh
Pada poin 1, iluminasi mendekati maksimal. Pada titik 2, iluminasi minimal - ada penghalang antara cahaya dan titik. Pada poin 3, iluminasi rata-rata. Dan itu belum semuanya! Anda dapat menambahkan collider pemicu ke berbagai "zona bayangan" tempat pemain harus bersembunyi. Dalam tradisi terbaik Manhunt. Demikian pula, Anda dapat menandai zona terang dengan collider, mensimulasikan, misalnya, cahaya lampu sorot.
Keuntungan:
- Mudah untuk menyesuaikan lampu Point.
- Cukup ekonomis dari segi sumber daya, jika Anda tidak mengirim spam sumber cahaya.
Kekurangan:
- Lampu Spot dan lampu Directional sangat dicari. Jika untuk yang pertama cukup untuk menempatkan collider di bidang cahaya (untuk meningkatkan visibilitas pemain di pintu masuk), maka yang kedua adalah horor nyata. Anda harus menempatkan collider di setiap bayangan (untuk mengurangi visibilitas pemain di pintu masuk), atau terus-menerus memeriksa menggunakan Physics.Raycast () antara pemain dan "matahari" - terletak di bawah sinar atau di bawah bayangan.
- Sejumlah besar colliders mengacaukan pemandangan, menyulitkan fisika.
- Perawatan harus diambil dengan memotong sumber cahaya.
- Lampu dinamis (bergerak atau mengubah intensitas) perlu ditambahkan secara terpisah melalui skrip.
Metode 2: Tekstur Render
Apa yang kita lakukan disini Bahkan, kami mendapatkan "tangkapan layar" dari kamera, dan tidak harus dari kamera utama. Lalu kami menganalisis warna tangkapan layar untuk mencari tahu seberapa terang cahaya yang jatuh pada subjek.
Untuk memulainya, kita membutuhkan objek dari mana kita akan "membaca" cahaya. Buat bola atau bidang biasa, buat kecil (skala 0,1), letakkan dekat dengan lantai, buat putih, lepaskan collider:
Tambahkan kamera (pastikan untuk menghapus pendengar audio dan periksa apakah tag MainCamera tidak layak). Ikatkan ke objek kita. Kami menempatkannya sedikit lebih tinggi, kami mengarahkannya ke bawah. Kami mengekspos dalam pengaturan bukan tampilan utama. Melakukannya secara ortografis adalah untuk selera Anda.
Pada akhirnya, kita memposisikannya sehingga itu melihat objek kita dan hanya melihatnya.
Pada akhirnya, konfigurasikan masker Culling dari kamera primer dan sekunder sehingga primer tidak menampilkan objek "ringan" kami, sedangkan yang sekunder hanya melihat mereka, tanpa mengacaukan hal lain.
Dan di sini kesenangan dimulai. Kami melampirkan skrip ke kamera:
public Camera cam; // RenderTexture tex; Texture2D _tex; void Start () { // "". // , - . // Depth 0 - . tex = new RenderTexture (1, 1, 8); // RenderTexture "" , // , . _tex = new Texture2D (1, 1, TextureFormat.RGB24, false); } void Update () { // "" cam.targetTexture = tex; cam.Render (); // RenderTexture.active = tex; // Texture2D _tex.ReadPixels (new Rect (0, 0, 1, 1), 0, 0); _tex.Apply (); Color col = _tex.GetPixel (0, 0); float vis = (col.r + col.g + col.b) / 3; }
Pada output, kita mendapatkan visibilitas, yang, pada dasarnya, adalah representasi numerik dari tingkat insiden pencahayaan pada objek kita. Jika sumbernya dekat - objeknya putih - vis adalah 1. Jika gelap - objeknya hitam - vis adalah ~ 0.
Kami tidak perlu melakukan operasi di atas setiap frame, jadi kami menyematkan timer kedua yang kecil:
float interval = 0; void Update () { interval += Time.deltaTime; if (interval < 1) return; interval = 0; // }
Selanjutnya, kami mengikat seluruh sistem kami ke pemain sehingga itu bergerak bersamanya. Dan variabel vis kami secara otomatis mengembalikan cahaya di sekitar pemain!
Sistem ini dapat digunakan tidak hanya bersama dengan pemain. Anda dapat menempatkannya di mana saja dan sesuka Anda, menciptakan semacam sensor cahaya. Sebagai aturan, ada cara yang lebih efektif untuk mengimplementasikannya, tetapi apakah selalu baik untuk memiliki alternatif?
Keuntungannya jelas, mari kita bicara tentang kerugiannya.
Kekurangan
- Setiap "detektor cahaya" (jika ada lebih dari satu) memerlukan kamera terpisah.
- Texture2D.ReadPixels () - yah, sangat lambat. Bahkan jika Anda melakukannya sekali dalam satu detik, dan tidak setiap frame, bahkan jika Anda memecah fungsi menulis dan membaca tekstur menjadi bingkai yang berbeda, masih ada tata letak di 40-110ms.
- Sistem ini tidak memperhitungkan beberapa kasus langka. Misalnya, senter bersinar pada karakter. Karakter menyala dengan baik, tetapi cahaya jatuh pada dirinya dan di belakangnya, dan tidak turun, masing-masing, detektor cahaya kami menunjukkan tingkat pencahayaan yang rendah. Anda dapat memecahkan masalah, misalnya, dengan menempatkan detektor tidak di lantai, tetapi pada tingkat dada karakter. Maka Anda perlu meletakkan dua kamera di sisi yang berlawanan untuk membaca cahaya dari kedua sisi. Apa yang akan memperlambat sistem hingga setengahnya.