Cara Membuat Game Real-Time Multiplayer Virtual Reality (Bagian 1)

Diterbitkan: 2022-03-10
Ringkasan cepat Realitas virtual adalah media imersif baru untuk menjelajahi konten, baik konten tersebut berupa film ( Life of Pi ), ​​game ( Beat Saber ) atau pengalaman sosial (seperti yang digambarkan dalam Ready Player One ). Terlepas dari kebaruannya, VR tidak memerlukan perangkat yang sangat berbeda untuk dirancang — alat yang sama yang kami gunakan untuk pengembangan game web, pemodelan 3D, dan lainnya masih dapat diterapkan. Tutorial ini memanfaatkan keakraban Anda dengan pengembangan web untuk memulai pengembangan VR.

Dalam seri tutorial ini, kita akan membangun game realitas virtual multipemain berbasis web di mana pemain harus berkolaborasi untuk memecahkan teka-teki. Kami akan menggunakan A-Frame untuk pemodelan VR, MirrorVR untuk sinkronisasi waktu nyata lintas perangkat, dan A-Frame Low Poly untuk estetika poli rendah. Di akhir tutorial ini, Anda akan memiliki demo online yang berfungsi penuh yang dapat dimainkan oleh siapa saja.

Setiap pasangan pemain diberikan cincin bola. Tujuannya adalah untuk "menghidupkan" semua orb, di mana orb "on" jika ditinggikan dan cerah. Sebuah bola dikatakan “mati” jika lebih rendah dan redup. Namun, bola "dominan" tertentu mempengaruhi tetangganya: jika ia beralih status, tetangganya juga beralih status. Hanya pemain 2 yang dapat mengontrol bola dominan sementara hanya pemain 1 yang dapat mengontrol bola non-dominan. Hal ini memaksa kedua pemain untuk berkolaborasi memecahkan teka-teki. Di bagian pertama tutorial ini, kita akan membangun lingkungan dan menambahkan elemen desain untuk game VR kita.

Tujuh langkah dalam tutorial ini dikelompokkan menjadi tiga bagian:

  1. Menyiapkan Adegan (Langkah 1-2)
  2. Membuat Orb (Langkah 3-5)
  3. Membuat Orbs Interaktif (Langkah 6–7)
Lebih banyak setelah melompat! Lanjutkan membaca di bawah ini

Bagian pertama ini akan diakhiri dengan bola yang dapat diklik yang menyala dan mati (seperti gambar di bawah). Anda akan menggunakan A-Frame VR dan beberapa ekstensi A-Frame.

(Pratinjau besar)

Menyiapkan Adegan

1. Ayo Pergi Dengan Adegan Dasar

Untuk memulai, mari kita lihat bagaimana kita bisa mengatur adegan sederhana dengan ground:

Membuat adegan sederhana
Membuat adegan sederhana (Pratinjau besar)

Tiga instruksi pertama di bawah ini dikutip dari artikel saya sebelumnya. Anda akan mulai dengan menyiapkan situs web dengan satu halaman HTML statis. Ini memungkinkan Anda membuat kode dari desktop dan secara otomatis menyebarkan ke web. Situs web yang digunakan kemudian dapat dimuat di ponsel Anda dan ditempatkan di dalam headset VR. Atau, situs web yang digunakan dapat dimuat oleh headset VR mandiri.

Mulailah dengan menavigasi ke glitch.com. Kemudian, lakukan hal berikut:

  1. Klik "Proyek Baru" di kanan atas,
  2. Klik "halo-halaman web" di drop-down,
  3. Selanjutnya, klik index.html di sidebar kiri. Kami akan menyebut ini sebagai "editor" Anda.

Anda sekarang akan melihat layar Glitch berikut dengan file HTML default.

Proyek kesalahan: file index.html
Proyek kesalahan: file index.html (Pratinjau besar)

Seperti tutorial terkait di atas, mulailah dengan menghapus semua kode yang ada di file index.html saat ini. Kemudian, ketik berikut ini untuk proyek webVR dasar, menggunakan A-Frame VR. Ini menciptakan pemandangan kosong dengan menggunakan pencahayaan dan kamera default A-Frame.

 <!DOCTYPE html> <html> <head> <title>Lightful</title> <script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script> </head> <body> <a-scene> </a-scene> </body> </html>

