Menyiapkan proyek multiplayer
Menggunakan Manajer Jaringan HUD

Menggunakan Manajer Jaringan

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 .

Network Manager adalah komponen untuk mengelola aspek jaringan dari permainan multiplayer.

Fitur Network Manager meliputi:

  • Manajemen negara permainan
  • Spawn management
  • SceneAdegan berisi lingkungan dan menu permainan Anda. Pikirkan setiap file Adegan unik sebagai tingkat yang unik. Di setiap Adegan, Anda menempatkan lingkungan, hambatan, dan dekorasi, pada dasarnya merancang dan membangun permainan Anda dalam potongan-potongan. More info
    Lihat di Glossary
  • Informasi debugging
  • Matchmaking
  • Customization

Memulai dengan Manajer Jaringan

Jaringan Manager adalah komponen kontrol inti dari permainan multiplayer. Untuk memulai, buat GameObjectObjek 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
kosong di adegan awal Anda, dan tambahkan komponen NetworkManager. Komponen Network Manager baru ditambahkan seperti ini:

The Network Manager as seen in the inspector window
Jaringan Manager terlihat di jendela inspektur

InspectorJendela Unity yang menampilkan informasi tentang Pengaturan GameObject yang dipilih saat ini, aset atau proyek, memungkinkan Anda untuk memeriksa dan mengedit nilai. More info
Lihat di Glossary
untuk Manajer Jaringan di Editor memungkinkan Anda untuk mengkonfigurasi dan mengontrol banyak hal yang berkaitan dengan jaringan.

Note: Anda hanya harus memiliki satu Manajer Jaringan aktif di setiap Adegan. Jangan menempatkan komponen Network Manager pada GameObject jaringan (satu yang memiliki komponen Identitas Jaringan), karena Unity menonaktifkan ini ketika beban Adegan.

Jika Anda sudah akrab dengan perkembangan game multiplayer, Anda mungkin merasa berguna untuk mengetahui bahwa komponen Network Manager diimplementasikan sepenuhnya menggunakan API (HLAPI), sehingga segalanya juga tersedia bagi Anda melalui scripting. Untuk pengguna lanjutan, jika Anda menemukan bahwa Anda perlu memperluas fitur komponen Network Manager, Anda dapat menggunakan skrip ke derive kelas Anda sendiri dari NetworkManager dan menyesuaikan perilakunya dengan mengintimidasi kait fungsi virtual yang disediakan. Namun, komponen Network Manager membungkus banyak fungsi yang berguna ke dalam satu tempat, dan membuat, berjalan dan debugging multiplayer game sesederhana mungkin.

Manajemen negara permainan

Game multiplayer Jaringan dapat berjalan dalam tiga mode - sebagai klien, sebagai server khusus, atau sebagai “Host” yang merupakan klien dan server pada saat yang sama.

Jika Anda menggunakan Jaringan Manajer HUD, secara otomatis memberi tahu Network Manager yang mode untuk memulai, berdasarkan opsi mana pemain memilih. Jika Anda menulis UI(User Interface) Memungkinkan pengguna untuk berinteraksi dengan aplikasi Anda. Unity saat ini mendukung tiga sistem UI. More info
Lihat di Glossary
Anda sendiri yang memungkinkan pemain untuk memulai permainan, Anda harus memanggil ini dari kode Anda sendiri. Metode ini adalah:

The network address and port settings in the Network Manager component
Alamat jaringan dan pengaturan port di komponen Manajer Jaringan

Apapun mode permainan dimulai di (klien, server, atau host), sifat Network Address dan Network Port digunakan. Dalam mode klien, upaya permainan untuk terhubung ke alamat dan port yang ditentukan. Dalam mode server atau host, permainan mendengarkan koneksi masuk pada port yang ditentukan.

Selama perkembangan permainan Anda, hal ini dapat berguna untuk menempatkan alamat tetap dan pengaturan port ke properti ini. Namun, akhirnya Anda mungkin ingin pemain Anda dapat memilih host yang ingin mereka hubungkan. Ketika Anda sampai ke tahap itu, komponen Jaringan Discovery (lihat Penemuan Lokal) dapat digunakan untuk penyiaran dan menemukan alamat dan pelabuhan di jaringan daerah setempat (LAN), dan layanan Matchmaker dapat digunakan untuk pemain untuk menemukan internet pertandingan untuk terhubung ke (lihat Layanan Multiplayer).

Spawn management

Gunakan Manajer Jaringan untuk mengelola pemijatan (selajaran yang didukung) GameObjects jaringan dari PrefabsJenis aset yang memungkinkan Anda untuk menyimpan GameObject lengkap dengan komponen dan properti. Prefab bertindak sebagai template dari mana Anda dapat membuat instance objek baru di tempat kejadian. More info
Lihat di Glossary
.

The Spawn Info section of the Network Manager component
Bagian "Spawn Info" dari komponen Network Manager

Kebanyakan game memiliki Prefab yang mewakili pemain, sehingga Network Manager memiliki slot Player Prefab. Anda harus menetapkan slot ini dengan memimpin pemain Anda. Ketika Anda memiliki set pemain Prefab, pemain GameObject secara otomatis ditidur dari yang Prefab untuk setiap pengguna dalam permainan. Ini berlaku untuk pemain lokal pada server yang dihosting, dan pemain jarak jauh pada klien jarak jauh. Anda harus melampirkan komponen Identitas Jaringan ke Player Prefab.

Setelah Anda ditugaskan seorang pemain Prefab, Anda dapat memulai permainan sebagai tuan rumah dan melihat pemain GameObject spawn. Menghentikan permainan menghancurkan pemain GameObject. Jika Anda membangun dan menjalankan salinan lain dari permainan dan menghubungkannya sebagai klien ke localhost, Network Manager membuat pemain lain GameObject muncul. Ketika Anda berhenti bahwa klien, itu menghancurkan GameObject pemain.

Selain pemain Prefab, Anda juga harus mendaftarkan Prefab lain yang ingin Anda spawn secara dinamis selama gameplay dengan Jaringan Manager.

Anda dapat menambahkan Prefab ke daftar yang ditunjukkan dalam inspektur label Registered Spawnable Prefabs. Anda juga dapat mendaftarkan prefab melalui kode, dengan metode ClientScene.RegisterPrefab().

Jika Anda hanya memiliki satu Manajer Jaringan, Anda perlu mendaftar ke semua prefab yang mungkin ditidur di setiap Adegan. Jika Anda memiliki Manajer Jaringan yang terpisah di setiap Adegan, Anda hanya perlu mendaftarkan prefab yang relevan untuk Adegan itu.

Kustomisasi Pemain Instantiation

Jaringan Manajer spawns pemain GameObjects menggunakan implementasi WordPress.org. Jika Anda ingin menyesuaikan cara pemain GameObjects diciptakan, Anda dapat menimpa fungsi virtual. Kode ini menunjukkan contoh implementasi default:

public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
{
    var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);
    NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
}

Sitemap Jika Anda menerapkan versi kustom dari OnServerAddPlayer, metode Note: harus disebut untuk pemain baru diciptakan GameObject, sehingga ditidur dan terkait dengan koneksi klien. AddPlayerForConnection memijat GameObject, jadi Anda tidak perlu menggunakan NetworkServer.AddPlayerForConnection().JaringanServer.Spawn().

Mulai posisi

Untuk mengontrol di mana pemain ditidur, Anda dapat menggunakan komponen Posisi Mulai Jaringan. Untuk menggunakan ini, melampirkan komponen Jaringan Start Position ke GameObject di Adegan, dan posisi GameObject di mana Anda ingin salah satu pemain untuk memulai. Anda dapat menambahkan banyak posisi mulai ke Adegan Anda seperti yang Anda sukai. Manajer Jaringan mendeteksi semua posisi awal di Adegan Anda, dan ketika memijat setiap instance pemain, itu menggunakan posisi dan orientasi salah satu dari mereka.

Jaringan Manager memiliki properti Player Spawn Method, yang memungkinkan Anda untuk mengkonfigurasi bagaimana posisi awal dipilih.

  • Pilih Random untuk memijat pemain pada pilihan awal yang dipilih secara acak.

  • Pilih Round Robin untuk siklus melalui opsi startPosition dalam daftar set.

Jika mode Random atau Round Robin tidak sesuai dengan permainan Anda, Anda dapat menyesuaikan bagaimana posisi awal dipilih dengan menggunakan kode. Anda dapat mengakses komponen Network Start Position yang tersedia oleh daftar WordPress.org, dan Anda dapat menggunakan metode helper GetStartPosition() pada Network Manager yang dapat digunakan dalam implementasi OnServerAddPlayer untuk menemukan posisi awal.

Manajemen adegan

Sebagian besar permainan memiliki lebih dari satu adegan. Paling tidak, biasanya ada layar judul atau mulai menu Adegan selain Adegan di mana permainan sebenarnya dimainkan. Jaringan Manager dirancang untuk mengelola secara otomatis Adegan state dan Adegan transisi dengan cara yang bekerja untuk permainan multiplayer.

Ada dua slot di NetworkManager Inspector untuk adegan: adegan Offline dan adegan online. Menyeret aset adegan ke dalam slot ini mengaktifkan manajemen adegan jaringan.

Ketika server atau host dimulai, Adegan Online dimuat. Ini kemudian menjadi adegan jaringan saat ini. Setiap klien yang terhubung ke server yang diinstruksikan juga memuat Adegan itu. Nama Adegan ini disimpan di properti networkSceneName.

Ketika jaringan dihentikan, dengan menghentikan server atau host atau oleh klien memutuskan, adegan offline dimuat. Ini memungkinkan permainan untuk secara otomatis kembali ke tempat kejadian menu saat terputus dari permainan multiplayer.

Anda juga dapat mengubah Adegan sementara permainan aktif dengan memanggil WordPress.org. Ini membuat semua klien yang terhubung saat ini berubah Adegan juga, dan update networkSceneName sehingga klien baru juga memuat Adegan baru.

Walaupun jaringan Manajemen adegan aktif, panggilan apa pun ke fungsi manajemen negara game seperti NetworkManager.StartHost() atau NetworkManager.StopClient() dapat menyebabkan perubahan adegan. Ini berlaku untuk UI kontrol runtime. Dengan mengatur adegan dan memanggil metode ini, Anda dapat mengontrol aliran permainan multiplayer Anda.

Perhatikan bahwa perubahan adegan menyebabkan semua GameObjects di adegan sebelumnya untuk hancur.

Anda biasanya harus memastikan Manajer Jaringan berlanjut antara Adegan, jika koneksi jaringan rusak pada perubahan Adegan. Untuk melakukan ini, pastikan kotak Don’t Destroy On Load diperiksa di Inspektur. Namun dimungkinkan untuk memiliki Manajer Jaringan yang terpisah di setiap Adegan dengan pengaturan yang berbeda, yang dapat membantu jika Anda ingin mengontrol pemuatan Prefab inkremental, atau transisi Adegan yang berbeda.

Customization

Ada fungsi virtual pada kelas NetworkManager yang dapat Anda sesuaikan dengan membuat kelas yang Anda alami dari NetworkManager. Ketika mengimplementasikan fungsi ini, pastikan untuk mengurus fungsi yang disediakan implementasi default. Sebagai contoh, dalam OnServerAddPlayer(), fungsi NetworkServer.AddPlayer harus disebut untuk mengaktifkan pemain GameObject untuk koneksi.

Ini adalah semua callback yang dapat terjadi untuk host/server dan klien, dalam beberapa kasus penting untuk memprovokasi fungsi kelas dasar untuk menjaga perilaku default. Untuk melihat implementasi itu sendiri Anda dapat melihatnya di jaringan repositori bitbucket.

using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Networking.Match;

public class CustomManager : NetworkManager {
    // Server callbacks
    public override void OnServerConnect(NetworkConnection conn) {
        Debug.Log("A client connected to the server: " + conn);
    }

    public override void OnServerDisconnect(NetworkConnection conn) {
        NetworkServer.DestroyPlayersForConnection(conn);
        if (conn.lastError != NetworkError.Ok) {
            if (LogFilter.logError) { Debug.LogError("ServerDisconnected due to error: " + conn.lastError); }
        }
        Debug.Log("A client disconnected from the server: " + conn);
    }
    public override void OnServerReady(NetworkConnection conn) {
        NetworkServer.SetClientReady(conn);
        Debug.Log("Client is set to the ready state (ready to receive state updates): " + conn);
    }
    public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId) {
        var player = (GameObject)GameObject.Instantiate(playerPrefab, Vector3.zero, Quaternion.identity);
        NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
        Debug.Log("Client has requested to get his player added to the game");
    }

    public override void OnServerRemovePlayer(NetworkConnection conn, PlayerController player) {
        if (player.gameObject != null)
            NetworkServer.Destroy(player.gameObject);
    }

    public override void OnServerError(NetworkConnection conn, int errorCode) {
        Debug.Log("Server network error occurred: " + (NetworkError)errorCode);
    }

    public override void OnStartHost() {
        Debug.Log("Host has started");
    }

    public override void OnStartServer() {
        Debug.Log("Server has started");
    }

    public override void OnStopServer() {
        Debug.Log("Server has stopped");
    }

    public override void OnStopHost() {
        Debug.Log("Host has stopped");
    }

    // Client callbacks
    public override void OnClientConnect(NetworkConnection conn)
    {
        base.OnClientConnect(conn);
        Debug.Log("Connected successfully to server, now to set up other stuff for the client...");
    }

    public override void OnClientDisconnect(NetworkConnection conn) {
        StopClient();
        if (conn.lastError != NetworkError.Ok)
        {
            if (LogFilter.logError) { Debug.LogError("ClientDisconnected due to error: " + conn.lastError); }
        }
        Debug.Log("Client disconnected from server: " + conn);
    }

    public override void OnClientError(NetworkConnection conn, int errorCode) {
        Debug.Log("Client network error occurred: " + (NetworkError)errorCode);
    }

    public override void OnClientNotReady(NetworkConnection conn) {
        Debug.Log("Server has set client to be not-ready (stop getting state updates)");
    }

    public override void OnStartClient(NetworkClient client) {
        Debug.Log("Client has started");
    }

    public override void OnStopClient() {
        Debug.Log("Client has stopped");
    }

    public override void OnClientSceneChanged(NetworkConnection conn) {
        base.OnClientSceneChanged(conn);
        Debug.Log("Server triggered scene change and we've done the same, do any extra work here for the client...");
    }
}

Inspektur untuk NetworkManager menyediakan kemampuan untuk mengubah beberapa parameter koneksi dan waktu. Beberapa parameter tidak terpapar di sini tetapi dapat diubah melalui kode.

using UnityEngine;
using UnityEngine.Networking;

public class CustomManager : NetworkManager {
    // Set custom connection parameters early, so they are not too late to be enforced
    void Start()
    {
        customConfig = true;
        connectionConfig.MaxCombinedReliableMessageCount = 40;
        connectionConfig.MaxCombinedReliableMessageSize = 800;
        connectionConfig.MaxSentMessageQueueSize = 2048;
        connectionConfig.IsAcksLong = true;
        globalConfig.ThreadAwakeTimeout = 1;
    }
}
Menyiapkan proyek multiplayer
Menggunakan Manajer Jaringan HUD