Lobi multiplayer
JaringanReader dan serializer JaringanWriter

Menggunakan API Layer Transportasi

Important: UNet adalah solusi yang diuraikan, dan Solusi Multiplayer baru dan NetworkingSistem Unity yang memungkinkan game multiplayer di jaringan komputer. More info
Lihat di Glossary
(Netcode untuk GameObjects) sedang berkembang. Untuk informasi lebih lanjut dan langkah selanjutnya melihat informasi di .

Selain API jaringan tingkat tinggi (HLAPI), Unity juga menyediakan akses ke API jaringan tingkat bawah yang disebut Transport Layer. Lapisan Transportasi memungkinkan Anda untuk membangun sistem jaringan Anda sendiri dengan persyaratan yang lebih spesifik atau canggih untuk jaringan permainan Anda.

Lapisan Transportasi adalah layerLapisan dalam Unity dapat digunakan untuk memilih kelompok GameObjects secara selektif atau keluar dari proses atau perhitungan tertentu. Ini termasuk rendering kamera, pencahayaan, tabrakan fisika, atau perhitungan kustom dalam kode Anda sendiri. More info
Lihat di Glossary
tipis yang bekerja di atas jaringan berbasis soket sistem operasi. Ini dapat mengirim dan menerima pesan yang diwakili sebagai array dari byte, dan menawarkan sejumlah pilihan "kualitas layanan" yang berbeda untuk menyesuaikan skenario yang berbeda. Difokuskan pada fleksibilitas dan kinerja, dan mengekspos API dalam kelas NetworkTransport.

Lapisan Transportasi mendukung layanan dasar untuk komunikasi jaringan. Layanan dasar ini meliputi:

  • Membangun koneksi

  • Berkomunikasi menggunakan berbagai “kualitas layanan”

  • Kontrol aliran

  • Statistik

  • Layanan tambahan, seperti komunikasi melalui server relay atau penemuan lokal

Lapisan Transportasi dapat menggunakan dua protokol: UDP untuk komunikasi generik, dan WebSockets untuk WebGLLogin API yang membuat grafis 2D dan 3D di browser web. Opsi build Unity WebGL memungkinkan Unity untuk mempublikasikan konten sebagai program JavaScript yang menggunakan teknologi HTML5 dan WebGL rendering API untuk menjalankan konten Unity di browser web. More info
Lihat di Glossary
. Untuk menggunakan lapisan transportasi langsung, alur kerja khas adalah sebagai berikut:

  1. Memastikan Lapisan Transportasi Jaringan

  2. Konfigurasi topologi jaringan

  3. Buat host

  4. Mulai komunikasi (koneksi tangan dan mengirim/menerima pesan)

  5. Shutdown library setelah digunakan

Lihat bagian yang sesuai di bawah ini untuk belajar tentang rincian teknis setiap bagian. Setiap bagian menyediakan cuplikan kode untuk menyertakan skrip jaringan Anda.

Langkah 1: Menginisialisasi Lapisan Transportasi Jaringan

Ketika menginisialisasi Lapisan Transportasi Jaringan, Anda dapat memilih antara awalisasi default yang ditunjukkan dalam sampel kode di bawah (tidak ada argumen), atau Anda dapat menyediakan parameter tambahan yang mengontrol perilaku keseluruhan lapisan jaringan, seperti ukuran paket maksimum dan batas waktu benang.

Untuk menginisialisasi lapisan transportasi dengan pengaturan default, sebut Init():


    // Initializing the Transport Layer with no arguments (default settings)
    NetworkTransport.Init();

To initialize the transport layer with your own configuration just add your configuration as a parameter to Init, as shown below.

    // An example of initializing the Transport Layer with custom settings
    GlobalConfig gConfig = new GlobalConfig();
    gConfig.MaxPacketSize = 500;
    NetworkTransport.Init(gConfig);

Anda hanya boleh menggunakan nilai Init kustom jika Anda memiliki lingkungan jaringan yang tidak biasa dan akrab dengan pengaturan spesifik yang Anda butuhkan. Sebagai aturan thumb, jika Anda mengembangkan permainan multiplayer khas untuk dimainkan di internet, pengaturan Init default cukup.

Langkah 2: Mengkonfigurasi topologi jaringan

Langkah berikutnya adalah untuk mengkonfigurasi koneksi antara rekan. Topologi jaringan menentukan berapa banyak koneksi yang diperbolehkan dan konfigurasi koneksi apa yang akan digunakan. Jika permainan Anda perlu mengirim pesan jaringan yang bervariasi penting (misalnya pentingnya rendah seperti efek suara insidental, vs sangat penting seperti apakah pemain mencetak poin), Anda mungkin ingin mendefinisikan beberapa saluran komunikasi, masing-masing dengan kualitas yang berbeda dari tingkat layanan yang ditentukan sesuai dengan jenis pesan tertentu yang ingin Anda kirim, dan penting relatif mereka dalam permainan Anda.


    ConnectionConfig config = new ConnectionConfig();
    int myReliableChannelId  = config.AddChannel(QosType.Reliable);
    int myUnreliableChannelId = config.AddChannel(QosType.Unreliable);

Contoh di atas mendefinisikan dua saluran komunikasi dengan nilai layanan yang berbeda. QosType.Reliable memberikan pesan dan memastikan bahwa pesan disampaikan, sementara QosType.Unreliable mengirim pesan lebih cepat, tetapi tanpa pemeriksaan untuk memastikannya disampaikan.

Anda juga dapat menyesuaikan properti pada ConnectionConfig untuk menentukan pengaturan konfigurasi untuk setiap koneksi. Namun, ketika membuat koneksi dari satu klien ke yang lain, pengaturan harus sama untuk peer terhubung, atau koneksi gagal dengan kesalahan CRCMismatch.