Naikkan kamera ke ketinggian berdiri. Sesuai rekomendasi A-Frame VR (masalah Github), bungkus kamera dengan entitas baru dan pindahkan entitas induk alih-alih kamera secara langsung. Di antara tag a-scene Anda pada baris 8 dan 9, tambahkan yang berikut ini.

 <!-- Camera! --> <a-entity position="0 3 0"> <a-camera wasd-controls look-controls></a-camera> </a-entity>

Selanjutnya, tambahkan kotak besar untuk menunjukkan tanah, menggunakan a-box . Tempatkan ini langsung di bawah kamera Anda dari instruksi sebelumnya.

 <!-- Action! --> <a-box shadow width="75" height="0.1" depth="75" position="0 -1 0" color="#222"></a-box>

File index.html Anda sekarang harus sama persis dengan berikut ini. Anda dapat menemukan kode sumber lengkap di sini, di Github.

 <html> <head> <title>Lightful</title> <script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script> </head> <body> <a-scene> <!-- Camera! --> <a-entity position="0 3 0"> <a-camera wasd-controls look-controls></a-camera> </a-entity> <!-- Action! --> <a-box shadow width="75" height="0.1" depth="75" position="0 -1 0" color="#222"></a-box> </a-scene> </body> </html>

Ini menyimpulkan pengaturan. Selanjutnya, kita akan menyesuaikan pencahayaan untuk suasana yang lebih misterius.

2. Tambahkan Suasana

Pada langkah ini, kita akan mengatur fog dan custom lighting.

Pratinjau adegan sederhana dengan suasana gelap
Pratinjau adegan sederhana dengan suasana gelap (Pratinjau besar)

Tambahkan kabut, yang akan mengaburkan objek yang jauh bagi kita. Ubah tag a-scene pada baris 8. Di sini, kita akan menambahkan kabut gelap yang dengan cepat mengaburkan tepi tanah, memberikan efek cakrawala yang jauh.

 <a-scene fog="type: linear; color: #111; near:10; far:15"></a-scene>

Abu-abu gelap #111 memudar secara linier dari jarak 10 hingga jarak 15. Semua objek yang berjarak lebih dari 15 unit akan sepenuhnya dikaburkan, dan semua objek yang berjarak kurang dari 10 unit dapat terlihat sepenuhnya. Objek apa pun di antaranya sebagian dikaburkan.

Tambahkan satu cahaya sekitar untuk meringankan objek dalam game dan cahaya satu arah untuk menonjolkan permukaan reflektif yang akan Anda tambahkan nanti. Tempatkan ini langsung setelah tag a-scene yang Anda modifikasi di instruksi sebelumnya.

 <!-- Lights! --> <a-light type="directional" castshadow="true" intensity="0.5" color="#FFF" position="2 5 0"></a-light> <a-light intensity="0.1" type="ambient" position="1 1 1" color="#FFF"></a-light>

Tepat di bawah lampu pada instruksi sebelumnya, tambahkan langit yang gelap. Perhatikan abu-abu gelap #111 cocok dengan kabut di kejauhan.

 <a-sky color="#111"></a-sky>

Ini menyimpulkan modifikasi dasar pada suasana hati dan lebih luas lagi, pengaturan adegan. Periksa apakah kode Anda cocok dengan kode sumber untuk Langkah 2 di Github, tepatnya. Selanjutnya, kita akan menambahkan bola poli rendah dan mulai menyesuaikan estetika bola itu.

Membuat Orb

3. Buat Orb Poli Rendah

Pada langkah ini, kita akan membuat bola reflektif yang berputar seperti gambar di bawah ini. Bola itu terdiri dari dua bola poli rendah bergaya dengan beberapa trik untuk menyarankan bahan reflektif.

Berputar, bola reflektif
(Pratinjau besar)

Mulailah dengan mengimpor perpustakaan poli rendah di tag head Anda. Sisipkan yang berikut di antara baris 4 dan 5.

 <script src="https://cdn.jsdelivr.net/gh/alvinwan/[email protected]/dist/aframe-low-poly.min.js"></script>

Buat wadah korsel, pembungkus, dan bola. carousel akan berisi banyak bola, wrapper akan memungkinkan kita untuk memutar semua bola di sekitar sumbu tengah tanpa memutar setiap bola satu per satu, dan container akan — seperti namanya — berisi semua komponen bola.

 <a-entity> <a-entity rotation="0 90 0" class="wrapper" position="0 0 0"> <a-entity class="container" position="8 3 0" scale="1 1 1"> <!-- place orb here --> </a-entity> </a-entity> </a-entity>

Di dalam wadah orb, tambahkan orb itu sendiri: satu bola sedikit tembus cahaya dan diimbangi, dan yang lainnya benar-benar padat. Dua gabungan permukaan reflektif meniru.

 <a-entity class="orb" data-> <lp-sphere seed="0" shadow max-amplitude="1 1 1" position="-0.5 0 -0.5"></lp-sphere> <lp-sphere seed="0" shadow max-amplitude="1 1 1" rotation="0 45 45" opacity="0.5" position="-0.5 0 -0.5"></lp-sphere> </a-entity>

Terakhir, putar bola tanpa batas dengan menambahkan tag a-animation berikut segera setelah lp-sphere di dalam entitas .orb dalam instruksi terakhir.

 <a-animation attribute="rotation" repeat="indefinite" from="0 0 0" to="0 360 0" dur="5000"></a-animation>

Kode sumber Anda untuk pembungkus orb dan orb itu sendiri harus sama persis dengan kode berikut.

 <a-entity> <a-entity rotation="0 90 0" class="wrapper" position="0 0 0"> <a-entity class="container" position="8 3 0" scale="1 1 1"> <a-entity class="orb" data-> <lp-sphere seed="0" shadow max-amplitude="1 1 1" position="-0.5 0 -0.5"></lp-sphere> <lp-sphere seed="0" shadow max-amplitude="1 1 1" rotation="0 45 45" opacity="0.5" position="-0.5 0 -0.5"></lp-sphere> <a-animation attribute="rotation" repeat="indefinite" from="0 0 0" to="0 360 0" dur="5000"></a-animation> </a-entity> </a-entity> </a-entity> </a-entity>

Periksa apakah kode sumber Anda cocok dengan kode sumber lengkap untuk langkah 3 di Github. Pratinjau Anda sekarang harus cocok dengan yang berikut ini.

Berputar, bola reflektif
(Pratinjau besar)

Selanjutnya, kita akan menambahkan lebih banyak pencahayaan ke orb untuk rona emas.

4. Nyalakan Orb

Pada langkah ini, kita akan menambahkan dua lampu, satu berwarna dan satu putih. Ini menghasilkan efek berikut.

Orb menyala dengan lampu titik
(Pratinjau besar)

Mulailah dengan menambahkan cahaya putih untuk menerangi objek dari bawah. Kami akan menggunakan lampu titik. Tepat sebelum #orb0 tetapi di dalam #container-orb0 , tambahkan lampu titik offset berikut.

 <a-entity position="-2 -1 0"> <a-light distance="8" type="point" color="#FFF" intensity="0.8"></a-light> </a-entity>

Di pratinjau Anda, Anda akan melihat yang berikut ini.

Orb menyala dengan titik cahaya putih
(Pratinjau besar)

Secara default, lampu tidak membusuk dengan jarak. Dengan menambahkan distance="8" , kami memastikan bahwa cahaya sepenuhnya meluruh dengan jarak 8 unit, untuk mencegah titik cahaya menerangi seluruh pemandangan. Selanjutnya, tambahkan cahaya keemasan. Tambahkan yang berikut ini tepat di atas lampu terakhir.

 <a-light class="light-orb" distance="8" type="point" color="#f90" intensity="1"></a-light>

Periksa apakah kode Anda cocok dengan kode sumber untuk langkah 4 dengan tepat. Pratinjau Anda sekarang akan cocok dengan yang berikut ini.

