Gratis WiFi
Fungsi Spawn Khusus

Bookmark the permalink.

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 .

Pada Unity, Anda biasanya “spawn” (yaitu, menciptakan) 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
baru dengan Instantiate(). Namun, dalam multiplayer High Level APISistem untuk membangun kemampuan multiplayer untuk permainan Unity. Ini dibangun di atas lapisan komunikasi real-time transportasi tingkat bawah, dan menangani banyak tugas umum yang diperlukan untuk permainan multiplayer. More info
Lihat di Glossary
, kata “spawn” berarti sesuatu yang lebih spesifik. Dalam model server-authoritative HLAPI, untuk "mengagalkan" GameObject pada server berarti bahwa GameObject diciptakan pada klien yang terhubung ke server, dan dikelola oleh sistem pemijahan.

Setelah GameObject ditidur menggunakan sistem ini, pembaruan state dikirim ke klien setiap kali perubahan GameObject pada server. Ketika Unity menghancurkan GameObject pada server, itu juga menghancurkannya pada klien. Server mengelola spawned GameObjects bersama semua GameObjects jaringan lainnya, sehingga jika klien lain bergabung dengan permainan kemudian, server dapat menahan GameObjects pada klien itu. GameObjects ini memiliki ID instance jaringan yang unik yang disebut "netIdPengidentifikasi unik yang diberikan pada instance objek untuk melacak antara klien jaringan dan server. More info
Lihat di Glossary
" yang sama pada server dan klien untuk setiap GameObject. ID instance jaringan yang unik digunakan untuk mengatur pesan rute di jaringan ke GameObjects, dan untuk mengidentifikasi GameObjects.

Ketika server memijat GameObject dengan Identitas Jaringan** ** komponen, GameObject ditidur pada klien memiliki "state". Ini berarti identik dengan GameObject pada server; memiliki Transform yang sama, state gerakan, dan (jika NetworkTransformKomponen Jaringan yang memungkinkan Anda untuk menyinkronkan pergerakan GameObjects di jaringan. More info
Lihat di Glossary
dan SyncVars digunakan) variabel yang disinkronkan. Oleh karena itu, GameObjects klien selalu terbaru ketika Unity membuat mereka. Ini menghindari masalah seperti GameObjects memijat di lokasi awal yang salah, kemudian muncul kembali pada posisi yang benar mereka ketika pembaruan negara tiba.

Network ManagerKomponen Jaringan yang mengelola state jaringan proyek. More info
Lihat di Glossary
hanya dapat memijat dan menyinkronkan GameObjects dari Prefab yang terdaftar, sehingga Anda harus mendaftarkan Prefab GameObject tertentu dengan Manajer Jaringan yang ingin Anda dapat memijat selama permainan Anda. Manajer Jaringan hanya akan menerima Kompor GameObject yang memiliki komponen Identitas Jaringan yang terpasang, sehingga Anda harus memastikan Anda menambahkan komponen Identitas Jaringan ke PrefabJenis 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
Anda sebelum mencoba mendaftarkannya dengan Manajer Jaringan.

Untuk mendaftarkan Prefab dengan Manajer Jaringan di Editor, pilih Manajer Jaringan GameObject, dan di 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
, arahkan ke komponen Manajer Jaringan. Klik segitiga di sebelah Spawn Info untuk membuka pengaturan, kemudian di bawah Registered Spawnable Prefabs, klik tombol plus (+). Seret dan drop Prefab ke lapangan kosong untuk menetapkannya ke daftar.

The Network Manager Inspector with the Spawn Info* foldout expanded, displaying three assigned Prefabs under Registered Spawnable Prefabs
Inspektur Manajer Jaringan dengan Spawn Info * lipatan diperluas, menampilkan tiga Prefab yang ditugaskan di bawah Terdaftar Prefab Spawnable

Spawning tanpa Manajer Jaringan

Untuk pengguna yang lebih maju, Anda mungkin menemukan bahwa Anda ingin mendaftarkan Prefab dan memijat GameObjects tanpa menggunakan komponen NetworkManager.

Untuk memijat GameObjects tanpa menggunakan Manajer Jaringan, Anda dapat menangani pendaftaran Prefab sendiri melalui skrip. Gunakan metode ClientScene.RegisterPrefab untuk mendaftarkan Prefab ke Manajer Jaringan.

Contoh: MyNetworkManager


using UnityEngine;
using UnityEngine.Networking;

public class MyNetworkManager : MonoBehaviour 
{
    public GameObject treePrefab;
    NetworkClient myClient;

    // Create a client and connect to the server port
    public void ClientConnect() {
        ClientScene.RegisterPrefab(treePrefab);
        myClient = new NetworkClient();
        myClient.RegisterHandler(MsgType.Connect, OnClientConnect);
        myClient.Connect("127.0.0.1", 4444);
    }

    void OnClientConnect(NetworkMessage msg) {
        Debug.Log("Connected to server: " + msg.conn);
    }
}

Dalam contoh ini, Anda membuat GameObject kosong untuk bertindak sebagai Manajer Jaringan, kemudian membuat dan melampirkan skrip MyNetworkManager (di atas) ke GameObject. Buat Prefab yang memiliki komponen Identitas Jaringan yang melekat padanya, dan tariklah ke slot treePrefab pada komponen MyNetworkManager di Inspector. Ini memastikan bahwa ketika server memijat pohon GameObject, itu juga menciptakan jenis yang sama dari GameObject pada klien.

Mendaftar Prefab memastikan bahwa Aset dimuat dengan 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
, sehingga tidak ada warung atau waktu pemuatan untuk membuat Aset.

Namun, untuk script untuk bekerja, Anda juga perlu menambahkan kode untuk server. Tambahkan ini ke MyNetworkManager script:

public void ServerListen() {
    NetworkServer.RegisterHandler(MsgType.Connect, OnServerConnect);
    NetworkServer.RegisterHandler(MsgType.Ready, OnClientReady);
    if (NetworkServer.Listen(4444))
        Debug.Log("Server started listening on port 4444");
}

// When client is ready spawn a few trees
void OnClientReady(NetworkMessage msg) {
    Debug.Log("Client is ready to start: " + msg.conn);
    NetworkServer.SetClientReady(msg.conn);
    SpawnTrees();
}

void SpawnTrees() {
    int x = 0;
    for (int i = 0; i < 5; ++i) {
        var treeGo = Instantiate(treePrefab, new Vector3(x++, 0, 0), Quaternion.identity);
        NetworkServer.Spawn(treeGo);
    }
}

void OnServerConnect(NetworkMessage msg) {
    Debug.Log("New client connected: " + msg.conn);
}

Server tidak perlu mendaftar apa pun, karena tahu apa GameObject sedang ditidur (dan ID aset dikirim dalam pesan pemijahan). Klien harus dapat melihat GameObject, sehingga harus terdaftar di klien.

Ketika menulis manajer jaringan Anda sendiri, penting untuk membuat klien siap menerima pembaruan negara sebelum memanggil perintah spawn pada server, jika tidak mereka tidak akan dikirim. Jika Anda menggunakan komponen Unity built-in Network Manager, ini terjadi secara otomatis.

Untuk penggunaan yang lebih canggih, seperti kolam objek atau aset yang dibuat secara dinamis, Anda dapat menggunakan metode ClientScene.RegisterSpawnHandler, yang memungkinkan fungsi callback untuk terdaftar untuk pemijatan sisi klien. Lihat dokumentasi tentang Fungsi Spawn Khusus misalnya ini.

Jika GameObject memiliki state jaringan seperti variabel disinkronkan, maka state disinkronkan dengan pesan spawn. Dalam contoh berikut, script ini melekat pada pohon Prefab:

using UnityEngine;
using UnityEngine.Networking;
class Tree : NetworkBehaviour {
    [SyncVar]
    public int numLeaves;
    public override void OnStartClient() {
        Debug.Log("Tree spawned with leaf count " + numLeaves);
    }
}

Dengan skrip ini melekat, Anda dapat mengubah variabel numLeaves dan memodifikasi fungsi SpawnTrees untuk melihat secara akurat tercermin pada klien:

void SpawnTrees() {
    int x = 0;
    for (int i = 0; i < 5; ++i) {
        var treeGo = Instantiate(treePrefab, new Vector3(x++, 0, 0), Quaternion.identity);
        var tree = treeGo.GetComponent<Tree>();
        tree.numLeaves = Random.Range(10,200);
        Debug.Log("Spawning leaf with leaf count " + tree.numLeaves);
        NetworkServer.Spawn(treeGo);
    }
}

Pasang skrip Tree ke skrip treePrefab yang dibuat sebelumnya untuk melihat ini dalam aksi.

Constraints

  • Sebuah 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
    harus pada akar GameObject dari Prefab yang dapat ditidur. Tanpa ini, Manajer Jaringan tidak dapat mendaftarkan Prefab.

  • 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
    harus pada GameObject yang sama sebagai JaringanIdentitas, bukan pada anak GameObjects

Login Aliran penciptaan objek

Aliran aktual operasi internal yang terjadi untuk memijat GameObjects adalah:

  • Prefab dengan komponen Identitas Jaringan terdaftar sebagai spawnable.

  • GameObject digolongkan dari Prefab di server.

  • Kode permainan menetapkan nilai-nilai awal pada instance (note bahwa kekuatan fisika 3D diterapkan di sini tidak mengambil efek segera).

  • NetworkServer.Spawn() disebut dengan instance.

  • Negara SyncVars pada kasus pada server dikumpulkan dengan memanggil OnSerialize() pada komponen Jaringan Behaviour.

  • Pesan jaringan tipe MsgType.ObjectSpawn dikirim ke klien yang terhubung yang mencakup data SyncVar.

  • OnStartServer() disebut pada instance pada server, dan isServer diatur ke true

  • Klien menerima pesan ObjectSpawn dan membuat instance baru dari Prefab terdaftar.

  • Data SyncVar diterapkan pada instance baru pada klien dengan memanggil OnDeserialize() pada komponen Perilaku Jaringan.

  • OnStartClient() disebut pada instance pada setiap klien, dan isClient diatur ke true

  • Sebagai kemajuan gameplay, perubahan nilai SyncVar secara otomatis disinkronkan ke klien. Ini berlanjut sampai permainan berakhir.

  • NetworkServer.Destroy() disebut pada contoh pada server.

  • Pesan jaringan tipe MsgType.ObjectDestroy dikirim ke klien.

  • OnNetworkDestroy() disebut pada kasus pada klien, maka contohnya hancur.

Pemain GameObjects

Pemain GameObjects di HLAPI bekerja sedikit berbeda untuk non-player GameObjects. Aliran untuk memijat pemain GameObjects dengan Network Manager adalah:

  • Prefab dengan NetworkIdentity terdaftar sebagai PlayerPrefab

  • Klien terhubung ke server

  • Klien memanggil AddPlayer(), pesan jaringan tipe MsgType.AddPlayer dikirim ke server

  • Server menerima pesan dan panggilan NetworkManager.OnServerAddPlayer()

  • GameObject digolongkan dari PlayerPrefab di server

  • NetworkManager.AddPlayerForConnection() disebut dengan instance pemain baru di server

  • Contoh pemain ditidur - Anda tidak harus memanggil NetworkServer.Spawn() untuk instance pemain. Pesan spawn dikirim ke semua klien seperti pada spawn normal.

  • Pesan jaringan tipe MsgType.Owner dikirim ke klien yang menambahkan pemain (hanya klien!)

  • Klien asli menerima pesan jaringan

  • OnStartLocalPlayer() disebut pada instance pemain pada klien asli, dan isLocalPlayer diatur untuk benar

Catatan bahwa OnStartLocalPlayer() disebut setelah OnStartClient(), karena hanya terjadi ketika pesan kepemilikan tiba dari server setelah pemain GameObject ditidur, sehingga isLocalPlayer tidak diatur dalam OnStartClient().

Karena OnStartLocalPlayer hanya disebut untuk pemain lokal klien GameObject, itu adalah tempat yang baik untuk melakukan initialisasi yang hanya harus dilakukan untuk pemain lokal. Ini bisa mencakup pemrosesan input, dan memungkinkan pelacakan cameraKomponen yang menciptakan gambar sudut pandang tertentu di tempat kejadian Anda. Output ditarik ke layar atau ditangkap sebagai tekstur. More info
Lihat di Glossary
untuk pemain GameObject.

Spawning GameObjects dengan otoritas klien

Untuk memijat GameObjects dan menetapkan wewenang dari GameObjects kepada klien tertentu, gunakan WordPress.org, yang mengambil argumen NetworkConnection dari klien yang harus dilakukan otoritas.

Untuk GameObjects ini, properti hasAuthority benar pada klien dengan otoritas, dan OnStartAuthority() disebut pada klien dengan otoritas. Klien itu dapat mengeluarkan perintah untuk GameObject. Klien lain (dan pada host), hasAuthority adalah salah.

Tujuan yang ditidur dengan otoritas klien harus memiliki set LocalPlayerAuthority dalam NetworkIdentity mereka.

Sebagai contoh, pohon spawn contoh di atas dapat dimodifikasi untuk memungkinkan pohon untuk memiliki otoritas klien seperti ini (note bahwa kita sekarang perlu untuk lulus dalam JaringanConnection GameObject untuk koneksi klien sendiri):

void SpawnTrees(NetworkConnection conn) {
    int x = 0;
    for (int i = 0; i < 5; ++i)
    {
        var treeGo = Instantiate(treePrefab, new Vector3(x++, 0, 0), Quaternion.identity);
        var tree = treeGo.GetComponent<Tree>();
        tree.numLeaves = Random.Range(10,200);
        Debug.Log("Spawning leaf with leaf count " + tree.numLeaves);
        NetworkServer.SpawnWithClientAuthority(treeGo, conn);
    }
}

Script Pohon sekarang dapat dimodifikasi untuk mengirim perintah ke server:

public override void OnStartAuthority() {
    CmdMessageFromTree("Tree with " + numLeaves + " reporting in");
}

[Command]
void CmdMessageFromTree(string msg) {
    Debug.Log("Client sent a tree message: " + msg);
}

Perhatikan bahwa Anda tidak dapat menambahkan panggilan CmdMessageFromTree ke OnStartClient, karena pada saat itu otoritas belum diatur, sehingga panggilan gagal.

Gratis WiFi
Fungsi Spawn Khusus