国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Unity3D的多人在線游戲案例設(shè)計(jì)與實(shí)現(xiàn)

2022-01-08 08:58章國(guó)雁
關(guān)鍵詞:子彈引擎外星人

章國(guó)雁

(安徽工商職業(yè)學(xué)院,安徽 合肥 231131)

目前,國(guó)內(nèi)外許多學(xué)者對(duì)于利用游戲引擎進(jìn)行網(wǎng)絡(luò)游戲開發(fā)進(jìn)行了大量的研究,如劉賢梅等利用Unity引擎為平臺(tái),采用 MVC 架構(gòu)實(shí)現(xiàn)了一款A(yù)RPG類型多人在線游戲;李偉在Unity3D的基礎(chǔ)上與網(wǎng)絡(luò)通信原理相結(jié)合,采用預(yù)測(cè)式位置同步的方式減少網(wǎng)絡(luò)延時(shí)帶來的誤差;干建松基于Unity引擎的Unet模塊實(shí)現(xiàn)了局域網(wǎng)的多人聯(lián)網(wǎng)游戲功能;吳晶晶等基于Unity3D引擎結(jié)合協(xié)同程序技術(shù)實(shí)現(xiàn)預(yù)先式同步數(shù)據(jù)讀取,實(shí)現(xiàn)了一款MMORPG類型的網(wǎng)絡(luò)游戲;薛玉倩介紹了基于Unity3D的網(wǎng)絡(luò)游戲總體設(shè)計(jì)與實(shí)現(xiàn)程序。以上學(xué)者研究,對(duì)于網(wǎng)絡(luò)游戲的開發(fā)技術(shù)起到了積極的推動(dòng)作用。本文在前人的研究基礎(chǔ)上實(shí)現(xiàn)了一款多人在線游戲開發(fā)案例。

1 案例開發(fā)平臺(tái)

本案例以Unity3D游戲引擎為開發(fā)平臺(tái),實(shí)現(xiàn)一款局域網(wǎng)多人聯(lián)網(wǎng)游戲,包含服務(wù)端和客戶端。網(wǎng)絡(luò)功能使用游戲引擎內(nèi)置的Unet系統(tǒng)進(jìn)行開發(fā),該系統(tǒng)提供了NetworkManager網(wǎng)絡(luò)管理組件進(jìn)行服務(wù)端和客戶端的創(chuàng)建,NetworkIdentity網(wǎng)絡(luò)標(biāo)識(shí)組件進(jìn)行網(wǎng)絡(luò)中每個(gè)物體的標(biāo)識(shí),NetworkTransform網(wǎng)絡(luò)傳輸組件進(jìn)行網(wǎng)絡(luò)同步等。

2 游戲設(shè)計(jì)與實(shí)現(xiàn)

2.1 資源導(dǎo)入和創(chuàng)建預(yù)制體

導(dǎo)入案例資源圖片到Unity3D引擎,修改圖片類型為精靈Sprite,添加剛體組件Rigidbody2D和盒形碰撞器組件BoxCollider2D等,添加完成后創(chuàng)建為預(yù)制體。

2.2 游戲聯(lián)網(wǎng)和網(wǎng)絡(luò)同步

網(wǎng)絡(luò)游戲涉及到服務(wù)端和客戶端的創(chuàng)建、網(wǎng)絡(luò)地址和端口號(hào)、網(wǎng)絡(luò)中各類物體包括玩家的標(biāo)識(shí)、網(wǎng)絡(luò)同步等問題。案例采用Unet系統(tǒng)的NetworkManager組件進(jìn)行游戲網(wǎng)絡(luò)的管理,網(wǎng)絡(luò)地址設(shè)置為localhost(本機(jī)),端口號(hào)為7777;在出生信息SpawnInfo一欄,注冊(cè)客戶端玩家、外星人、子彈等網(wǎng)絡(luò)游戲中需要進(jìn)行實(shí)例化生成的物體。NetworkManagerHUD組件進(jìn)行游戲服務(wù)端和客戶端創(chuàng)建的UI界面顯示。對(duì)網(wǎng)絡(luò)游戲中的物體添加NetworkIdentity組件進(jìn)行網(wǎng)絡(luò)唯一標(biāo)識(shí)和添加NetworkTransform組件進(jìn)行網(wǎng)絡(luò)同步。

3 游戲算法及實(shí)現(xiàn)

3.1 創(chuàng)建外星人矩陣

游戲初始界面需要生成3行10列的外星人矩陣,同時(shí)矩陣保持左右水平移動(dòng),每次到達(dá)水平邊界時(shí),向下移動(dòng)一個(gè)距離。程序設(shè)計(jì)思路為,通過定義一個(gè)動(dòng)態(tài)數(shù)組來存儲(chǔ)外星人矩陣數(shù)據(jù),循環(huán)語(yǔ)句生成外星人數(shù)據(jù)后存入動(dòng)態(tài)數(shù)組。以生成第一行的外星人為例,其核心代碼如下:

public GameObject alien1Prefab;//第一種外星人預(yù)制體

public List aliens = new List();//動(dòng)態(tài)數(shù)組,存儲(chǔ)外星人矩陣數(shù)據(jù)

//服務(wù)端啟動(dòng)時(shí)調(diào)用

public override void OnStartServer() {

float startx = -8; //表示在-8這個(gè)列的位置

for (int i = 0; i < 10; i++) {//循環(huán)語(yǔ)句實(shí)現(xiàn)外星人數(shù)據(jù)生成和存儲(chǔ)

CreateAlien(alien1Prefab,startx,12); //在12行的位置生成第一種外星人Alien1

startx += 1.6f; //每次偏移1.6的距離,保證alien圖標(biāo)不重疊

}

}

//創(chuàng)建外星人alien函數(shù)

void CreateAlien(GameObject prefab,float posX,float posY) {

GameObject alien= Instantiate(prefab) as GameObject;//實(shí)例化一個(gè)alien

alien.transform.position = new Vector3(posX, posY, 0f);//指定位置

aliens.Add(alien); //把新生成的alien加入列表

NetworkServer.Spawn(alien); //同步生成到客戶端

}

3.2 玩家控制分離和移動(dòng)同步

在客戶端中,當(dāng)多個(gè)玩家進(jìn)行網(wǎng)絡(luò)游戲時(shí),用戶只能控制當(dāng)前設(shè)備上的玩家,需要對(duì)玩家的控制權(quán)限進(jìn)行分離。當(dāng)玩家移動(dòng)過后,需要保持其他客戶端網(wǎng)絡(luò)同步狀態(tài)。程序思路為通過isLocalPlayer屬性值判斷是否為當(dāng)前玩家,如果不是則不能進(jìn)行控制;當(dāng)前玩家進(jìn)行移動(dòng)操作后,發(fā)送一個(gè)同步命令,其核心代碼如下:

private int oldDx; //之前的玩家位置

void Update () {

if (!isLocalPlayer) return; //是否本地玩家,不是則返回,控制分離

int dx = 0;

if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))

dx -= 1;//向左移動(dòng)一個(gè)位置

if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))

dx += 1; //向右移動(dòng)一個(gè)位置

//當(dāng)原來的值跟最新的值不一致,則說明玩家移動(dòng)

if (dx != oldDx) {

CmdMove(dx); //調(diào)用移動(dòng)函數(shù)

oldDx = dx; }

}

[Command]

void CmdMove(int dx) {//移動(dòng)函數(shù)

if (!alive) return; //如果死亡狀態(tài),則返回

moveX = dx;

GetComponent().SetDirtyBit(1);//發(fā)送同步命令

}

3.3 玩家開火和銷毀外星人

游戲?qū)崟r(shí)監(jiān)控用戶的輸入指令,當(dāng)用戶按下鼠標(biāo)左鍵或者空格鍵時(shí),玩家開火發(fā)射子彈,并在網(wǎng)絡(luò)中進(jìn)行同步。其開火函數(shù)的部分代碼如下:

public GameObject bulletPrefab; //玩家的子彈預(yù)制體

[Command]

private void CmdShoot() {//開火函數(shù)

//實(shí)例化生成單個(gè)子彈物體

GameObject myBullet = (GameObject)Instantiate(bulletPrefab,

transform.position + Vector3.up, Quaternion.identity);

NetworkServer.Spawn(myBullet); //在網(wǎng)絡(luò)中同步生成子彈

}

3.4 外星人攻擊的算法及實(shí)現(xiàn)

