Multiplayer lokal di Unity menggunakan Unet. Couch Wars: game terbaik untuk multipemain lokal

Halo semuanya! Hari ini saya ingin berbicara tentang salah satu cara membuat multipemain lokal di Unity. Solusi ini cocok untuk showcase, pengujian fitur, atau multipemain lokal. Misalnya, jika Anda ingin melihat apa yang sedang dilakukan pemutar, tetapi tidak ingin menghabiskan sumber daya ekstra di Android dan mengambil screencast menggunakan ADB, Anda cukup menyiapkan server di beberapa mesin dalam bentuk salinan aplikasi yang berjalan di telepon dan mengirimkan informasi tentang tindakan pemain ke sana.


Saya akan menjelaskan secara singkat bagaimana hal ini dapat dilakukan menggunakan HLAPI di Unet, tetapi tidak melalui NetworkingManager, tetapi pada level yang sedikit lebih rendah. Sesuai tradisi yang baik, saya akan melampirkan contoh penerapan interaksi klien-server tersebut. Mohon jangan menilai contoh ini terlalu keras, karena saya memahami betul bahwa arsitektur solusi ini tidak bagus dan menimbulkan banyak masalah di masa depan. Tujuan saya adalah menulis sebuah sistem secepat mungkin (selama akhir pekan) di mana saya dapat menunjukkan prinsip bekerja dengan jaringan. Saya juga akan memberi tahu Anda masalah apa yang saya temui. DI DALAM dalam contoh ini Implementasinya mengasumsikan bahwa server juga merupakan aplikasi Unity.

Di Internet, contoh paling umum tentang cara membuat multipemain adalah obrolan, tetapi saya menyukai permainan, dan membuat obrolan terasa membosankan bagi saya. Oleh karena itu, saya memutuskan untuk melihat cara membuat multipemain menggunakan contoh tic-tac-toe. Katakanlah semua logika permainan, penentuan pemenang, perubahan gerakan, dll, telah ditulis, dan yang harus kita lakukan hanyalah menginstal servernya. Dalam kasus paling sederhana, kita perlu memproses 2 pesan di tic-tac-toe. Menentukan urutan perpindahan (mendistribusikan ID) dan menangkap sel.


Secara keseluruhan, permainan dalam contoh ini bekerja dengan sangat sederhana. Ada 2 adegan. Memuat dan gameplay. Saat memuat adegan gameplay, kami membuat bidang tempat para pemain bermain. Kondisi kemenangan juga diperiksa di sana, ada kelas-kelas yang bertanggung jawab atas pengoperasian UI, serta urutan gerakan dan logika permainan secara keseluruhan, tapi ini tidak terlalu menarik bagi kami. Kelas utama yang bertanggung jawab atas grid adalah Server, Klien, NetManager dan file terpisah untuk pesan NetMessages dan enum MyMsgType yang ditentukan di dalamnya. Mereka adalah pembungkus alat Unet. Dari perspektif Unet, kelas utama yang akan kita gunakan adalah NetworkClient, NetworkServer, MessageBase dan MsgType. Apa saja kelas-kelas ini?

Kelas paling sederhana adalah MessageBase dan MsgType. Yang pertama adalah kelas abstrak yang darinya semua pesan kita harus diwarisi agar dapat dikirim antara klien dan server. MsgType hanyalah sebuah kelas yang menyimpan konstanta yang bertanggung jawab atas sekumpulan pesan tertentu yang tertanam di Unet.


NetworkServer adalah singleton yang menyediakan kemampuan untuk menangani komunikasi dengan klien jarak jauh. Di bawah tenda ia menggunakan instance NetworkServerSimple dan pada dasarnya merupakan pembungkus yang nyaman di sekitarnya. Pertama, kita perlu memulai server pada port tertentu. Untuk melakukan ini, Anda perlu memanggil metode tersebut Dengarkan (int serverPort)- metode ini memulai server pada port serverPort. (Izinkan saya mengingatkan Anda bahwa semua port dalam rentang 0 hingga 1023 adalah port sistem dan tidak boleh digunakan sebagai parameter metode ini)

Server berfungsi dengan baik dan mendengarkan beberapa port. Sekarang kita membutuhkannya untuk menanggapi pesan. Untuk melakukan ini, Anda perlu mendaftarkan penangan menggunakan metode ini RegisterHandler(pesan singkat, Networking.NetworkMessageDelegate handler). Metode ini mengambil tipe pesan dan delegasi sebagai parameter. Delegasi, pada gilirannya, harus menerima NetworkMessage sebagai parameter masukan. Katakanlah kita ingin adegan gameplay mulai dimuat di server saat seorang pemain bergabung dengannya, dan ID pemain juga didistribusikan. Kemudian kita perlu mendaftarkan handler untuk pesan terkait, serta mengimplementasikan metode yang akan kita lewati sebagai delegasi untuk registrasi.

Ini terlihat seperti ini:

Contoh mendaftarkan handler dan delegasi

NetworkServer.RegisterHandler(MsgType.Connect, OnConnect); private void OnConnect(Pesan Jaringan) ( Debug.Log(string.Concat("Tersambung: ", msg.conn.address)); var connId = msg.conn.connectionId; if (NetworkServer.connections.Count > Constants.PLAYERS_COUNT) ( SendPlayerID(connId, -1); ) else ( int indeks = Random.Range(0, Constants.PLAYERS_IDS.Length); SendPlayerID(connId, Constants.PLAYERS_IDS); _CurrentUser.PlayerID = Constants.PLAYERS_IDS[(indeks + 1) % Konstanta.PLAYERS_COUNT]; SceneManager.LoadScene(1) )


Sekarang metode OnConnect akan dipanggil setiap kali pengguna terhubung. Perlu diklarifikasi bahwa dalam implementasi ini, ID menentukan urutan perpindahan, jadi pada koneksi pertama, ID untuk klien dan server dipilih. Klien yang tersisa secara otomatis menerima ID sama dengan -1, yang berarti klien ini adalah pemirsa.

Ada server sederhana. Sekarang klien tidak akan ikut campur. Untuk melakukan ini, kita akan menggunakan kelas NetworkClient. Untuk bergabung dengan server Anda hanya perlu memanggil metode tersebut Hubungkan (string serverIp, int serverPort). Kami menetapkan port yang didengarkan server kami; kami menetapkan localhost sebagai IP jika kami menguji aplikasi kami pada satu mesin atau IP komputer di jaringan lokal yang kami gunakan sebagai server (Anda dapat menemukannya di bagian pengaturan jaringan atau di konsol menggunakan perintah ipconfig di komputer yang akan bertindak sebagai server).

Bagus, kita bisa terhubung. Telah dikatakan sebelumnya bahwa server kami mendistribusikan ID. Artinya, pertama-tama kita perlu mengirim pesan tentang ID, dan juga mendaftarkan penangan untuk pesan ini di klien. Seperti disebutkan sebelumnya, semua pesan harus diwarisi dari MessageBase. Pertama, mari kita definisikan (saya lebih suka melakukan ini dalam file terpisah):

Pesan dan jenisnya

kelas publik PlayerIDMessage: MessageBase ( public int PlayerID; ) enum publik MyMsgType: short ( PlayerID = MsgType.Highest + 1, )


Untuk mengirim pesan ini memanggil metode pada klien Kirim(pesan singkat, Pesan Jaringan.MessageBase), yang akan mengirimkan pesan pesan “type” msgType ke server, atau di server salah satu metode tergantung pada tujuannya SendToAll(pesan singkat, Pesan Jaringan.MessageBase) atau SendToClient(int connectionId, pesan singkat, Networking.MessageBase pesan), dengan connectionId adalah id klien tertentu.

Memproses ID orang yang masuk pada klien

private void OnPlayerID(Pesan JaringanMessage) (Pesan PlayerIDMessage = msg.reader.ReadMessage ();


_CurrentUser.PlayerID = pesan.PlayerID;

Manajer Pemandangan.LoadScene(1);

1. Periksa apakah Unity Editor tidak diblokir oleh firewall Anda untuk komunikasi melalui protokol TCP dan UDP. Suatu kali saya menghabiskan beberapa waktu untuk hal ini, terlepas dari kenyataan bahwa saya masuk ke firewall dan mengatur port yang diperlukan sebagai pengecualian, tetapi tidak memeriksa bahwa editor tidak diblokir.

2. Berikan tipe nilai atau tipe referensi serial dalam pesan, dan jangan teruskan pewaris MonoBehavior. Penting juga untuk dipahami bahwa tipe referensi dalam hal ini akan mentransfer salinan objek, dan bukan objek itu sendiri, dan harus diproses sebagaimana mestinya.

Dalam kasus yang sedang kita bicarakan jaringan lokal dan perangkat keras yang sudah dikenal sebelumnya, tidak banyak masalah yang muncul dalam kasus multipemain “nyata”. Praktis tidak perlu memikirkan penundaan, fluktuasi, kehilangan paket, dll. Oleh karena itu, solusi seperti itu dapat bermanfaat, meskipun permasalahan ini dapat diselesaikan dengan pendekatan ini sampai batas tertentu. Dibandingkan dengan lebih banyak tingkat tinggi abstraksi di Unet, melalui NetworkManager, NetworkBehavior, dll., ini memberikan fleksibilitas yang lebih mudah dipahami dan jelas (menurut saya), jika klien perlu memuat adegan yang berbeda, dll., dan mengatakan server digunakan sebagai layanan streaming dan menunjukkan apa itu ditampilkan di perangkat pemain, mengambil posisi dan rotasinya + menduplikasi apa yang terjadi di sisinya. Dalam kasus lain, ketika solusi yang lebih cepat diperlukan dan Anda tahu cara bekerja dengan jaringan, Unet menyediakan kemampuan untuk menulis pada lapisan transport.

Saya juga ingin mengklarifikasi tentang solusi di Github (bukan dari sudut pandang alat, tetapi dari sudut pandang pendekatan arsitektur) menurut saya, ini adalah contoh apa yang tidak boleh dilakukan. Belum lagi arsitektur gamenya sendiri, soalnya logika di client dan server dianggap independen. Saat mengimplementasikan multipemain yang memadai dengan arsitektur klien-server, lebih baik jika status permainan disimpan di server dan direplikasi ke klien, dan klien mengirimkan perintah yang mengubah status permainan di server. Hal ini tentu saja juga bergantung pada banyak faktor, namun rata-rata pendekatannya seperti itu.

Dengan berkembangnya Internet dan teknologi seluler komunikasi langsung tampaknya menjadi jarang. Katakanlah tidak ada yang salah dengan fakta bahwa selama keheningan yang canggung, orang lebih memilih untuk membenamkan hidung mereka di ponsel pintar dan tablet mereka. Jauh lebih buruk lagi bahwa multipemain lokal sudah ketinggalan zaman: sekarang dengan satu klik Anda dapat memainkan game modern apa pun secara online tanpa mengundang teman - semua orang sudah diundang ke lobi online yang nyaman. Tapi apa yang lebih baik daripada komunikasi langsung saat bermain? Tiupan lawan terdengar tepat di telinga Anda, dan Anda dapat mengungkapkan keluhan apa pun secara langsung - atau dengan senang hati mendengarkan keluhan yang ditujukan kepada Anda. Kami memutuskan untuk mengingat setidaknya sepuluh permainan modern, yang meskipun ada kemajuan, Anda dapat berkumpul dengan kelompok yang ramah dan bermain dalam semangat jadul. Sehingga dindingnya bergetar.

kekuatan bro

Rilis resmi Broforce belum dilakukan, tetapi bahkan versi beta dari game ini benar-benar menyenangkan. Satu platformer menyatukan semua ikon aksi pergantian tahun 80an dan 90an, masing-masing dengan kemampuannya sendiri. Sejak zaman kita, Broforce menjadi lebih baik lagi - misalnya, Hulk Hogan muncul di dalam game.

Multiplayer FIFA sudah lama berpindah ke online berkat kesuksesan mode Ultimate Team, tetapi Gmbox mengingatkan kita bahwa multipemain lokal belum dibatalkan di sini. Pengalaman kami menunjukkan bahwa saat bermain FIFA bersama, gamepad rusak lebih cepat, dan sel-sel saraf masih belum pulih - tetapi game ini sepadan dengan semua pengorbanan ini.

Kenaikan Menara Jatuh

PC, PS4, Ouya

Contoh terbaru yang menginspirasi teks ini. Semua aksi Towerfall berlangsung dalam satu layar, di mana hingga empat pemain dapat bertarung secara bersamaan. Setiap orang dipersenjatai dengan panah, dan di sinilah peraturan berakhir dan kekacauan dimulai: pengaturan permainan menawarkan banyak opsi untuk menambah kekacauan pada pertempuran yang sudah berlangsung cepat. Eksperimen menghasilkan hasil yang paling tidak terduga.

Band Rock 3

PS3, Xbox 360


Game terbaru seri Rock Band ini memang sudah berumur empat tahun, tapi mau bagaimana lagi, masih saja cara terbaik kumpulkan kelompokmu dan jangan mempermalukan dirimu sendiri. Jika Anda memiliki semua fitur yang diperlukan di Rock Band, Anda dapat mengatur VIA yang layak - dengan gitaris, bassis, drummer, pemain keyboard, dan seorang pria yang akan meneriakkan baris favoritnya dari AC/DC ke mikrofon.

Edisi Mortal Kombat Komplet

PC, PS3, Xbox 360

Dalam artikel tentang multipemain lokal, tidak mungkin untuk tidak menyebutkan setidaknya satu game pertarungan, dan kami memutuskan untuk tidak pamer. Kami sangat senang bahwa sekarang ada analog yang hampir lengkap dari game yang telah kami mainkan sejak akhir tahun 90an di semua platform yang memungkinkan - termasuk platform yang belum pernah dirilis secara resmi.

Hutan Tokyo


Memainkan Tokyo Jungle secara co-op jauh lebih sulit dibandingkan bermain sendirian, tapi juga lebih menarik. Itu semua tergantung pada pilihan hewan. Misalnya, jika Anda bermain sebagai predator dan teman Anda bermain sebagai herbivora, Anda harus berburu dan mengumpulkan tanaman. Pada gilirannya, dua predator tidak boleh berbagi mangsa. Secara umum, bermain kucing berpasangan dengan anjing, atau buaya berpasangan dengan ayam adalah pengalaman yang sangat berharga. Ngomong-ngomong, kamu tidak bisa memakan partnermu di dalam game, bahkan yang sudah mati. Etika...


Legenda Rayman

PC, PS3, Xbox 360, PS4, Xbox Satu

Sejak zaman Rayman Origins, platformer tentang Rayman dapat dimainkan secara co-op, dan ini adalah aktivitas terbaik bersama keluarga, sebanding dengan menonton kartun - namun, game ini memiliki cukup banyak momen di mana Anda tidak dapat mengatasinya tanpa ayah Anda . Jenis multipemain lokal lainnya telah muncul di Legends - permainan arcade sepak bola Kung Foot, di mana sebuah tim yang terdiri dari dua pemain mencoba dengan cara apa pun untuk mendorong bola ke gawang pasangan lainnya. Sederhana, tapi menyenangkan sekali.

PS3, Xbox 360



Versi konsol Diablo 3 adalah wahyu bagi kami karena berbagai alasan. Misalnya, siapa sangka Diablo bisa dimainkan di gamepad? Ternyata ini lebih nyaman dibandingkan menggunakan mouse dengan keyboard. Namun ada satu hal lagi: bermain game dengan empat orang dalam satu layar lebih menarik dibandingkan bermain sendiri. Kamera lokal dengan sempurna menjaga seluruh kuartet tetap dalam bingkai, tidak ada pertarungan untuk mendapatkan jarahan bersama (setiap orang mendapatkan miliknya sendiri), dan pihak-pihak lebih cenderung menerima item “legendaris” daripada individu.

tim luar angkasa


Yang paling banyak permainan asli dari yang disajikan, Spaceteam akan mengubah pandangan Anda tentang apa pun permainan jaringan. Pemain tim luar angkasa perlu bekerja sama untuk mengendalikan pesawat luar angkasa, memeriksa dasbor, memberi dan mengikuti perintah. Kenyataannya, terlihat seperti ini: empat orang, terkubur di dalam ponsel mereka, menyebarkan istilah-istilah fiksi ilmiah bercampur dengan kata-kata kotor pilihan. Inikah perilaku astronot sebenarnya? Rupanya, beginilah perilaku mereka - profesinya sangat menegangkan.

Bros Super Smash. Perkelahian / PlayStation All-Stars Battle Royale

Nintendo Wii/PS3 masing-masing

Perwakilan dari genre "petarung" yang agak langka: empat pahlawan berkumpul di satu arena dan dengan riang (percayalah) saling mengalahkan hingga pemenang ditentukan. Sejarah genre ini dimulai dengan Smash Bros., di mana Anda dapat mengadu hampir semua pahlawan Nintendo satu sama lain. Game terbaru dalam seri ini dirilis pada tahun 2008 di Wii dan sedikit kehilangan relevansinya. Bros Smash Baru. akan hadir di Wii U tahun ini, tanggal rilis pastinya tidak diketahui, tetapi game ini memiliki analog di PS3 - dengan para pahlawan game PlayStation dan beberapa tamu undangan seperti Big Daddy dari BioShock. Kelihatannya kertas kalkir yang tidak tahu malu - tapi saya ingat kita ada di dalamnya hidup. Kami mengharapkan hal yang sama untuk Anda.

Jika Anda dan teman Anda adalah pemilik perangkat Android, Anda mungkin bermain-main dengan ide bermain game bersama. Habiskan malam dengan bermain multipemain lokal, berkelahi, dan berkompetisi dengan teman - apa lagi yang lebih menarik?!

Jumlah game yang menerapkan mode ini cukup banyak. Kami mencoba memilih yang terbaik dari mereka dan mengundang Anda untuk melihat sendiri bahwa mereka benar-benar menawan.

Didesain untuk hingga 8 pemain, game besutan Eric Fromling ini adalah petarung dengan berbagai mode permainan di mana Anda harus melemparkan ranjau dan bom ke lawan. Beragam mode akan memikat siapa pun - ada 10 opsi, termasuk menangkap bendera, hoki pengebom, raja bukit, eliminasi, dan opsi lain yang sama menariknya.

Aspal 8


Gameloft telah berhasil menciptakan salah satu pembalap terbaik di platform seluler, yang tetap mengesankan meski sudah muncul sekitar dua tahun lalu. Salah satu fitur praktisnya adalah multipemain lokal, berkat itu Anda dapat mengatur balapan nyata bersama teman-teman tanpa meninggalkan sofa favorit Anda.


Dari semua game balap kart, pengembangan dari Vector Unit ini mungkin yang paling dekat dengan Mario Kart tercinta, setidaknya dalam hal kemungkinan mengadakan kompetisi lokal. Ingatlah bahwa Anda dapat membuka berbagai peta dan memberikan kemampuan unik kepada pembalap Anda, yang dikombinasikan dengan segala jenis booster dan power-up, akan memungkinkan Anda membuat balapan menjadi lebih bervariasi.

PELARANGAN


Studio Flying Wild Hog menawarkan game ini terutama kepada para gamer generasi muda. Kelihatannya sangat menarik, namun ditujukan hanya untuk perangkat yang dilengkapi prosesor Tegra. Untuk multipemain co-op, Anda memerlukan dua pengontrol - ini adalah persyaratan wajib lainnya.


Terraria mampu menarik perhatian Anda untuk waktu yang lama - dunia 2D-nya menawan, dan kerajinan, konstruksi, serta kelangsungan hidupnya membuat ketagihan. Bersama seorang teman, Anda dapat membuat baju besi dan senjata, menyerang bos, membangun rumah, dan mendapatkan makanan.

Minecraft: Edisi Saku


Dengan pembuatan studio Mojang ini, semuanya menjadi jelas - di sini Anda dapat melakukan apa saja, mulai dari membuat kerajinan hingga bertempur dan bepergian. Dan semua ini dapat dilakukan bersama teman dalam mode multipemain lokal. Menjelajahi dunia terbuka Minecraft tanpa sendirian sangatlah mengasyikkan. Cobalah dan lihat sendiri.


Dikembangkan oleh Henry Smith, game ini menempatkan Anda dan tiga teman Anda mengendalikan sebuah pesawat luar angkasa yang terdampar di luar angkasa. Jangan berharap banyak keseriusan dari judul ini; Anda akan menemukan sedikit humor di dalamnya, dan itu sebenarnya tidak terlalu buruk.