Referensi Kelas Multiplayer
NetworkClient

NetworkBehaviour

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 .

JaringanBehaviour scriptsSepotong kode yang memungkinkan Anda untuk membuat Komponen Anda sendiri, memicu peristiwa permainan, memodifikasi sifat komponen dari waktu ke waktu dan menanggapi input pengguna dengan cara apa pun yang Anda sukai. More info
Lihat di Glossary
bekerja dengan GameObjectsObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary
yang memiliki komponen Identitas Jaringan. Script ini dapat melakukan fungsi API seperti Perintah, KlienRPCs, dan SyncVars.

Dengan sistem server-authoritative dari Sistem Jaringan Unity, server harus menggunakan fungsi untuk menahan GameObjects dengan komponen Identitas Jaringan. Menjelajahi mereka cara ini menetapkan mereka dan menciptakan mereka pada klien yang terhubung ke server.

Sitemap Ini bukan komponen yang dapat Anda tambahkan ke GameObject secara langsung. Sebagai gantinya, Anda harus membuat skrip yang berwarisi dari Note: (meskipun default NetworkBehaviour), maka Anda dapat menambahkan skrip Anda sebagai komponen ke GameObject.MonoBehaviour), then you can add your script as a component to a GameObject.

Properties

Property Description
isLocalPlayer Kembali benar jika GameObject ini adalah salah satu yang mewakili pemain di klien lokal.
isServer Kembali benar jika GameObject ini berjalan di server, dan telah ditidur.
isClient Kembali benar jika GameObject ini adalah pada klien dan telah ditidur oleh server.
hasAuthority Kembali benar jika GameObject ini adalah versi otoritatif dari GameObject, berarti itu adalah sumber untuk perubahan disinkronkan. Untuk sebagian besar GameObjects, pengembalian ini benar di server. Namun, jika nilai lokalPlayerAuthority pada NetworkIdentityKomponen Jaringan yang memungkinkan Anda untuk menetapkan identitas ke GameObject Anda untuk jaringan untuk mengenalinya sebagai GameObject Pemain Lokal atau Server Hanya GameObject. More info
Lihat di Glossary
benar, otoritas beristirahat dengan klien pemain itu, dan nilai ini benar pada klien itu bukan pada server.
netId ID jaringan unik dari GameObject ini. Server menetapkan ini pada runtime. Ini unik untuk semua GameObjects dalam sesi jaringan itu.
playerControllerId ID pemain yang terkait dengan skrip JaringanBehaviour ini. Ini hanya berlaku jika objek adalah pemain lokal.
connectionToServer JaringanConnection yang terkait dengan komponen Identitas Jaringan yang melekat pada GameObject ini. Ini hanya berlaku untuk player objectsObjek API Tingkat Tinggi (HPAPI) yang mewakili pemain di server dan memiliki kemampuan untuk menjalankan perintah (yang mengamankan panggilan prosedur jarak jauh klien-to-server) dari klien pemain. More info
Lihat di Glossary
pada klien.
connectionToClient JaringanConnection yang terkait dengan komponen Identitas Jaringan yang melekat pada GameObject ini. Ini hanya berlaku untuk pemain GameObjects di server.
localPlayerAuthority Nilai ini ditetapkan pada komponen Identitas Jaringan dan dapat diakses dari skrip JaringanBehaviour untuk akses mudah di skrip.

Skrip jaringanBehaviour memiliki fitur berikut:

  • variabel sinkronisasi

  • Jaringan callback

  • Server dan fungsi klien

  • Mengirimkan perintah

  • Klient RPC panggilan

  • Photogallery

variabel sinkronisasi

Anda dapat menyinkronkan variabel anggota dari skrip JaringanBehaviour dari server ke klien. Server otoritatif dalam sistem ini, sehingga sinkronisasi hanya terjadi pada arah server ke klien.

Gunakan atribut untuk menandai variabel anggota sebagai disinkronkan. Variabel sinkronisasi dapat menjadi jenis dasar (bool, byte, sbyte, char, desimal, ganda, float, int, uint, panjang, ulong, pendek, ushort, string), tetapi tidak kelas, daftar, atau koleksi lainnya.

public class SpaceShip : NetworkBehaviour
{
    [SyncVar]
    public int health;

    [SyncVar]
    public string playerName;
}

Ketika nilai perubahan SyncVar pada server, server secara otomatis mengirimkan nilai baru kepada semua klien siap dalam permainan, dan memperbarui nilai SyncVar yang sesuai pada klien tersebut. Ketika GameObjects spawn, mereka diciptakan pada klien dengan keadaan terbaru dari semua atribut SyncVar dari server.

