首先添加兩個(gè)組件
運(yùn)行后我們可以發(fā)現(xiàn)大致的聯(lián)機(jī)已經(jīng)完成
多人聯(lián)機(jī)我們?cè)谕婕矣螒驅(qū)ο笊咸砑觾蓚€(gè)組件酝枢。
玩家移動(dòng)
然后我們?cè)偬砑右粋€(gè)移動(dòng)的腳本涣达,寫入代碼吐葵。
using UnityEngine.Networking;
public class PleyerController : NetworkBehaviour {
// Update is called once per frame
void Update () {
if (isLocalPlayer==false) {//如果不是本地的
return;//不執(zhí)行移動(dòng)的代碼
}
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
transform.Rotate(Vector3.up*h*120*Time.deltaTime);
transform.Translate(-Vector3.forward * v * 3 * Time.deltaTime);
}
最后我們打包出來測(cè)試下污筷,我們把Unity當(dāng)作服務(wù)器和客戶端工闺,把打包出來的當(dāng)做客戶端.我們可以發(fā)現(xiàn)這樣就已經(jīng)連接上了。因?yàn)槎际潜镜豂P所以沒有設(shè)置IP地址瓣蛀。端口號(hào)是系統(tǒng)默認(rèn)的端口7777陆蟆。
區(qū)分?jǐn)澄?/h6>
下面我們?cè)賮砜纯丛趺磪^(qū)分?jǐn)澄?附上代碼
// <summary>
/// 這個(gè)方法區(qū)分?jǐn)澄遥陨硗婕以O(shè)置為藍(lán)色惋增,敵人是白色.
/// </summary>
public override void OnStartLocalPlayer()
{
//這個(gè)方法只會(huì)在本地角色那里調(diào)用,當(dāng)角色被創(chuàng)建的時(shí)候
GetComponent<MeshRenderer>().material.color = Color.blue;
}
發(fā)射子彈
首先我們?cè)谧訌椀念A(yù)制物上加上Network Identity組件,并且將生成的子彈上傳到網(wǎng)絡(luò)上叠殷。
下面我們來讓我們的游戲?qū)ο髶碛猩鋼艄δ埽纯丛趺醋霭善饕福雀缴仙鋼舻拇a溪猿。這個(gè)CmdFire()方法我們?cè)谕婕襊layer預(yù)制物的Update里面調(diào)用
public GameObject BulletPrefab;
public Transform bulletSpawe;
private float BulltSpeed = 2000f;
[Command]//表示雖然客戶端調(diào)用這個(gè)方法,但是運(yùn)行是在服務(wù)端運(yùn)行.
void CmdFire()
{//命名必須Cmd開頭
GameObject bullet = Instantiate(BulletPrefab, bulletSpawe.position, bulletSpawe.rotation);
bullet.GetComponent<Rigidbody>().velocity = -bullet.transform.forward * BulltSpeed * Time.deltaTime;
Destroy(bullet, 2f);
NetworkServer.Spawn(bullet);//生成指定的物體同步到各個(gè)客戶端
}
隨后我們又發(fā)現(xiàn)子彈是同步了钩杰,但是子彈的速度沒有同步過來纫塌,So我們將NetworkTransform組件也加上來,NetworkTransform不僅能同步Transform還能同步Rigibody.
這下我們可以發(fā)現(xiàn)子彈都已經(jīng)同步上了讲弄。
控制UI血量值同步
當(dāng)你添加血量減少受到傷害的方法后你會(huì)發(fā)現(xiàn)服務(wù)端和客戶端的血量值并不是同步的措左,那么是為什么呢,這是因?yàn)榉?wù)器端在發(fā)射子彈后敵人的血量在減少同時(shí)子彈也被銷毀了避除,那么客戶端就有可能無法同時(shí)受到傷害因?yàn)樵诜?wù)器端子彈已經(jīng)被銷毀了怎披,那么我們?nèi)绾稳?shí)現(xiàn)同步能胸嘁,這里我們只能讓子彈傷害在服務(wù)端去運(yùn)行然后在同步到所有的客戶端。下面我們附上代碼.將這個(gè)血量的腳本掛載在Player游戲?qū)ο笊?
using UnityEngine.Networking;
public class Health : NetworkBehaviour {
public Slider HealthSlider;
public const int MaxHealth = 100;
[SyncVar (hook ="OnChangeHealth")]//同步變量凉逛,表示這個(gè)變量同步到各個(gè)客戶端
public int curentllealth = MaxHealth;
//血量減少的方法性宏,受到傷害
public void TakeDamage(int damage) {
if (isServer == false) return;//血量的處理只在服務(wù)器端執(zhí)行
curentllealth -= damage;
if (curentllealth<=0) {
curentllealth = 0;
Debug.Log("Death");
}
}
void OnChangeHealth(int health) {
HealthSlider.value = health / (float)MaxHealth;
}
}
然后我們?cè)趧?chuàng)建一個(gè)腳本這個(gè)腳本掛載在我們的子彈上,里面寫入它的碰撞方法状飞。
public class Bullet : MonoBehaviour {
private void OnCollisionEnter(Collision collision)
{
if (collision.transform.tag=="Player") {
GameObject hit = collision.gameObject;
Health health = hit.GetComponent<Health>();
if(health!=null){
health.TakeDamage(20);
}
Destroy(this.gameObject);
}
}
}
這樣我們就同步了血量傷害的減少
重生到隨機(jī)的某幾個(gè)位置
首先我們先隨便創(chuàng)建一個(gè)位置點(diǎn)空物體毫胜。在其上面添加組件Network Start Position。這個(gè)是在服務(wù)器開始的時(shí)候指定一個(gè)位置诬辈,然后我們?cè)诙鄤?chuàng)建一個(gè)位置同意添加這個(gè)組件酵使。讓我們的玩家在這兩個(gè)位置隨機(jī)生成。
然后我們將Player Spawn Met的參數(shù)設(shè)置為Round Robin指輪流在這兩個(gè)位置轉(zhuǎn)換.
private NetworkStartPosition[] SpawnPosition;
void Start() {
if (isLocalPlayer) {
SpawnPosition = FindObjectsOfType<NetworkStartPosition>();
}
}
//重生
[ClientRpc]//客戶端遠(yuǎn)程調(diào)用
void Rpcespawn() {//命名必須Rpc開頭
if (isLocalPlayer==false) {
return;
}
Vector3 spawnposition = Vector3.zero;
if (SpawnPosition!=null&& SpawnPosition.Length>0) {
spawnposition = SpawnPosition[Random.Range(0, SpawnPosition.Length)].transform.position;
}
transform.position = spawnposition;
}
然后我們將重生的方法調(diào)用到血量小于等于0的時(shí)候
敵人的隨機(jī)生成
using UnityEngine.Networking;
public class EnumSpwen : NetworkBehaviour {
public GameObject Onemyprefab;
public int numberOfEnemies;
//會(huì)在服務(wù)器啟動(dòng)的時(shí)候調(diào)用
public override void OnStartServer()
{
for (int i=0;i< numberOfEnemies;i++) {
Vector3 position = new Vector3(Random.Range(-6f, 6f), 0f,Random.Range(-6f,6f));
Quaternion rotation = Quaternion.Euler(0, Random.Range(0, 360), 0);
GameObject enemy = Instantiate(Onemyprefab,position,rotation);
NetworkServer.Spawn(enemy);
}
}