Orb menyala dengan lampu titik
(Pratinjau besar)

Selanjutnya, Anda akan membuat modifikasi estetika akhir Anda pada bola dan menambahkan cincin berputar.

5. Tambahkan Cincin

Pada langkah ini, Anda akan menghasilkan bola akhir, seperti gambar di bawah ini.

Bola emas dengan banyak cincin
(Pratinjau besar)

Tambahkan cincin di #container-orb0 langsung sebelum #orb0 .

 <a-ring color="#fff" material="side:double" position="0 0.5 0" radius-inner="1.9" radius-outer="2" opacity="0.25"></a-ring>

Perhatikan cincin itu sendiri tidak mengandung warna, karena warna akan diilhami oleh titik cahaya pada langkah sebelumnya. Selanjutnya, material="side:double" penting karena, tanpanya, bagian belakang cincin tidak akan dirender; ini berarti cincin itu akan menghilang selama setengah putarannya.

Namun, pratinjau hanya dengan kode di atas tidak akan terlihat berbeda. Ini karena cincin saat ini tegak lurus dengan layar. Jadi, hanya "sisi" cincin (yang memiliki ketebalan 0) yang terlihat. Tempatkan animasi berikut di antara tag a-ring pada instruksi sebelumnya.

 <a-animation attribute="rotation" easing="linear" repeat="indefinite" from="0 0 0" to="0 360 0" dur="8000"></a-animation>

Pratinjau Anda sekarang harus cocok dengan yang berikut:

Bola emas dengan cincin
(Pratinjau besar)

Buat sejumlah variabel cincin dengan sumbu rotasi, kecepatan, dan ukuran yang berbeda. Anda dapat menggunakan cincin contoh berikut. Setiap cincin baru harus ditempatkan di bawah a-ring terakhir.

 <a-ring color="#fff" material="side:double" position="0 0.5 0" radius-inner="2.4" radius-outer="2.5" opacity="0.25"> <a-animation attribute="rotation" easing="linear" repeat="indefinite" from="0 45 0" to="360 45 0" dur="8000"></a-animation> </a-ring> <a-ring color="#fff" material="side:double" position="0 0.5 0" radius-inner="1.4" radius-outer="1.5" opacity="0.25"> <a-animation attribute="rotation" easing="linear" repeat="indefinite" from="0 -60 0" to="-360 -60 0" dur="3000"></a-animation> </a-ring>

Pratinjau Anda sekarang akan cocok dengan yang berikut ini.

Bola emas dengan banyak cincin
(Pratinjau besar)

Periksa apakah kode Anda cocok dengan kode sumber untuk langkah 5 di Github. Ini menyimpulkan dekorasi untuk bola. Dengan selesainya orb, selanjutnya kita akan menambahkan interaktivitas ke orb. Pada langkah berikutnya, kami secara khusus akan menambahkan kursor yang terlihat dengan animasi klik ketika menunjuk ke objek yang dapat diklik.

Membuat Orbs Interaktif

6. Tambahkan Kursor

Pada langkah ini, kita akan menambahkan kursor putih yang dapat memicu objek yang dapat diklik. Kursor seperti gambar di bawah.

mengklik bola
(Pratinjau besar)

Di tag a-camera Anda, tambahkan entitas berikut. Atribut fuse memungkinkan entitas ini untuk memicu peristiwa klik. Atribut raycaster menentukan seberapa sering dan seberapa jauh untuk memeriksa objek yang dapat diklik. Atribut objects menerima pemilih untuk menentukan entitas mana yang dapat diklik. Dalam hal ini, semua objek kelas yang clickable dapat diklik.

 <a-entity cursor="fuse: true; fuseTimeout: 250" position="0 0 -1" geometry="primitive: ring; radiusInner: 0.03; radiusOuter: 0.04" material="color: white; shader: flat; opacity: 0.5" scale="0.5 0.5 0.5" raycaster="far: 20; interval: 1000; objects: .clickable"> <!-- Place cursor animation here --> </a-entity>

Selanjutnya, tambahkan animasi kursor dan cincin ekstra untuk estetika. Tempatkan yang berikut ini di dalam objek kursor entitas di atas. Ini menambahkan animasi ke objek kursor sehingga klik terlihat.

 <a-circle radius="0.01" color="#FFF" opacity="0.5" material="shader: flat"></a-circle> <a-animation begin="fusing" easing="ease-in" attribute="scale" fill="backwards" from="1 1 1" to="0.2 0.2 0.2" dur="250"></a-animation>

Selanjutnya, tambahkan kelas yang clickable ke #orb0 untuk mencocokkan yang berikut ini.

 <a-entity class="orb clickable" data->

Periksa apakah kode Anda cocok dengan kode sumber untuk Langkah 6 di Github. Di pratinjau Anda, seret kursor Anda ke bola untuk melihat animasi klik beraksi. Ini digambarkan di bawah ini.

mengklik bola
(Pratinjau besar)

Perhatikan atribut yang dapat diklik ditambahkan ke orb itu sendiri dan bukan wadah orb. Ini untuk mencegah cincin menjadi objek yang dapat diklik. Dengan cara ini, pengguna harus mengklik bola yang membentuk bola itu sendiri.

Pada langkah terakhir kami untuk bagian ini, Anda akan menambahkan animasi untuk mengontrol status on dan off untuk orb.

7. Tambahkan Status Orb

Pada langkah ini, Anda akan menganimasikan bola masuk dan keluar dari keadaan mati saat diklik. Ini digambarkan di bawah ini.

Bola interaktif merespons klik
(Pratinjau besar)

Untuk memulai, Anda akan mengecilkan dan menurunkan bola ke tanah. Tambahkan tag a-animation ke #container-orb0 tepat setelah #orb0 . Kedua animasi dipicu oleh satu klik dan memiliki fungsi easing yang sama, easy ease-elastic untuk sedikit pantulan.

 <a-animation class="animation-scale" easing="ease-elastic" begin="click" attribute="scale" from="0.5 0.5 0.5" to="1 1 1" direction="alternate" dur="2000"></a-animation> <a-animation class="animation-position" easing="ease-elastic" begin="click" attribute="position" from="8 0.5 0" to="8 3 0" direction="alternate" dur="2000"></a-animation>

Untuk lebih menekankan keadaan mati, kami akan menghapus titik cahaya keemasan saat bola mati. Namun, lampu orb ditempatkan di luar objek orb. Dengan demikian, event klik tidak diteruskan ke lampu saat orb diklik. Untuk menghindari masalah ini, kami akan menggunakan beberapa Javascript ringan untuk meneruskan acara klik ke cahaya. Tempatkan tag animasi berikut di #light-orb0 . Lampu dipicu oleh peristiwa switch khusus.

 <a-animation class="animation-intensity" begin="switch" attribute="intensity" from="0" to="1" direction="alternate"></a-animation>

Selanjutnya, tambahkan event listener klik berikut ke #container-orb0 . Ini akan menyampaikan klik ke lampu bola.

 <a-entity ...>

Periksa apakah kode Anda cocok dengan kode sumber untuk Langkah 7 di Github. Terakhir, tarik pratinjau Anda, dan gerakkan kursor ke dalam dan ke luar bola untuk beralih antara status aktif dan nonaktif. Ini digambarkan di bawah ini.

Bola interaktif merespons klik
(Pratinjau besar)

Ini menyimpulkan interaktivitas bola itu. Pemain sekarang dapat menghidupkan dan mematikan bola sesuka hati, dengan status hidup dan mati yang cukup jelas.

Kesimpulan

Dalam tutorial ini, Anda membuat orb sederhana dengan status aktif dan nonaktif, yang dapat dialihkan dengan klik kursor ramah headset-VR. Dengan sejumlah teknik pencahayaan dan animasi yang berbeda, Anda dapat membedakan kedua keadaan tersebut. Ini menyimpulkan elemen desain realitas virtual untuk bola. Di bagian tutorial selanjutnya, kita akan mengisi bola secara dinamis, menambahkan mekanisme permainan, dan menyiapkan protokol komunikasi antara sepasang pemain.