編輯:關於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,表示只同步一次,就是添加速度就行了。
好了現在已經可以連上局域網,單獨控制並且發射子彈了,還有的內容我將會在接下來的博客中進行講解。
本博客用作新手學習討論,如有不好或錯誤的地方也請指出來,謝謝。
有時候我們添加的一些資源,如圖片和一些沒用的代碼,以及在添加第三方庫的時候我們只需要使用其中的一部分功能和一部分資源,那麼這個時候如果靠我們手工去怕是非常難做的,尤其是
導語首先,看一下效果可能各位在別處看到過類似的東西,我在微信的文章末尾看到有個玩意,感覺有意思,就用代碼實現一下。這篇文章主要把握寫代碼的思路展示一下。看到上圖,我想各位
也許各位魅藍Note 3的機友們都有過這樣的遭遇,發現在使用文件管理器的時候修改不了外置卡的文件,這個情況其實是安卓系統的一個安全機制,當然對於喜歡倒騰的機
最近需要實現一個城市列表的快速索引功能。類似於聯系人應用,根據姓名首字母快速索引功能。 要實現這個功能只需要解決兩個問題: 1、對列表進行分組(具有同一特征