Langkah terakhir dari konfigurasi jaringan adalah definisi topologi.


HostTopology topology = new HostTopology(config, 10);

Contoh ini mendefinisikan topologi host karena dapat memungkinkan hingga 10 koneksi. Koneksi ini adalah yang Anda konfigurasikan dalam Langkah 1.

Langkah 3: Buat host

Sekarang bahwa Anda telah melakukan dua langkah set-up awal pertama, Anda perlu membuat host (kaket terbuka):


int hostId = NetworkTransport.AddHost(topology, 8888);

Contoh kode ini menambahkan host baru pada port 8888 dan alamat IP apa pun. Host mendukung koneksi 10 (Anda mengkonfigurasi ini di Langkah 2). Koneksi ini adalah yang Anda konfigurasikan di Langkah 1.

Langkah 4: Mulai berkomunikasi

Untuk memulai berkomunikasi, Anda perlu mengatur koneksi ke host lain. Untuk melakukan ini, hubungi Connect(). Ini mengatur koneksi antara Anda dan host jarak jauh. Acara diterima untuk menunjukkan apakah koneksi berhasil.

Pertama, hubungkan ke host jarak jauh di 192.168.1.42 dengan port 8888. connectionId yang ditugaskan dikembalikan.


connectionId = NetworkTransport.Connect(hostId, "192.168.1.42", 8888, 0, out error);

Ketika koneksi dilakukan, ConnectEvent diterima. Sekarang Anda dapat mulai mengirim data.


NetworkTransport.Send(hostId, connectionId, myReliableChannelId, buffer, bufferLength,  out error);

Ketika Anda dilakukan dengan koneksi, hubungi Disconnect() untuk memutuskan host.

NetworkTransport.Disconnect(hostId, connectionId, out error);

Untuk memeriksa apakah panggilan fungsi Anda berhasil, Anda dapat melemparkan out error ke NetworkError. WordPress.org menunjukkan bahwa tidak ada kesalahan yang ditemui.

Untuk memeriksa status host, Anda dapat menggunakan dua fungsi:

Untuk peristiwa polling dari antrian acara internal yang dapat Anda sebutkan baik

JaringanTransport. Menerima (out recHostId, koneksi keluar Id, keluar channelId, recBuffer, bufferSize, keluar dataSize, keluar error);

Atau NetworkTransport.ReceiveDariHost (recHost Id, keluar koneksiId, keluar channelId, recBuffer, bufferSize, out dataSize, keluar error);

Kedua fungsi ini kembali peristiwa dari antrian; fungsi pertama akan kembali peristiwa dari setiap host, dan variabel recHostId akan ditugaskan dengan host id bahwa pesan berasal dari, sedangkan fungsi kedua kembali peristiwa hanya dari host yang ditentukan oleh recHostId yang Anda berikan.

Satu cara untuk mencemari data dari Receive adalah untuk menyebutnya dalam fungsi Update Anda;


void Update()
{

    int recHostId; 
    int connectionId; 
    int channelId; 
    byte[] recBuffer = new byte[1024]; 
    int bufferSize = 1024;
    int dataSize;
    byte error;
    NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);
    switch (recData)
    {
        case NetworkEventType.Nothing:                     break;
        case NetworkEventType.ConnectEvent:                break;
        case NetworkEventType.DataEvent:                   break;
        case NetworkEventType.DisconnectEvent:            break;

  case NetworkEventType.BroadcastEvent:

       break;
    }
}

Ada 5 jenis acara yang dapat Anda terima.

  • WordPress.org: queue acara tidak memiliki laporan.

  • WordPress.org : Anda telah menerima acara penghubung. Ini dapat menjadi permintaan menghubungkan yang sukses, atau respons koneksi.


case NetworkEventType.ConnectEvent: 
    if(myConnectionId == connectionId)
        //my connect request was approved
    else
        //somebody else sent a connect request to me
    break;

  • WordPress.org: Anda telah menerima acara data. Anda menerima acara data ketika ada beberapa data yang siap dipublikasikan. Jika recBuffer cukup besar untuk mengandung data, data disalin ke buffer. Jika tidak, acara mengandung kesalahan jaringan MessageToLong. Jika ini terjadi, Anda harus menyadari penyangga ke ukuran yang lebih besar dan memanggil fungsi DataEvent lagi.

  • JaringanEventType.DisconnectEvent: Koneksi yang ditetapkan Anda telah memutuskan, atau permintaan terhubung Anda telah gagal. Periksa kode kesalahan untuk mengetahui mengapa ini terjadi.


case NetworkEventType. DisconnectEvent: 
    if(myConnectionId == connectionId)
        //cannot connect for some reason, see error
    else
        //one of the established connections has disconnected
    break;

WebGL

Anda dapat menggunakan WebSockets di WebGL, namun klien web hanya dapat terhubung ke host, mereka tidak bisa menjadi host sendiri. Ini berarti host harus menjadi pemain mandiri (Win, Mac atau Linux saja). Untuk konfigurasi sisi klien, semua langkah yang dijelaskan di atas (termasuk topology dan konfigurasi) sama. Di server, sebut berikut:


NetworkTransport.AddWebsocketHost(topology, port, ip);

Alamat IP di atas harus menjadi alamat khusus yang ingin Anda dengarkan, atau Anda dapat melewati null sebagai alamat IP jika Anda ingin tuan rumah untuk mendengarkan semua antarmuka jaringan.

Server hanya dapat mendukung satu host WebSocket pada suatu waktu, tetapi dapat menangani host generik lainnya pada saat yang sama:


NetworkTransport.AddWebsocketHost(topology, 8887, null);
NetworkTransport.AddHost(topology, 8888);

Lobi multiplayer
JaringanReader dan serializer JaringanWriter