由于游戲生成了3行10列的外星人矩陣,為了游戲的可玩性考慮,游戲設(shè)計(jì)時(shí)做了限制,初始狀態(tài)只允許最下面一行的外星人可以發(fā)射子彈,而上面兩行的外星人暫時(shí)不能發(fā)射子彈,當(dāng)下面的外星人被銷毀時(shí)才可以發(fā)動(dòng)攻擊。實(shí)現(xiàn)算法思路為,遍歷外星人動(dòng)態(tài)數(shù)組的每個(gè)元素,尋找跟當(dāng)前元素同一列的下一行外星人,如果能找到,則當(dāng)前元素外星人不能發(fā)射子彈,如果尋找不到,則當(dāng)前外星人為最下面一行,可以發(fā)射子彈。

3.5 子彈的設(shè)置

給子彈物體增加觸發(fā)器組件,程序判斷其他物體進(jìn)入子彈觸發(fā)器范圍時(shí),則銷毀該物體,同時(shí)銷毀子彈自身。以玩家子彈為例,如果進(jìn)入觸發(fā)器的是外星人,則銷毀外星人物體和子彈自身。其觸發(fā)器核心代碼如下:

void OnTriggerEnter2D(Collider2D collider) {//collider指的是碰撞的物體

AlienInvader hitAlien = collider.gameObject.GetComponent();

if (hitAlien != null) {//判斷是否碰撞到了外星人

NetworkServer.Destroy(hitAlien.gameObject);//消除外星人

NetworkServer.Destroy(this.gameObject);//消除子彈自身

}

}

3.6 計(jì)分和游戲UI界面

良好的UI界面有助于提升游戲體驗(yàn),目前業(yè)內(nèi)普遍采用的UI制作工具主要有uGUI和NGUI,其中uGUI是Unity3D引擎內(nèi)置的制作工具,制作方便靈活;NGUI是一款專門用于UI制作的插件,功能強(qiáng)大,但需要單獨(dú)進(jìn)行安裝。本案例采用uGUI系統(tǒng)進(jìn)行UI界面的制作,使用Canvas畫布、Text文本、Image圖像、Button按鈕等控件搭建了游戲的登錄界面和游戲的運(yùn)行界面,登錄界面包含創(chuàng)建主機(jī)UI和連接主機(jī)UI,運(yùn)行界面包含計(jì)分UI和生命值UI。

4 發(fā)布測(cè)試

案例制作完成后,可以發(fā)布到本地PC端進(jìn)行功能測(cè)試,如圖1所示,玩家控制已經(jīng)分離,多個(gè)客戶端保持同步狀態(tài),具備局域網(wǎng)多人在線游戲的聯(lián)網(wǎng)功能,具有較好的可玩性。

圖1 多人在線玩家測(cè)試

5 結(jié)束語(yǔ)

本文分析了一款2D休閑類多人在線游戲的設(shè)計(jì)與實(shí)現(xiàn)過程,該案例以Unity3D游戲引擎為開發(fā)平臺(tái),設(shè)計(jì)及實(shí)現(xiàn)了外星人矩陣的移動(dòng)和射擊算法,使用游戲引擎內(nèi)置的Unet系統(tǒng)實(shí)現(xiàn)了局域網(wǎng)多人聯(lián)網(wǎng)功能,包含服務(wù)端和客戶端。經(jīng)過測(cè)試,游戲畫面延遲小、游戲操作同步性高,具有較好的實(shí)時(shí)性。案例的設(shè)計(jì)思路和實(shí)現(xiàn)過程,對(duì)于網(wǎng)絡(luò)游戲開發(fā)和教學(xué)起到了借鑒作用,可供參考。

猜你喜歡
子彈引擎外星人
江陰市“三個(gè)創(chuàng)新”打造?;钒踩O(jiān)管新引擎
新海珠,新引擎,新活力!
兩顆子彈
車壇往事4:引擎進(jìn)化之屢次失敗的蒸汽機(jī)車
三顆子彈
Karma:讓子彈飛一會(huì)兒
外星人可怕嗎
外星人來了,誰(shuí)當(dāng)翻譯?
One Engine?。蹋澹妫糁皇O乱粋€(gè)引擎
大石桥市| 延吉市| 白沙| 刚察县| 海晏县| 呼伦贝尔市| 文登市| 高碑店市| 汉中市| 平陆县| 荥阳市| 绿春县| 定襄县| 安远县| 江门市| 瑞丽市| 墨玉县| 水富县| 南部县| 枣阳市| 台山市| 会同县| 石渠县| 汝阳县| 辽源市| 千阳县| 祁阳县| 阜平县| 金沙县| 新昌县| 宾阳县| 平遥县| 垫江县| 中阳县| 竹溪县| 东方市| 门源| 饶阳县| 前郭尔| 浮山县| 琼结县|