Bookmark the permalink.
Network Authority

Fungsi Spawn Khusus

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 .

Anda dapat menggunakan fungsi spawn handler untuk menyesuaikan perilaku default ketika membuat spawned GameObjects 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
pada klien. Fungsi handler Spawn memastikan Anda memiliki kontrol penuh tentang bagaimana Anda menahan 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
, serta bagaimana Anda menghancurkannya.

Gunakan ClientScene.RegisterSpawnHandler untuk mendaftarkan fungsi untuk memijat dan menghancurkan permainan klien. Server membuat GameObjects langsung, dan kemudian memijatnya di klien melalui fungsi ini. Fungsi ini mengambil ID aset GameObject dan dua delegasi fungsi: satu untuk menangani membuat GameObjects pada klien, dan satu untuk menangani menghancurkan GameObjects pada klien. ID aset dapat menjadi yang dinamis, atau hanya ID aset yang ditemukan di GameObject prefab yang ingin Anda spawn (jika Anda memiliki satu).

Pegangan / tidak perlu memiliki tanda tangan GameObject ini. Ini didefinisikan dalam 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
.


// Handles requests to spawn GameObjects on the client
public delegate GameObject SpawnDelegate(Vector3 position, NetworkHash128 assetId);

// Handles requests to unspawn GameObjects on the client
public delegate void UnSpawnDelegate(GameObject spawned);

ID aset yang dilewatkan ke fungsi spawn dapat ditemukan pada WordPress.org untuk prefab, di mana diisi secara otomatis. Pendaftaran ID aset dinamis ditangani seperti ini:


// generate a new unique assetId 
NetworkHash128 creatureAssetId = NetworkHash128.Parse("e2656f");

// register handlers for the new assetId
ClientScene.RegisterSpawnHandler(creatureAssetId, SpawnCreature, UnSpawnCreature);

// get assetId on an existing prefab
NetworkHash128 coinAssetId = coinPrefab.GetComponent<NetworkIdentity>().assetId;

// register handlers for an existing prefab you'd like to custom spawn
ClientScene.RegisterSpawnHandler(coinAssetId, SpawnCoin, UnSpawnCoin);

// spawn a coin - SpawnCoin is called on client
NetworkServer.Spawn(gameObject, coinAssetId);

Fungsi spawn sendiri diterapkan dengan tanda tangan delegasi. Berikut adalah pemijat koin. SpawnCreature akan terlihat sama, tetapi memiliki logika yang berbeda:


public GameObject SpawnCoin(Vector3 position, NetworkHash128 assetId)
{
    return (GameObject)Instantiate(m_CoinPrefab, position, Quaternion.identity);
}
public void UnSpawnCoin(GameObject spawned)
{
    Destroy(spawned);
}

Ketika menggunakan fungsi pemijatan kustom, kadang-kadang berguna untuk dapat menahan GameObjects tanpa menghancurkannya. Hal ini dapat dilakukan dengan memanggil JaringanServer.UnSpawn. Ini menyebabkan pesan dikirim ke klien untuk tidak memijat GameObject, sehingga fungsi non-spawn kustom akan disebut pada klien. GameObject tidak hancur ketika fungsi ini disebut.

Perhatikan bahwa pada host, GameObjects tidak ditidur untuk klien lokal, karena mereka sudah ada di server. Ini juga berarti bahwa tidak ada fungsi spawn handler yang disebut.

Menyiapkan kolam GameObject dengan pegangan spawn kustom

Berikut ini adalah contoh bagaimana Anda mungkin mengatur sistem kolam GameObject yang sangat sederhana dengan pegangan spawn kustom. Spawning dan unspawning kemudian menempatkan GameObjects di atau keluar dari kolam.


using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class SpawnManager : MonoBehaviour
{
    public int m_ObjectPoolSize = 5;
    public GameObject m_Prefab;
    public GameObject[] m_Pool;

    public NetworkHash128 assetId { get; set; }
    
    public delegate GameObject SpawnDelegate(Vector3 position, NetworkHash128 assetId);
    public delegate void UnSpawnDelegate(GameObject spawned);

    void Start()
    {
        assetId = m_Prefab.GetComponent<NetworkIdentity> ().assetId;
        m_Pool = new GameObject[m_ObjectPoolSize];
        for (int i = 0; i < m_ObjectPoolSize; ++i)
        {
            m_Pool[i] = (GameObject)Instantiate(m_Prefab, Vector3.zero, Quaternion.identity);
            m_Pool[i].name = "PoolObject" + i;
            m_Pool[i].SetActive(false);
        }
        
        ClientScene.RegisterSpawnHandler(assetId, SpawnObject, UnSpawnObject);
    }

    public GameObject GetFromPool(Vector3 position)
    {
        foreach (var obj in m_Pool)
        {
            if (!obj.activeInHierarchy)
            {
                Debug.Log("Activating GameObject " + obj.name + " at " + position);
                obj.transform.position = position;
                obj.SetActive (true);
                return obj;
            }
        }
        Debug.LogError ("Could not grab GameObject from pool, nothing available");
        return null;
    }
    
    public GameObject SpawnObject(Vector3 position, NetworkHash128 assetId)
    {
        return GetFromPool(position);
    }
    
    public void UnSpawnObject(GameObject spawned)
    {
        Debug.Log ("Re-pooling GameObject " + spawned.name);
        spawned.SetActive (false);
    }
}

Untuk menggunakan manajer ini, buat GameObject kosong baru dan nama "SpawnManager". Buat skrip baru yang disebut SpawnManager,copy dalam sampel kode di atas, dan tempelkan ke * Baru SpawnManager GameObject. Selanjutnya, tarik prefab yang ingin Anda spawn beberapa kali ke lini Prefab field, dan atur Object Pool Size (default adalah 5).

Akhirnya, mendirikan referensi ke SpawnManager di script yang Anda gunakan untuk gerakan pemain:


SpawnManager spawnManager;

void Start()
{
    spawnManager = GameObject.Find("SpawnManager").GetComponent<SpawnManager> ();
}

Logika pemain Anda mungkin mengandung sesuatu seperti ini, yang bergerak dan koin kebakaran:


void Update()
{
    if (!isLocalPlayer)
        return;
    
    var x = Input.GetAxis("Horizontal")*0.1f;
    var z = Input.GetAxis("Vertical")*0.1f;
    
    transform.Translate(x, 0, z);

    if (Input.GetKeyDown(KeyCode.Space))
    {
        // Command function is called on the client, but invoked on the server
        CmdFire();
    }
}

Dalam logika kebakaran pada pemain, gunakan kolam GameObject:


[Command]
void CmdFire()
{
    // Set up coin on server
    var coin = spawnManager.GetFromPool(transform.position + transform.forward);  
    coin.GetComponent<Rigidbody>().velocity = transform.forward*4;
    
    // spawn coin on client, custom spawn handler is called
    NetworkServer.Spawn(coin, spawnManager.assetId);
    
    // when the coin is destroyed on the server, it is automatically destroyed on clients
    StartCoroutine (Destroy (coin, 2.0f));
}

public IEnumerator Destroy(GameObject go, float timer)
{
    yield return new WaitForSeconds (timer);
    spawnManager.UnSpawnObject(go);
    NetworkServer.UnSpawn(go);
}

Perusakan otomatis menunjukkan bagaimana GameObjects dikembalikan ke kolam renang dan digunakan kembali ketika Anda menyala lagi.

Bookmark the permalink.
Network Authority