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 . |
Sistem jaringan memiliki cara untuk melakukan tindakan di jaringan. Jenis tindakan ini kadang-kadang disebut Panggilan Prosedur Jarak Jauh. Ada dua jenis RPC dalam sistem jaringan, Perintah - yang disebut dari klien dan berjalan di server; dan panggilan KlienRpc - yang disebut pada server dan menjalankan klien.
Diagram di bawah ini menunjukkan arah bahwa tindakan jarak jauh mengambil:
Perintah dikirim dari objek pemain pada klien ke objek pemain di server. Untuk keamanan, Perintah hanya dapat dikirim dari player objectObjek 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 ANDA, sehingga Anda tidak dapat mengontrol objek pemain lain. Untuk membuat fungsi menjadi perintah, tambahkan atribut kustom [Command] ke dalamnya, dan tambahkan awalan “Cmd”. Fungsi ini sekarang akan dijalankan pada server ketika disebut pada klien. Setiap argumen akan secara otomatis dilewati ke server dengan perintah.
Fungsi perintah harus memiliki awalan “Cmd”. Ini adalah petunjuk ketika membaca kode yang memanggil perintah - fungsi ini khusus dan tidak terinfeksi lokal seperti fungsi normal.
class Player : NetworkBehaviour
{
public GameObject bulletPrefab;
[Command]
void CmdDoFire(float lifeTime)
{
GameObject bullet = (GameObject)Instantiate(
bulletPrefab,
transform.position + transform.right,
Quaternion.identity);
var bullet2D = bullet.GetComponent<Rigidbody2D>();
bullet2D.velocity = transform.right * bulletSpeed;
Destroy(bullet, lifeTime);
NetworkServer.Spawn(bullet);
}
void Update()
{
if (!isLocalPlayer)
return;
if (Input.GetKeyDown(KeyCode.Space))
{
CmdDoFire(3.0f);
}
}
}
Hati-hati mengirim perintah dari klien setiap bingkai! Hal ini dapat menyebabkan banyak lalu lintas jaringan.
Secara default, Perintah dikirim pada saluran nol - saluran yang dapat diandalkan default. Jadi secara default semua perintah dikirim ke server. Ini dapat disesuaikan dengan parameter "channel" dari atribut kustom [Command]. Parameter ini harus menjadi bilangan bulat, mewakili nomor saluran.
Saluran 1 juga diatur secara default untuk menjadi saluran yang tidak dapat diandalkan, sehingga menggunakan ini, gunakan nilai 1 untuk parameter dalam atribut Command, seperti ini:
[Command(channel=1)]
Mulai dengan rilis Unity 5.2 dimungkinkan untuk mengirim perintah dari benda non-pemain yang memiliki otoritas klien. Objek-objek ini harus ditidur dengan WordPress.org atau memiliki wewenang yang ditetapkan dengan WordPress.org. Perintah yang dikirim dari objek ini dijalankan pada kasus server objek, bukan pada objek pemain yang terkait untuk klien.
Panggilan KlienRpc dikirim dari objek di server ke objek pada klien. Mereka dapat dikirim dari objek server apa pun dengan 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 yang telah ditidur. Karena server memiliki wewenang, maka tidak ada masalah keamanan dengan objek server yang dapat mengirim panggilan ini. Untuk membuat fungsi ke panggilan KlienRpc, tambahkan atribut kustom [ClientRpc] ke dalamnya, dan tambahkan prefix "Rpc". Fungsi ini sekarang akan dijalankan pada klien ketika disebut pada server. Setiap argumen akan secara otomatis dilewatkan kepada klien dengan panggilan KlienRpc.
Fungsi KlienRpc harus memiliki awalan “Rpc”. Ini adalah petunjuk ketika membaca kode yang memanggil metode - fungsi ini khusus dan tidak terinfeksi lokal seperti fungsi normal.
class Player : NetworkBehaviour
{
[SyncVar]
int health;
[ClientRpc]
void RpcDamage(int amount)
{
Debug.Log("Took damage:" + amount);
}
public void TakeDamage(int amount)
{
if (!isServer)
return;
health -= amount;
RpcDamage(amount);
}
}
Ketika menjalankan permainan sebagai tuan rumah dengan panggilan LocalClient, KlienRpc akan diinvoked di LocalClient - meskipun dalam proses yang sama sebagai server. Jadi perilaku LocalClients dan RemoteClients sama untuk panggilan KlienRpc.
argumen yang dilewatkan untuk perintah dan panggilan KlienRpc di serialisasi dan dikirim melalui jaringan. argumen ini dapat:
Argument untuk tindakan jarak jauh tidak dapat subkomponen GameObjects, seperti instance skrip atau Transforms. Mereka tidak bisa menjadi jenis lain yang tidak dapat serialisasi di jaringan.