Sitemap Untuk membuat permintaan dari klien ke server, Anda perlu menggunakan variabel Note:, tidak disinkronkan. Lihat dokumentasi tentang Sending perintah untuk informasi lebih lanjut.commands, not synchronized variables. See documentation on Sending commands for more information.

Jaringan callback

Ada fungsi callback built-in yang diinjak pada skrip NetworkBehaviour untuk berbagai acara jaringan. Ini adalah fungsi virtual pada kelas dasar, sehingga Anda dapat menimpanya dalam kode Anda sendiri seperti ini:

public class SpaceShip : NetworkBehaviour
{
    public override void OnStartServer()
    {
        // disable client stuff
    }

    public override void OnStartClient()
    {
        // register client events, enable effects
    }
}

Callback internal adalah:

  • - disebut ketika pemijatan GameObject di server, atau ketika server dimulai untuk GameObjects di Adegan

  • - disebut ketika pemijatan GameObject pada klien, atau ketika klien terhubung ke server untuk GameObjects di Adegani

  • - disebut untuk mengumpulkan state untuk mengirim dari server ke klien

  • - disebut untuk menerapkan state ke GameObjects pada klien

  • - disebut pada klien ketika server menghancurkan GameObject

  • - disebut pada klien untuk pemain GameObjects pada klien lokal (hanya)

  • - disebut pada server ketika set pengamat untuk GameObjects dibangun kembali

  • - disebut pada klien dan/atau server ketika visibilitas perubahan GameObject untuk klien lokal

  • - disebut pada server untuk memeriksa keadaan visibilitas untuk klien baru

Perhatikan bahwa dalam pengaturan yang dihosting peer, ketika salah satu klien bertindak sebagai tuan rumah dan klien, baik OnStartServer dan OnStartClient disebut pada GameObject yang sama. Kedua fungsi ini berguna untuk tindakan yang spesifik untuk klien atau server, seperti menekan efek pada server, atau mengatur peristiwa sisi klien.

Server dan fungsi Klien

Anda dapat menandai fungsi anggota di skrip NetworkBehaviour dengan atribut kustom untuk menunjuk mereka sebagai fungsi server-only atau klien-only. Contoh:

using UnityEngine;
using UnityEngine.Networking;

public class SimpleSpaceShip : NetworkBehaviour
{
    int health;

    [Server]
    public void TakeDamage( int amount)
    {
        // will only work on server
        health -= amount;
    }

    [ServerCallback]
    void Update()
    {
        // engine invoked callback - will only run on server
    }


    [Client]
    void ShowExplosion()
    {
        // will only run on client
    }

    [ClientCallback]
    void Update()
    {
        // engine invoked callback - will only run on client
    }
}

[Server] dan [ServerCallback] kembali segera jika klien tidak aktif. Demikian juga, [Client] dan [ClientCallback] kembali segera jika server tidak aktif.

atribut [Server] dan [Client] adalah untuk fungsi callback kustom Anda sendiri. Mereka tidak menghasilkan kesalahan waktu kompilasi, tetapi mereka memancarkan pesan log peringatan jika disebut dalam lingkup yang salah.

atribut [ServerCallback] dan [ClientCallback] adalah untuk fungsi callback internal yang disebut secara otomatis oleh Unity. Atribut ini tidak menyebabkan peringatan yang dihasilkan.

Untuk informasi lebih lanjut, lihat dokumentasi referensi API pada atribut yang dibahas:

Mengirimkan perintah

Untuk mengeksekusi kode pada server, Anda harus menggunakan commands. API tingkat tinggi adalah sistem server-authoritative, sehingga perintah adalah satu-satunya cara untuk klien untuk memicu beberapa kode pada server.

Hanya pemain GameObjects dapat mengirim perintah.

Ketika pemain klien GameObject mengirim perintah, perintah itu berjalan pada pemain yang sesuai GameObject pada server. Routing ini terjadi secara otomatis, sehingga tidak mungkin untuk klien untuk mengirim perintah untuk pemain yang berbeda.

Untuk menentukan command dalam kode Anda, Anda harus menulis fungsi yang memiliki:

  • Nama yang dimulai dengan Cmd

  • Atribut [Command] attribute

Contoh:

using UnityEngine;
using UnityEngine.Networking;

public class SpaceShip : NetworkBehaviour
{
    bool alive;
    float thrusting;
    int spin;

    [ClientCallback]
    void Update()
    {

        // This code executes on the client, gathering input
        int spin = 0;
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            spin += 1;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            spin -= 1;
        }


        // This line triggers the code to run on the server
        CmdThrust(Input.GetAxis("Vertical"), spin);
    }

    [Command]
    public void CmdThrust(float thrusting, int spin)
    {   

        // This code executes on the server after Update() is

        // called from below.
        if (!alive)
        {
            this.thrusting = 0;
            this.spin = 0;
            return;
        }
            
        this.thrusting = thrusting;
        this.spin = spin;
    }

}

Perintah disebut hanya dengan memanggil fungsi biasanya pada klien. Alih-alih fungsi perintah yang berjalan pada klien, secara otomatis diinvoked pada pemain yang sesuai GameObject pada server.

Perintah adalah keamanan tipe, memiliki keamanan bawaan dan routing ke pemain, dan menggunakan mekanisme serialisasi yang efisien untuk argumen untuk membuat panggilan cepat.

Klient RPC panggilan

Klien RPC panggilan adalah cara untuk server GameObjects untuk membuat hal-hal terjadi pada GameObjects klien.

Klien RPC panggilan tidak dibatasi untuk pemain GameObjects, dan dapat disebut pada setiap GameObject dengan komponen Identitas Jaringan.

Untuk menentukan kode Anda client RPC call in, Anda harus menulis fungsi yang:

  • Memiliki nama yang dimulai dengan Rpc

  • Memiliki atribut [ClientRPC] attribute

Contoh:

using UnityEngine;
using UnityEngine.Networking;

public class SpaceShipRpc : NetworkBehaviour
{
    [ServerCallback]
    void Update()
    {

        // This is code run on the server
        int value = UnityEngine.Random.Range(0,100);
        if (value < 10)
        {
            // This invoke the RpcDoOnClient function on all clients
            RpcDoOnClient(value);
        }
    }

    [ClientRpc]
    public void RpcDoOnClient(int foo)
    {

        // This code will run on all clients
        Debug.Log("OnClient " + foo);
    }

}

Photogallery

Networked events seperti Client RPC calls, tetapi alih-alih memanggil fungsi pada GameObject, mereka memicu Acara.

Ini memungkinkan Anda untuk menulis script yang dapat mendaftar untuk callback ketika acara dipicu.

Untuk menentukan kode Anda Networked event in, Anda harus menulis fungsi yang keduanya:

  • Memiliki nama yang dimulai dengan Event

  • Memiliki atribut [SyncEvent] attribute

Anda dapat menggunakan acara untuk membangun sistem permainan jaringan yang kuat yang dapat diperpanjang oleh skrip lain. Contoh ini menunjukkan bagaimana skrip efek pada klien dapat menanggapi peristiwa yang dihasilkan oleh skrip tempur pada server.

SyncEvent is kelas dasar yang Commands and ClientRPC calls berasal dari. Anda dapat menggunakan atribut SyncEvent pada fungsi Anda sendiri untuk membuat kode gameplay berjaring acara Anda sendiri. Menggunakan SyncEvent, Anda dapat memperluas fitur Multiplayer Unity untuk lebih sesuai dengan pola pemrograman Anda sendiri. Contoh:

using UnityEngine;
using UnityEngine.Networking;

// Server script
public class MyCombat : NetworkBehaviour
{
    public delegate void TakeDamageDelegate(int amount);
    public delegate void DieDelegate();
    public delegate void RespawnDelegate();
    
    float deathTimer;
    bool alive;
    int health;

    [SyncEvent(channel=1)]
    public event TakeDamageDelegate EventTakeDamage;
    
    [SyncEvent]
    public event DieDelegate EventDie;
    
    [SyncEvent]
    public event RespawnDelegate EventRespawn;

    [ServerCallback]
    void Update()
    {

        // Check if it is time to Respawn
        if (!alive)
        {
            if (Time.time > deathTimer)
            {
                Respawn();
            }
            return;
        }
    }

    [Server]
    void Respawn()
    {
        alive = true;


        // send respawn event to all clients from the Server
        EventRespawn();
    }


    [Server]
    void EventTakeDamage(int amount)
    {
        if (!alive)
            return;
            
        if (health > amount) {
            health -= amount;
        }
        else
        {
            health = 0;
            alive = false;


            // send die event to all clients
            EventDie();
            deathTimer = Time.time + 5.0f;
        }
    }
}
Referensi Kelas Multiplayer
NetworkClient