Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Unity3D UNET 模仿局域網游戲

Unity3D UNET 模仿局域網游戲

編輯:關於Android編程

這兩天在學習的過程中,發現一個講Unity的unet組件的好教程,在這裡分享給大家。

新建一個 UnetProject。

新建一個GameObject重命名為Network Manager,給它添加Network Manager組件,這是Unet提供的一個核心管理組件,可以在腳本裡訪問Network Manager進行網絡開發。

還需要添加一個 Network Manager HUD 組件,這個用來顯示UI,UI上的按鈕會跟Network Manager交互。這時候運行屏幕上會出現如下:

 

這裡寫圖片描述

 

LAN Host(H):把本機作為Server + Client,即服務端加客戶端

LAN Client(C):與服務器連接,後面填ip地址(localhost就是本機)

LAN Server Only(S):本機只作為服務端

一般在測試時才會用這個組件。

現在用unity自帶的模型拼裝一個Player出來(隨便就行),給他添加Network Identity 組件,這是一個網絡標識符,擁有標識符的物體可以在網絡上生成,也就是同步到其他客戶端。

 

這裡寫圖片描述

 

標注的地方:Server Only:只會在服務器端時才有權限對他進行操作

Local Player Authority: 會在客戶端時有權限,是一個局部角色

我們給Player選中Local Player Authority,表示運行時連接上服務端我們也可以對他進行操作。

為了讓他能在局域網生成,

這裡寫圖片描述

 

這表示我們要生成的角色是哪個,這樣在每次聯機時Network Manager會自動根據Player Prefab 創建一個角色。

Auto Create Player : 每次服務器,客戶端連接都會創建一個Player

現在運行看見的效果不明顯,我們先把控制角色做了,在運行,效果明顯。

新建PlayerController腳本並編輯:

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

//為了能讓腳本在連上局域網的同時還能分別控制物體,所以要繼承 NetworkBehaviour
public class PlayerController : NetworkBehaviour {
    public float traSpeed = 3;  //移動的速度
    public float rotSpeed = 120;  //一秒旋轉的角度

    // Update is called once per frame
    void Update () {

        // isLocalPlayer 是 NetworkBehaviour 的內置屬性
        if (!isLocalPlayer)    //如果不是本地客戶端,就返回,不執行下面的操作
        {
            return;
        }
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        transform.Translate(Vector3.forward * v * traSpeed * Time.deltaTime);   //朝某個方向移動
        transform.Rotate(Vector3.up * h * rotSpeed * Time.deltaTime);  //圍繞某軸旋轉
    }
}

這裡還需要給Player添加一個Network Transform組件才行,這是一個同步Transform的組件,包括:position、rotation、scale。它的同步是單向的,就是將你控制的物體同步到其他客戶端,當你在服務端改變該物體時,客戶端不會跟著改變。

按Ctrl+B打包工程,選好路徑後,以後按Ctrl+B會自動打包,現在把打包後的程序和unity都運行起來,畢竟是聯機,肯定要有兩個才能看出效果,我默認是unity作為服務端+客戶端,打包後的程序作為單純的客戶端。下面是效果圖:

 

這裡寫圖片描述

 

這裡運行是沒有問題的。但是兩個角色看起來一樣,無法區分,現在來區分一下。編輯腳本:

    //這是重寫 NetworkBehaviour 內的方法
    //這個方法只會在創建本地角色時調用
    public override void OnStartLocalPlayer()
    {
        GetComponent().material.color = Color.blue;
    }

這裡還需要給Player添加一個Network Transform組件才行,這是一個同步Transform的組件,包括:position、rotation、scale。它的同步是單向的,就是將你控制的物體同步到其他客戶端,當你在服務端改變該物體時,客戶端不會跟著改變。

按Ctrl+B打包工程,選好路徑後,以後按Ctrl+B會自動打包,現在把打包後的程序和unity都運行起來,畢竟是聯機,肯定要有兩個才能看出效果,我默認是unity作為服務端+客戶端,打包後的程序作為單純的客戶端。下面是效果圖:

 

這裡寫圖片描述

 

這裡運行是沒有問題的。但是兩個角色看起來一樣,無法區分,現在來區分一下。編輯腳本:

    //類下添加
    public GameObject bulletPre;   //子彈的prefab
    public Transform bulletTrans;  //生成子彈的位置
    //update方法中添加
    if (Input.GetKeyDown(KeyCode.Space))
        {
            Fire();
        }
   //添加一個方法
     void Fire ()
    {
        GameObject bullet = Instantiate(bulletPre, bulletTrans.position, Quaternion.identity) as GameObject;
        bullet.GetComponent().velocity = transform.forward * 10;
        Destroy(bullet, 2);   //2秒後銷毀子彈
    }

現在子彈也能射擊了,只不過不同步,現在我們讓他同步。聯機游戲會把所有的功能處理都放到Server上處理,例如敵人的生成,游戲邏輯的判斷,所以這裡的子彈我們也讓他在Server上生成,然後同步到客戶端。給子彈添加Network Identity組件,然後修改Network Manager

這裡寫圖片描述

 

修改 PlayerController腳本:

[Command]    //在客戶端調用,但是在服務端運行,這是方法必須以 Cmd 開頭
    void CmdFire()
    {
        GameObject bullet = Instantiate(bulletPre, bulletTrans.position, Quaternion.identity) as GameObject;
        bullet.GetComponent().velocity = transform.forward * 10;
        Destroy(bullet, 2);   //2秒後銷毀子彈

        NetworkServer.Spawn(bullet);    //在所有客戶端都生成一個物體
    }

注意:調用的哪裡也改成CmdFire。。在給子彈添加Network Transform組件,Transform Sync Mod對應Sync Rigidbody 3D,這是同步剛體組件,Network Send Rate 改為0,表示只同步一次,就是添加速度就行了。
好了現在已經可以連上局域網,單獨控制並且發射子彈了,還有的內容我將會在接下來的博客中進行講解。
本博客用作新手學習討論,如有不好或錯誤的地方也請指出來,謝謝。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved