基于Unity3d的多人合作游戲開發(fā)_第1頁
基于Unity3d的多人合作游戲開發(fā)_第2頁
基于Unity3d的多人合作游戲開發(fā)_第3頁
基于Unity3d的多人合作游戲開發(fā)_第4頁
基于Unity3d的多人合作游戲開發(fā)_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

摘要近幾年來,隨著科技的發(fā)展,計(jì)算機(jī)的配置越來越好,游戲行業(yè)也因?yàn)檫@一浪潮蓬勃發(fā)展。在社會(huì)的各種壓力下,許多人都選擇在下班時(shí)間與朋友一起玩游戲。在這一條件下促使了多人合作游戲的火熱,這類游戲易上手,音樂節(jié)奏較為歡快。并且強(qiáng)調(diào)人們之間的溝通協(xié)作能力,在輕松慢節(jié)奏的游戲過程中增進(jìn)彼此之間的友情。多人合作游戲經(jīng)過長(zhǎng)時(shí)間的發(fā)展變得多種多樣,但總的來說均使玩家得到了輕松愉快的游戲體驗(yàn)。選擇了Unity3D進(jìn)行開發(fā)主要是開發(fā)易上手,開發(fā)界面交互較為友好,能夠較為便捷的實(shí)現(xiàn)所需功能,并且支持為多個(gè)平臺(tái)生成可執(zhí)行文件,在Windows或者其他任何平臺(tái)上啟動(dòng)它而無需任何額外的努力。并且開發(fā)者可以在Unity3D中的AssetsStore里購買到正版素材,無需為游戲素材擔(dān)心。本文主要包括了此游戲的開發(fā)方式以及開發(fā)的原理,游戲場(chǎng)景關(guān)卡的設(shè)計(jì)和游戲的聯(lián)網(wǎng)功能測(cè)試等步驟。希望能夠?yàn)楹罄m(xù)同類多人游戲制作者提供參考和借鑒。關(guān)鍵詞:Unity3D多人游戲聯(lián)網(wǎng)游戲

AbstractInrecentyears,withthedevelopmentofscienceandtechnology,theconfigurationofcomputersisgettingbetterandbetter,andthegameindustryisboomingbecauseofthiswave.Underallkindsofsocialpressures,manypeoplechoosetoplaygameswithfriendsduringoffhours.Underthiscondition,thepopularityofmultiplayercooperativegamesispromoted.Suchgamesareeasytoplay,andthemusicrhythmisrelativelyhappy.Andemphasizetheabilityofcommunicationandcooperationbetweenpeople,andenhancethefriendshipbetweenthemintheprocessofrelaxedandslow-pacedgame.Afteralongtimeofdevelopment,multiplayercooperativegameshavebecomediversified,butingeneral,theymaketheplayershavearelaxedandpleasantexperience. Unity3dischosenfordevelopment,whichiseasytostartwith,friendlytodevelopinterface,convenienttorealizerequiredfunctions,andsupportsgeneratingexecutablefilesformultipleplatforms,enablingitonwindowsoranyotherplatformwithoutanyextraeffort.Anddeveloperscanbuyauthenticmaterialsintheassetsstoreofunity3dwithoutworryingaboutgamematerials. Thisarticlemainlyincludesthedevelopmentmodeandprincipleofthegame,thedesignofgamescenelevelandthenetworkingfunctiontestofthegame.Hopetobeabletoprovidereferenceandreferenceforthefollowingsimilarmultiplayergamemakers.Keywords:Unity3DMultiplayergameNetworkinggames

目錄第一章 緒論 緒論

選題的目的和意義近些年以來,隨著計(jì)算機(jī)和通信領(lǐng)域的不斷發(fā)展,網(wǎng)絡(luò)帶寬的配置也變得越來越好,因此網(wǎng)絡(luò)游戲也隨著更快的網(wǎng)絡(luò),更低的網(wǎng)絡(luò)延遲而走進(jìn)千家萬戶。網(wǎng)絡(luò)游戲也因?yàn)橛布枨筝^為大眾化,不需要特別好的電腦配置而廣受電腦游戲玩家喜愛。其中多人合作網(wǎng)絡(luò)游戲不僅配置的需求較低,玩法也更趨向于簡(jiǎn)單化,比一般的網(wǎng)絡(luò)游戲更適合各個(gè)年齡段的玩家而廣受追捧。此類游戲易上手,節(jié)拍也很歡快輕松。當(dāng)然,玩家間的溝通和協(xié)作能力也是玩這類游戲不可缺少的,在輕松愉悅的游戲過程中,彼此之間的友情也得到了增進(jìn)。選擇了Unity3D進(jìn)行開發(fā)主要是開發(fā)易上手,軟件的交互做的比較友好,能夠較為便捷的實(shí)現(xiàn)所需功能,并且支持為多個(gè)平臺(tái)生成可執(zhí)行文件,在Windows或者其他任何平臺(tái)上啟動(dòng)它而無需任何額外的努力。并且用戶可以在Unity3D中的AssetsStore里購買到正版素材,無需為游戲素材擔(dān)心。通過設(shè)計(jì)和游玩多人合作游戲,讓我切身體會(huì)到游戲的趣味性和游戲拉近了玩家之間的距離,增進(jìn)了感情又可以讓玩家得到身心上的放松,拉近朋友之間的距離,讓人保持身心愉悅。本項(xiàng)目使用Unity3D開發(fā)和設(shè)計(jì),探究如何設(shè)計(jì)開發(fā)一個(gè)多人游戲并實(shí)現(xiàn)多人聯(lián)機(jī)功能是本次實(shí)驗(yàn)的主要目的。國內(nèi)外研究現(xiàn)狀近年來,隨著Unity3D引擎的快速推廣,越來越多的游戲廠商開始使用Unity引擎進(jìn)行游戲開發(fā),多人合作游戲在國外也發(fā)展迅速。其中由GhostTown工作室使用Unity3D引擎開發(fā)的多人合作游戲《Overcooked》在2016年獲得了TGA最佳多人游戲提名,證明多人游戲在玩家間的受歡迎程度之高。隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,網(wǎng)絡(luò)游戲的玩家越來越多。網(wǎng)絡(luò)游戲發(fā)展迅速,是當(dāng)前游戲產(chǎn)業(yè)中規(guī)模最大的一類。國內(nèi)首款自主研發(fā)的3D游戲始于2003年,到目前為止,國內(nèi)在3D游戲方面已經(jīng)有了很多的研究,不過考慮到3D游戲開發(fā)的復(fù)雜性和經(jīng)濟(jì)效益,國內(nèi)擁有自主研發(fā)的3D游戲引擎的互聯(lián)網(wǎng)公司屈指可數(shù),中小型公司更多還是使用國外相較成熟的游戲工具。多人網(wǎng)絡(luò)游戲的聯(lián)機(jī)效果關(guān)乎到游戲過程的流暢性,游戲中的元素實(shí)時(shí)更新決定了游戲過程的流暢程度。是否使用更好的網(wǎng)絡(luò)服務(wù)器以及優(yōu)化較好的服務(wù)器引擎決定了玩家的游玩體驗(yàn)。國內(nèi)的各大公司中,網(wǎng)易,騰訊等知名公司的聯(lián)機(jī)游戲體驗(yàn)較好,但一般游戲開發(fā)商想要重新開發(fā)一個(gè)流暢的服務(wù)器引擎是不經(jīng)濟(jì)的,對(duì)于一般的開發(fā)者來說,熟悉并掌握Unity3D游戲引擎和第三方的服務(wù)器引擎可以降低游戲開發(fā)周期。論文組織架構(gòu)論文從構(gòu)思到實(shí)踐查閱了大量的游戲開發(fā)手冊(cè)以及專業(yè)的開發(fā)資料,進(jìn)行了一個(gè)多人合作聯(lián)網(wǎng)游戲的設(shè)計(jì)制作。其中具體介紹了游戲的設(shè)計(jì)思路以及制作步驟,包括游戲各部分的設(shè)計(jì),部分代碼的編寫,以及將游戲部署在網(wǎng)絡(luò)上并傳輸信息三個(gè)部分。論文分為六個(gè)章節(jié),各章節(jié)的內(nèi)容安排為:第一部分:緒論部分。主要內(nèi)容是介紹了該項(xiàng)目設(shè)計(jì)和制作的背景,國內(nèi)外關(guān)于游戲引擎和服務(wù)器引擎的研究現(xiàn)狀和該項(xiàng)目的大致內(nèi)容介紹;第二部分:主要闡述了本項(xiàng)目使用的開發(fā)工具,服務(wù)器引擎以及Unity3D等的大致介紹;第三部分:詳細(xì)介紹游戲的設(shè)計(jì)思路以及實(shí)現(xiàn)的各個(gè)步驟;第四部分:游戲界面的UI設(shè)計(jì);第五部分:運(yùn)行游戲測(cè)試界面,打包封裝;第六部分:總結(jié)項(xiàng)目的不足和缺陷以及改進(jìn)的方向。

游戲開發(fā)工具

Unity3D游戲引擎Unity3D軟件介紹Unity3D是由UnityTechnologies開發(fā)的一個(gè)讓玩家輕松創(chuàng)建諸如三維視頻游戲、建筑可視化、實(shí)時(shí)三維動(dòng)畫等類型互動(dòng)內(nèi)容的多平臺(tái)的綜合型游戲開發(fā)工具,是一個(gè)全面整合的專業(yè)游戲引擎。從通用性上考慮,Unity3D是目前使用范圍最廣的引擎。它可以在多個(gè)平臺(tái)上進(jìn)行開發(fā),并可以較為方便地將項(xiàng)目配置在PC,手機(jī)等各個(gè)平臺(tái),其對(duì)于個(gè)人版免費(fèi)的策略也非常適合游戲初學(xué)者上手。并且Unity3D支持C#,javascript等多種語言編程,操作界面也較為簡(jiǎn)單,易上手,包括project,hierarchy,inspector,scene,game等視圖,分別用來存放游戲素材和資源,編輯游戲場(chǎng)景并放置游戲?qū)ο?,描述并配置游戲腳本和素材信息,存放模型資源以及觀察游戲?qū)嶋H運(yùn)行效果。在游戲素材方面,Unity擁有AssestStore素材商店,支持.fbx,.dae,.3ds,.dxf,.obj等通用模型格式,不必?fù)?dān)心游戲素材的問題。Unity3D引擎常用函數(shù)使用Unity3D引擎制作游戲時(shí),需要經(jīng)常用到幾個(gè)生命周期函數(shù):Awake():初始化函數(shù),在游戲開始的時(shí)候自動(dòng)進(jìn)行調(diào)用,只會(huì)調(diào)用一次。Start():初始化函數(shù),在Awake函數(shù)和Update函數(shù)之間調(diào)用。只調(diào)用一次。用于賦予變量初始值。Update():每一幀都會(huì)調(diào)用一次,受游戲的幀率影響。一般用于游戲內(nèi)的數(shù)值監(jiān)測(cè)。FixedUpdate():每隔一定的時(shí)間調(diào)用并且不受幀率影響。常用于物理引擎的調(diào)用,以及需要固定時(shí)間更新的函數(shù)。OnTriggerEnter():當(dāng)配置了碰撞體的物體進(jìn)入擁有此函數(shù)的物體之后,執(zhí)行函數(shù)里的內(nèi)容一次,用于判定角色是否觸碰目標(biāo)物體的判定。OnTriggerStay():當(dāng)函數(shù)識(shí)別的碰撞體進(jìn)入掛有該函數(shù)的物體后,不斷執(zhí)行函數(shù)內(nèi)的內(nèi)容,用于拾取物品等用途。Invoke():延時(shí)執(zhí)行函數(shù),在UI設(shè)置的界面的開啟或者關(guān)閉或者是自身腳本的執(zhí)行上使用。SendMessage():向該腳本所在的物體呼叫函數(shù),一般用于傳送消息。GUI(圖形用戶界面)GUI即GraphicalUserInterface(圖形用戶界面)的簡(jiǎn)稱,泛指用戶的操作界面。本文主要使用了UGUI對(duì)游戲的界面進(jìn)行開發(fā),UGUI就是Unity的GUI系統(tǒng),在此前廣泛使用的UI系統(tǒng)為NGUI,是UGUI出現(xiàn)之前非官方制作的GUI插件。作為一個(gè)非官方插件雖然讓UI開發(fā)工作變得簡(jiǎn)單,但相比UGUI系統(tǒng)的Image可以使用material,不需要綁定Colliders便可以自動(dòng)攔截事件,在Navigation在Scene中可視化等功能,其易用性是沒法比的。UGUI是Unity3D原生支持的UI方案,使用上比NGUI插件更加的人性化。。3DsMax軟件3DStudioMax常常簡(jiǎn)稱為3DMax或3DsMax,由Discreet公司開發(fā)制作。前身為DOS系統(tǒng)上的3DStudio系列軟件。因?yàn)榭梢园惭b更多插件,使用者多便于交流,上手容易,并且擁有強(qiáng)大的角色動(dòng)畫制作能力而廣泛應(yīng)用于三維動(dòng)畫,工業(yè)設(shè)計(jì),建筑設(shè)計(jì),游戲等領(lǐng)域的建模。 在本項(xiàng)目中3DsMax軟件因?yàn)榻P枰ㄙM(fèi)很多的時(shí)間與精力,所以并不會(huì)將軟件用于建模功能,而是用于防止模型出錯(cuò)而下載備用。本項(xiàng)目所采用的建筑與人物模型將從Unity的官方商店AssetStore下載,以降低開發(fā)所需的時(shí)間成本。C#開發(fā)語言C#語言是由Microsoft公司發(fā)布的面向?qū)ο蟮?,基?NETFramework和.NETCore上的高級(jí)程序設(shè)計(jì)語言。C#幾乎集中了所有關(guān)于軟件開發(fā)和軟件工程研究的最新成果:面向?qū)ο蟆㈩愋桶踩?、組件技術(shù)、自動(dòng)內(nèi)存管理、跨平臺(tái)異常處理、版本控制、代碼安全管理等等。根據(jù)以上特點(diǎn),我們?cè)赨nity3D引擎上優(yōu)先考慮使用C#語言進(jìn)行開發(fā)。Photon引擎Photon引擎介紹在以前,制作一個(gè)合格的多人網(wǎng)絡(luò)游戲需要大量的金錢及人力開發(fā)游戲引擎及服務(wù)器,。隨著技術(shù)的進(jìn)步,開始有了成型的游戲引擎,像Unity3D引擎、虛幻引擎等,也因?yàn)殚_發(fā)周期的需要出現(xiàn)了成型的服務(wù)器引擎。如SmartFoxServer、ElectroServer、PhotonServer等。這些成型的游戲服務(wù)器為游戲公司省下大量的開發(fā)費(fèi)用,也讓一些小型公司或獨(dú)立制作團(tuán)隊(duì)有了開發(fā)網(wǎng)絡(luò)游戲的能力,尤其在社群游戲盛行的這個(gè)年代成型的服務(wù)器越來越受歡迎。

Photon是一個(gè)泛用性的ScoketServer套裝軟件,可用于多人在線游戲、聊天室、大廳游戲,同時(shí)支持Windows、Unity3D、iOS、Android等平臺(tái)。服務(wù)端底層由C++語言編寫,客戶端使用C#語言編寫,跨多平臺(tái),擁有免費(fèi)的體驗(yàn)服務(wù)器,并且Photon也是比較早且成熟的與Unity攜手工作的引擎之一。Photon在多人在線共享游戲場(chǎng)景保持平臺(tái)和多玩家(多客戶端)的性能優(yōu)越。

PUN(PhotonUnityNetworking)介紹PhotonUnityNetworking(首字母縮寫PUN)是一個(gè)Unity多人游戲插件包。它提供了身份驗(yàn)證選項(xiàng)、匹配,以及快速、可靠的通過我們的Photon后端實(shí)現(xiàn)的游戲內(nèi)通信。使用PUN不需要搭建服務(wù)器,與Unity3D引擎完美整合,項(xiàng)目可以導(dǎo)出至所有Unity支援的平臺(tái)。根據(jù)以上與Unity完美兼容的特性以及易上手,無需自己維護(hù)服務(wù)器等特點(diǎn),在本項(xiàng)目中采用PUN插件進(jìn)行網(wǎng)絡(luò)部分的配置。

游戲設(shè)計(jì)

場(chǎng)景設(shè)計(jì)游戲總共包括兩個(gè)場(chǎng)景:場(chǎng)景1和場(chǎng)景2,場(chǎng)景1是游戲聯(lián)機(jī)匹配的主頁面,場(chǎng)景2是游戲的主場(chǎng)景。場(chǎng)景2中主要包括以下對(duì)象:地形:包括貨柜,收銀臺(tái)等游戲場(chǎng)景。游戲?qū)ο螅郝?lián)機(jī)中的人物,由腳本在固定位置生成。其他物體:貨籃等障礙物。場(chǎng)景的制作利用Unity3D的官方商店AssetStore尋找適合的場(chǎng)景,在AssetStore的頁面中點(diǎn)擊Import按鈕將所需的場(chǎng)景導(dǎo)入到項(xiàng)目中。并在Scene面板中拖動(dòng)至大致需要的位置,在Inspector面板設(shè)置各物體的具體位置參數(shù)。在Inspector面板中,設(shè)置物體的Transform選項(xiàng)比較重要,Position表示物體在世界坐標(biāo)中的位置,Rotation表示物體模型沿著X,Y,Z軸旋轉(zhuǎn)的角度,Scale表示物體在X,Y,Z軸的縮放。移動(dòng)貨籃,并拼湊相應(yīng)的貨架,修改并重新搭建原場(chǎng)景后,最終產(chǎn)生了適合游戲的場(chǎng)景,如圖3-1所示。圖3-1修改后的游戲場(chǎng)景人物的控制與動(dòng)畫導(dǎo)入人物模型首先要設(shè)計(jì)玩家在游戲中所使用并控制的人物,由于設(shè)計(jì)人物模型的時(shí)間成本較高,所以采用Unity官方商店AssetStore中的人物模型。Unity3D所支持的模型格式有許多種,在前期項(xiàng)目的關(guān)卡設(shè)計(jì)中我已經(jīng)下載并導(dǎo)入項(xiàng)目中。將Project面板中的人物模型直接拖入Project中,調(diào)整原始的大小和旋轉(zhuǎn)角度即可,如圖3-2所示。圖3-2導(dǎo)入后的人物模型人物模型運(yùn)動(dòng)的實(shí)現(xiàn)將人物模型導(dǎo)入后,給人物添加剛體Rigidbody以實(shí)現(xiàn)摩擦力,阻力等物理效果,給人物添加膠囊碰撞體CapsuleCollider,用于與其他碰撞體產(chǎn)生碰撞交互。 添加以上兩個(gè)所需的組件后,需要設(shè)置其參數(shù),Rigidbody的參數(shù)為默認(rèn)即可,CapsuleCollider需要點(diǎn)擊EditCollider更改其大小,以符合人物模型大小產(chǎn)生更合理的碰撞。如圖3-3所示。圖3-3人物模型及剛體的配置接下來給人物模型添加人物的移動(dòng)腳本playerControl.cs,在此腳本中編寫人物的移動(dòng)和旋轉(zhuǎn)函數(shù)。人物的移動(dòng)使用的方法是Rigidbody.MovePosition()函數(shù),人物旋轉(zhuǎn)使用的方法是Rigidbody.MoveRotation()函數(shù)。移動(dòng)和旋轉(zhuǎn)腳本在FixedUpdate()函數(shù)中調(diào)用。 最后,給人物添加運(yùn)動(dòng)時(shí)播放的動(dòng)畫。在Inspector面板中添加Animator組件,并在Project面板中右鍵→Create→AnimationController新建一個(gè)動(dòng)畫控制器,將其拖入Animator組件中的Controller選項(xiàng)中。簡(jiǎn)單配置動(dòng)畫控制器,如圖3-4所示。圖3-4人物動(dòng)畫控制器配置

編輯腳本如下:

using

System;

using

System.Collections;

using

System.Collections.Generic;

using

UnityEngine;

public

class

playerControl

:

MonoBehaviourPun

{

public

float

speed

=

6f;

Vector3

movement;

Animator

anim;

Rigidbody

playerRigidbody;

int

floorMask;

float

camRayLength

=

100f;

private

void

Awake()

{

floorMask

=

LayerMask.GetMask("Floor");

anim

=

GetComponent<Animator>();

playerRigidbody

=

GetComponent<Rigidbody>();

}

private

void

FixedUpdate()

{

float

h

=

Input.GetAxisRaw("Vertical");

float

v

=

-Input.GetAxisRaw("Horizontal");

Move(h,

v);

Turning();

Animating(h,

v);

}

void

Move(float

h,

float

v)

{

movement.Set(h,

0f,

v);//存儲(chǔ)鍵盤輸入

movement

=

movement.normalized

*

speed

*

Time.deltaTime;

playerRigidbody.MovePosition(transform.position

+

movement);

}

void

Turning()

{

Ray

camRay

=

Camera.main.ScreenPointToRay(Input.mousePosition);

RaycastHit

floorHit;

if

(Physics.Raycast(camRay,

out

floorHit,

camRayLength,

floorMask))

{

Vector3

playerToMouse

=

floorHit.point

-

transform.position;

playerToMouse.y

=

0f;

Quaternion

newRotation

=

Quaternion.LookRotation(playerToMouse);

playerRigidbody.MoveRotation(newRotation);

}

}

void

Animating(float

h,

float

v)

{

bool

walking

=

h

!=

0f

||

v

!=

0f;

anim.SetBool("IsWalking",

walking);

}

游戲中的碰撞檢測(cè)游戲需要檢測(cè)人物碰到了什么,并處理碰撞體的信息。首先要在貨架上添加BoxCollider碰撞體并調(diào)整大小用于物理碰撞,人物碰到貨架時(shí)會(huì)停下來,然后添加貨架的tag用于與非貨架物體區(qū)分。 在playerController.cs編輯代碼部分,用OnCollisionStay()函數(shù)檢測(cè)人物模型所碰到的物體,用name儲(chǔ)存物體碰撞體的名字,在人物碰到帶有tag的貨架時(shí),玩家按鍵盤上的E鍵即可獲取貨架上的商品。腳本編輯完畢后,將player設(shè)置為預(yù)制體,在游戲開始時(shí)實(shí)例化。private

void

OnCollisionStay(Collision

collision)

{

string

name

=

;

if

(collision.gameObject.tag

==

"container")

{

if

(Input.GetKeyDown(KeyCode.E))

{

//按e拿取物品

Debug.Log("拿到了

"

+

name);

TaskEventArgs

e

=

new

TaskEventArgs();

e.id

=

name;

e.amount

=

1;

MesManager.Instance.Check(e);

}

}

3.4游戲中的任務(wù)系統(tǒng) 游戲中的任務(wù)內(nèi)容通過XML文件儲(chǔ)存。首先要新建Task.xml文件,編輯任務(wù)內(nèi)容。部分任務(wù)內(nèi)容如下:<Task1>

<taskName>購物清單</taskName>

<caption>蘋果*2,冰棍*3</caption>

<conditionID>蘋果</conditionID>

<conditionTargetAmount>2</conditionTargetAmount>

<conditionID>冰棍</conditionID>

<conditionTargetAmount>3</conditionTargetAmount>

<rewardID>報(bào)酬</rewardID>

<rewardAmount>5</rewardAmount>

</Task1>

<Task2>

<taskName>購物清單</taskName>

<caption>方便面*10,醬油*1</caption>

<conditionID>方便面</conditionID>

<conditionTargetAmount>10</conditionTargetAmount>

<conditionID>醬油</conditionID>

<conditionTargetAmount>1</conditionTargetAmount>

<rewardID>報(bào)酬</rewardID>

<rewardAmount>15</rewardAmount>

</Task2>

首先新建任務(wù)腳本Task.cs,用Task()函數(shù)將taskID所指向的任務(wù)初始化:利用taskID讀取XML中的元素并裝入XElement中,創(chuàng)建IEnumerable可枚舉元素和Ienumerator枚舉器迭代添加任務(wù)要求和任務(wù)報(bào)酬。public

class

Task

:MonoBehaviour

{

public

TaskItem

taskItem;//對(duì)應(yīng)的UI面板

public

string

taskID;//任務(wù)ID

public

string

taskName;//任務(wù)名字

public

string

caption;//任務(wù)描述

public

List<TaskCondition>

taskConditions

=

new

List<TaskCondition>();

public

List<TaskReward>

taskRewards

=

new

List<TaskReward>();

//根據(jù)taskID讀取xml,實(shí)現(xiàn)初始化

public

Task(string

taskID)

{

this.taskID

=

taskID;

XElement

xe

=

TaskManager.Instance.rootElement.Element(taskID);

taskName

=

xe.Element("taskName").Value;

caption

=

xe.Element("caption").Value;

IEnumerable<XElement>

a

=

xe.Elements("conditionID");

IEnumerator<XElement>

b

=

xe.Elements("conditionTargetAmount").GetEnumerator();

IEnumerable<XElement>

c

=

xe.Elements("rewardID");

IEnumerator<XElement>

d

=

xe.Elements("rewardAmount").GetEnumerator();

foreach

(var

s

in

a)

{

b.MoveNext();

TaskCondition

tc

=

new

TaskCondition(s.Value,

0,

int.Parse(b.Current.Value));

taskConditions.Add(tc);

}

foreach

(var

s

in

c)

{

d.MoveNext();

TaskReward

tr

=

new

TaskReward(s.Value,

int.Parse(d.Current.Value));

taskRewards.Add(tr);

}

}

接下來需要更新任務(wù)進(jìn)度,并判斷任務(wù)條件是否滿足。編寫Check()函數(shù)以實(shí)現(xiàn):上文說到,玩家按E鍵即可獲取商品,此時(shí)會(huì)調(diào)用check()函數(shù)。將玩家獲取到的商品名稱e.id傳入函數(shù)中,用for循環(huán)檢測(cè)目前的任務(wù)中是否有目標(biāo)商品,若匹配,則將目標(biāo)商品進(jìn)度+1,并更新任務(wù)進(jìn)度于UI面板中。當(dāng)玩家完成了某一任務(wù)的目標(biāo)進(jìn)度,則調(diào)用FinishTask()提示TaskManger.cs玩家已經(jīng)完成某任務(wù)。public

void

Check(TaskEventArgs

e)

{

TaskCondition

tc;

for

(int

i

=

0;

i

<

taskConditions.Count;

i++)

{

tc

=

taskConditions[i];

if

(tc.id

==

e.id)

{

tc.nowAmount

+=

e.amount;

if(tc.nowAmount

<

0)

tc.nowAmount

=

0;

if

(tc.nowAmount

>=

tc.targetAmount)

tc.isFinish

=

true;

else

tc.isFinish

=

false;

taskItem.Modify(e.id,tc.nowAmount);

}

}

for

(int

i

=

0;

i

<

taskConditions.Count;

i++)

{

if

(!taskConditions[i].isFinish)

{

taskItem.Finish(false);

return;

}

}

taskItem.Finish(true);

e.taskID

=

taskID;

TaskManager.Instance.FinishTask(e);

}

接下來新建TaskManager.cs腳本,用于接收Task.cs的消息并分發(fā)到各個(gè)函數(shù)中。TaskManager類繼承了MonoSingletion類,MonoSingletion類是繼承了MonoBehaviour的單例類。這樣做保證了TaskManager類僅有一個(gè)實(shí)例,并在游戲場(chǎng)景中提供一個(gè)訪問它的全局訪問點(diǎn)??偨Y(jié)游戲中任務(wù)系統(tǒng)的設(shè)計(jì)思路:1.游戲開始時(shí)在初始化腳本GameManager.cs中調(diào)用TaskManager類中的GetTask()函數(shù)初始化所有任務(wù)。2.當(dāng)玩家獲得了目標(biāo)商品,Task類更新任務(wù)進(jìn)度并判斷是否完成任務(wù)。3.若某個(gè)任務(wù)達(dá)成,Task類將信息傳遞到TaskManger類,再由TaskManager進(jìn)行消息分發(fā)。public

class

TaskManager

:

MonoSingletion<TaskManager>

{

public

Dictionary<string,

Task>

dictionary

=

new

Dictionary<string,Task>();//id,task

public

XElement

rootElement;

public

event

EventHandler<TaskEventArgs>

getEvent;//接受任務(wù)時(shí),更新任務(wù)到任務(wù)面板等操作

public

event

EventHandler<TaskEventArgs>

finishEvent;//完成任務(wù)時(shí),提示完成任務(wù)等操作

public

event

EventHandler<TaskEventArgs>

rewardEvent;//得到獎(jiǎng)勵(lì)時(shí),顯示獲取的物品等操作

public

event

EventHandler<TaskEventArgs>

cancelEvent;//取消任務(wù)時(shí),顯示提示信息等操作

void

Start()

{

MesManager.Instance.checkEvent

+=

CheckTask;

rootElement

=

XElement.Load(Application.dataPath

+

"/TestTask/Task.xml");//得到Task文件

}

public

void

GetTask(string

taskID)

{

if

(!dictionary.ContainsKey(taskID))

{

Task

t

=

new

Task(taskID);

dictionary.Add(taskID,

t);

TaskEventArgs

e

=

new

TaskEventArgs();

e.taskID

=

taskID;

getEvent(this,

e);

}

}

public

void

CheckTask(System.Object

sender,

TaskEventArgs

e)

{

foreach

(KeyValuePair<string,

Task>

kv

in

dictionary)

{

kv.Value.Check(e);

}

}

public

void

GetReward(TaskEventArgs

e)

{

if

(dictionary.ContainsKey(e.taskID))

{

Task

t

=

dictionary[e.taskID];

for

(int

i

=

0;

i

<

t.taskRewards.Count;

i++)

{

TaskEventArgs

a

=

new

TaskEventArgs();

a.id

=

t.taskRewards[i].id;

a.amount

=

t.taskRewards[i].amount;

a.taskID

=

e.taskID;

rewardEvent(this,a);

}

}

dictionary.Remove(e.taskID);

3.5添加游戲背景音樂 預(yù)先準(zhǔn)備好游戲背景音樂的音頻文件并導(dǎo)入項(xiàng)目中,在hierarchy面板右鍵→CreateEmpty新建空物體,命名為GameManager,用于添加游戲中的各種控制腳本。然后新建BgmController.cs腳本,通過UI中的Slider組件控制音量大小。public

AudioClip

music;

private

AudioSource

back;

public

Slider

slider;

void

Start

()

{

back

=

this.GetComponent<AudioSource>();

back.loop

=

true;

//設(shè)置循環(huán)播放

back.volume

=

0.5f;//設(shè)置音量最大,區(qū)間在0-1之間

back.clip

=

music;

back.Play();

//播放背景音樂

}

void

Update()

{

back.volume

=

slider.value;

}

游戲UI界面設(shè)計(jì)

菜單界面新建場(chǎng)景1菜單界面。菜單界面包括主菜單圖片以及開始游戲,退出游戲按鈕點(diǎn)擊按鈕,UI界面均使用Unity3D官方插件UGUI制作。

菜單界面功能開始游戲按鈕:當(dāng)鼠標(biāo)點(diǎn)擊該按鈕,即跳轉(zhuǎn)到場(chǎng)景2游戲主場(chǎng)景。 退出游戲按鈕:點(diǎn)擊按鈕即可關(guān)閉游戲程序。 背景圖片:裝飾菜單界面。圖4-1游戲開始菜單界面

菜單界面制作在project面板中點(diǎn)擊右鍵→newScene新建場(chǎng)景,命名為StartGame。雙擊打開新建的場(chǎng)景,在hierarchy面板中右鍵→UI→Canvas新建畫布,用于裝載UI組件。在Canvas下新建兩個(gè)Button組件,命名為ConnectButton和ExitButton,功能分別為開始游戲和結(jié)束游戲,再新建一個(gè)Image組件,用于顯示背景圖片。 將游戲菜單的背景圖片導(dǎo)入項(xiàng)目中,在Project面板找到背景圖,并在Inspector面板將其TextureType選項(xiàng)更改為游戲中支持的Sprite圖,即可在UI中使用。 由于場(chǎng)景并不復(fù)雜,故載入場(chǎng)景時(shí)用Application.LoadLevel()函數(shù)載入場(chǎng)景。最終效果如圖4-3所示。public

override

void

OnJoinedRoom()

{

Application.LoadLevel("_Demo");

}

public

void

ExitGame()

{

Application.Quit();

}

圖4-3游戲主菜單界面游戲界面UI制作游戲模式采用了倒計(jì)時(shí)計(jì)分制度,即玩家在規(guī)定時(shí)間內(nèi)達(dá)到一定分?jǐn)?shù)即可通關(guān)。故在畫面左上角設(shè)置計(jì)分和計(jì)時(shí)UI,并在畫面右下角添加顯示當(dāng)前任務(wù)的UI。最后,考慮玩家在游玩過程中需要暫?;蛘咄顺鲇螒颉T谟疑辖翘砑訒和0粹o,在畫面中間設(shè)置暫停菜單,添加LeaveRoom和Resume兩個(gè)按鈕用于退出游戲和返回游戲。因暫停菜單平時(shí)無需顯示在畫面上,在Inspector面板中將選項(xiàng)框取消勾選,即可在場(chǎng)景中默認(rèn)為隱藏狀態(tài)。游戲界面UI總體設(shè)計(jì)如圖4-4所示。

圖4-4游戲場(chǎng)景的UI設(shè)計(jì)接下來制作UI的功能部分。在hierarchy面板中新建空物體,命名為GameManager,新建GameManager.cs腳本,用于管理游戲中的全局變量和菜單UI。編寫GamePause()函數(shù),并在暫停按鈕的Inspector面板中添加OnClick()點(diǎn)擊事件,當(dāng)鼠標(biāo)點(diǎn)擊按鈕時(shí),暫停游戲,顯示暫停菜單并取消顯示暫停按鈕。同理,編寫GameResume()函數(shù)并綁定點(diǎn)擊事件,重新開始游戲并隱藏暫停菜單欄,重新顯示暫停按鈕。左上角的計(jì)時(shí)器則用協(xié)程進(jìn)行計(jì)時(shí),每過一秒鐘更新一次UI上的時(shí)間,若游戲時(shí)間歸零,則游戲結(jié)束。

public

void

GamePause()

{

Time.timeScale

=

0;

pauseMenu.SetActive(true);

pauseButton.SetActive(false);

}

public

void

GameResume()

{

Time.timeScale

=

1f;

pauseMenu.SetActive(false);

pauseButton.SetActive(true);

}

public

IEnumerator

startCountDown()

//協(xié)程倒計(jì)時(shí)

{

while

(sumTime

>=

1)

{

sumTime--;

TimeLabel.text

=

"Time:"

+

sumTime;

if

(sumTime

==

0)

{

//當(dāng)游戲時(shí)間用完則游戲結(jié)束

GameOver();

}

//每隔一秒調(diào)用一次

yield

return

new

WaitForSeconds(1);

}

}

此外,GameManager腳本還起到了初始化游戲的作用。Start()函數(shù)中,用Random.Range()函數(shù)在Z軸的-1.87到-12.87區(qū)間隨機(jī)生成玩家,并開始游戲倒計(jì)時(shí)協(xié)程。GameStart()函數(shù)將所有的任務(wù)初始化。void

Start()

{

//隨機(jī)位置生成玩家

PhotonNetwork.Instantiate(this.playerP,

new

Vector3(46f,0.2f,

Random.Range(-1.87f,

-12.87f)),

Quaternion.identity);

StartCoroutine(startCountDown());

}

void

FixedUpdate()

{

//初始化任務(wù)

GameStart();

}

public

void

GameStart()

{

if

(!condition)//只導(dǎo)入一次任務(wù)

{

for

(int

i

=

1;

i

<

11;

i++)

{

//導(dǎo)入所有任務(wù)

TaskManager.Instance.GetTask("Task"

+

i);

}

condition

=

true;

}

}

為了清楚的標(biāo)識(shí)游戲中的貨架名稱,在每個(gè)貨架上添加新的空物體作為子物體,并命名為nameItem。點(diǎn)擊nameItem并在Inspector面板添加TextMesh組件,在TextMesh組件中的text中輸入每個(gè)貨架的名稱。如圖4-5所示。圖4-5用TextMesh組件標(biāo)示貨架名稱

將游戲更改為多人聯(lián)網(wǎng)游戲

設(shè)置Photon引擎注冊(cè)并配置Photo服務(wù)器首先訪問Photon引擎的官網(wǎng)注冊(cè)賬號(hào),Photon支持申請(qǐng)免費(fèi)且最大連接數(shù)為20人的免費(fèi)服務(wù)器,注冊(cè)賬號(hào)后登錄并新建一個(gè)Application。PhotonType選擇與Unity3D相匹配的PhotonPUN,然后填寫項(xiàng)目名稱并提交即可。刷新等待系統(tǒng)分配到服務(wù)器后,Photon服務(wù)器注冊(cè)完成。5-1Photon服務(wù)器項(xiàng)目注冊(cè)下一步是登陸Photon引擎國內(nèi)代理商官網(wǎng),進(jìn)行中國區(qū)服務(wù)器注冊(cè)。這一步有助于降低國內(nèi)聯(lián)機(jī)游玩的延遲。注冊(cè)國內(nèi)Photon服務(wù)器需要上一步所注冊(cè)的國外服務(wù)器項(xiàng)目的appID和賬號(hào)。填寫相應(yīng)的表單后,等待通過即可激活中國區(qū)Photon服務(wù)器。在Unity上配置PUN下一步是在Unity3D的AssetStore中下載并導(dǎo)入免費(fèi)服務(wù)器所使用的PUN2-FREE插件。如圖5-2所示。5-2下載并導(dǎo)入PUN-FREE插件導(dǎo)入插件后,根據(jù)官方教程,在Project面板→Photon→PhotonUnityNetWorking→Resources中找到PhotonServerSettings,并在Inspector面板中填入之前注冊(cè)的服務(wù)器所分配的appID,并修改FixedRegion項(xiàng)內(nèi)的值為cn,如圖5-3所示。然后在Project面板搜索LoadBalancingClient.cs腳本,打開并找到NameServerHost一項(xiàng),將它的原值更改為“”,更改完畢后項(xiàng)目就可以順利連接上中國區(qū)的Photon服務(wù)器。5-3配置PhotonServerSettings游戲主菜單加入聯(lián)網(wǎng)功能回到StartGame場(chǎng)景,新建空物體并命名為NetworkManager,然后新建同名腳本NetworkManager.cs用于管理主菜單界面的網(wǎng)絡(luò)連接功能。首先導(dǎo)入Photon聯(lián)網(wǎng)所需要的兩個(gè)命名空間Photon.PUN和Photon.Realtime,然后將腳本所繼承的類為MonoBehaviourPunCallBacks。編寫Connect()函數(shù),若玩家已連接到服務(wù)器,則將玩家分配到隨機(jī)的房間。如果未連接PhotonCloud,則取消離線模式并嘗試連接。接著編寫連接回調(diào)函數(shù)OnConnectedToMaster()和OnDisconnected(),在玩家成功連接后加入游戲房間,連接失敗時(shí)返回錯(cuò)誤信息。然后重寫進(jìn)入房間失敗和進(jìn)入房間成功的函數(shù)。若進(jìn)入房間成功,則在控制臺(tái)輸出相應(yīng)信息并跳轉(zhuǎn)到游戲場(chǎng)景;若進(jìn)入房間失敗,則新建一個(gè)最大人數(shù)為4人的新房間。//導(dǎo)入photon所需的命名空間

using

Photon.Pun;

using

Photon.Realtime;

public

class

NetworkManager

:

MonoBehaviourPunCallbacks

//改為PunCallbacks

{

//連接

public

void

Connect()

{

if

(PhotonNetwork.IsConnected)

{

PhotonNetwork.JoinRandomRoom();

}

else

{

PhotonNetwork.OfflineMode

=

false;

PhotonNetwork.ConnectUsingSettings();

}

}

//連接回調(diào)函數(shù)

public

override

void

OnConnectedToMaster()

{

base.OnConnectedToMaster();

Debug.Log("連接成功!");

//加入隨機(jī)房間

PhotonNetwork.JoinRandomRoom();

}

public

override

void

OnDisconnected(DisconnectCause

cause)

{

base.OnDisconnected(cause);

Debug.Log("連接斷開!");

}

//進(jìn)入房間回調(diào)函數(shù)

public

override

void

OnJoinRandomFailed(short

returnCode,

string

message)

{

base.OnJoinRandomFailed(returnCode,

message);

Debug.Log("加入房間失敗!");

Debug.Log("開始建立新房間");

PhotonNetwork.CreateRoom(null,

new

RoomOptions

{

MaxPlayers

=

4});

}

public

override

void

OnJoinedRoom()

{

base.OnJoinedRoom();

Debug.Log("加入房間成功!");

PhotonNetwork.LoadLevel("_Demo");

}

同步游戲玩家的數(shù)據(jù)同步人物的運(yùn)動(dòng)與旋轉(zhuǎn)在Project面板找到玩家的預(yù)制體,然后在Inspector面板中新增PhotonView組件和PhotonTransformView組件。在PhotonView組件的ObservedComonents中點(diǎn)擊“+”號(hào)新增同步列表,并將預(yù)制體的Transform組件拖動(dòng)到列表中。然后勾選PhotonTransformView中的Position和Rotation選項(xiàng)。即可對(duì)人物的運(yùn)動(dòng)進(jìn)行同步,如圖5-4所示。圖5-4新增相應(yīng)組件使其同步同步游戲中的其他數(shù)據(jù)游戲中擁有任務(wù)系統(tǒng),但每個(gè)玩家的人物都不應(yīng)該是獨(dú)立的。故我們應(yīng)該將游戲中的任務(wù)進(jìn)度也一并同步。在Photon服務(wù)器中同步數(shù)據(jù)有兩種方式:使用PhotonPUNRPC和使用RaiseEvent發(fā)送事件和接受事件。前者較為方便快捷,故我們使用PhotonRPC來同步所需的函數(shù),即可達(dá)到同步任務(wù)進(jìn)度的效果。使用PUNRPC進(jìn)行同步,首先需要在對(duì)象上添加PhotonView組件和需要同步的腳本。然后在需要同步的函數(shù)前面加上[PunRPC]標(biāo)簽。用玩家點(diǎn)擊暫停按鈕的函數(shù)GamePause()舉個(gè)例子,GamePause()函數(shù)寫在GameManager腳本中,而GameManager腳本掛載在GameManager對(duì)象上,并且對(duì)象添加了PhotonView腳本,在函數(shù)上添加[PunRPC]標(biāo)簽,即可使函數(shù)在同一房間的多個(gè)客戶端中進(jìn)行同步。[PunRPC]

public

void

GamePause()

{

Time.timeScale

=

0;

pauseMenu.SetActive(true);

pauseButton.SetActive(false);

}

游戲的打包與導(dǎo)出至此,游戲的制作與設(shè)計(jì)部分基本結(jié)束,最后的工作就是將游戲?qū)С鲆约鞍l(fā)布。在Unity3D上方的工具欄菜單選擇File→BuildSetting選項(xiàng),在ScenesInBuild選框內(nèi)可以添加選擇需要導(dǎo)出的場(chǎng)景。由于一開始并未添加游戲開始菜單場(chǎng)景,故將StartGame場(chǎng)景拖入選框中,場(chǎng)景切換功能就可以實(shí)現(xiàn)。其余的選項(xiàng)為默認(rèn),點(diǎn)擊Build按鈕,選擇文件夾并等待游戲?qū)С黾纯?。圖5-5在BuildSetting中進(jìn)行導(dǎo)出游戲前的設(shè)置圖5-6導(dǎo)出后的可執(zhí)行游戲文件

游戲測(cè)試打開文件夾找到之前導(dǎo)出的游戲文件并點(diǎn)擊.exe可執(zhí)行文件即可打開游戲。在Graphics窗口中可以調(diào)整開始游戲時(shí)的分辨率大小,選擇是否窗口運(yùn)行,游戲的畫面質(zhì)量等參數(shù)。在Input窗口可以設(shè)置鍵位等。圖6-1Graphics窗口設(shè)置游戲功能測(cè)試程序編譯測(cè)試:Unity3D引擎控制臺(tái)及編譯無嚴(yán)重錯(cuò)誤。(測(cè)試通過)界面UI:開始游戲界面/任務(wù)系統(tǒng)UI/暫停及開始游戲界面均可正常顯示并且功能正常。(測(cè)試通過)玩家控制功能:玩家能夠正常行走并拾取物品,能夠在其他客戶端正常更新。(測(cè)試通過)游戲通關(guān)等邏輯測(cè)試:玩家能夠正常通關(guān)游戲并重新開始,游戲分?jǐn)?shù)及計(jì)時(shí)器等運(yùn)行正常。(測(cè)試通過)聯(lián)網(wǎng)功能:玩家點(diǎn)擊開始聯(lián)網(wǎng)游戲之后,在Unity3D的控制臺(tái)能夠輸出正常創(chuàng)建和進(jìn)入房間的測(cè)試語句,并且其他玩家也能夠正常進(jìn)入及退出游戲房間。(測(cè)試通過)資源占用測(cè)試測(cè)試環(huán)境:處理器:AMDRyzen72700CPUEight-CoreProcessor內(nèi)存:16GBDDR4顯卡:AMDRadeonRX5802048SP系統(tǒng):Windows10Pro1909測(cè)試情況如下:處理器占用率:最高21%,平均15%內(nèi)存占用:101.0MB顯存占用:120MB以上結(jié)果來自人工手動(dòng)記錄,在正常游玩情況下游戲的資源占用均處于正常范圍。測(cè)試通過。小結(jié)經(jīng)過測(cè)試和調(diào)整,游戲正常運(yùn)行,沒有出現(xiàn)卡頓,閃退等問題。屏幕和鼠標(biāo)的交互正常,聯(lián)機(jī)的人物沒有出現(xiàn)卡頓,斷連等網(wǎng)絡(luò)問題。玩家能夠正常獲得游戲物品,并且能夠?qū)崟r(shí)在另一個(gè)客戶端上更新?;竟δ芤呀?jīng)實(shí)現(xiàn),游戲過程無異常。

總結(jié)基于Unity3D的多人合作游戲到此就圓滿完成了,至此也表示畢業(yè)設(shè)計(jì)已經(jīng)到了最終階段。在整個(gè)畢業(yè)設(shè)計(jì)的過程中,通過對(duì)該游戲的開發(fā)與對(duì)多人聯(lián)機(jī)類型游戲的研究,我收獲了許多知識(shí)。但是在這過程中我也意識(shí)到自己還有很大的學(xué)習(xí)空間,在游戲制作的過程中深感自己知識(shí)儲(chǔ)備的不足。通過在網(wǎng)上查閱資料,觀看教學(xué)視頻,咨詢指導(dǎo)老師等方式最終將問題解決了。但是我認(rèn)為這個(gè)項(xiàng)目中仍舊存在這許多不完美:1.關(guān)卡設(shè)計(jì)過于簡(jiǎn)單,可玩性不高;2.聯(lián)機(jī)功能不夠強(qiáng)大,在游戲的網(wǎng)絡(luò)優(yōu)化部分需要繼續(xù)打磨;3.UI設(shè)計(jì)不夠好看。Unity3D引擎因?yàn)楣δ軓?qiáng)大,易上手等特點(diǎn)被越來越多廠商所使用,在未來可能會(huì)更加的熱門,熟練掌握Unity3D引擎的使用有助于我們?cè)谟螒蜷_發(fā)這一條道路上走得更遠(yuǎn)。在本次畢業(yè)設(shè)計(jì)所遇到的困難使我意識(shí)到自己經(jīng)驗(yàn)與知識(shí)儲(chǔ)備不足,將來的日子里,我會(huì)不斷學(xué)習(xí)進(jìn)步,爭(zhēng)取在未來做出更好的作品。

參考文獻(xiàn)[1][美]JosephHocking.Unity5實(shí)戰(zhàn)[M].蔡俊鴻,譯.北京:清華大學(xué)出版社,2016.[2]Unity3D游戲開發(fā)[M].人民郵電出版社,宣雨松,2012

[3][美]JesseSchell.游戲設(shè)計(jì)藝術(shù):第二版[M]劉嘉俊等,譯.北京:電子工業(yè)出版社.2016

[4]Unity.Unity3D參考手冊(cè).Unity,2010:94-121

[5]基于Unity3D的多通道下服務(wù)器客戶端同步[J].汪瑞.現(xiàn)代計(jì)算機(jī)(專業(yè)版).2015(24)

[6]魏迎梅.虛擬環(huán)境中碰撞檢測(cè)問題的研究.[D].長(zhǎng)沙:中國人民解放軍國防科學(xué)技術(shù)大學(xué),2000:23-45

[7]宋傳磊.Unity3D中物體間通信方式應(yīng)用研究.[J].軟件開發(fā)與應(yīng)用,2015(12)

[8]吳晶晶,戴智超.基于Unity3D的多人在線網(wǎng)絡(luò)游戲設(shè)計(jì)與開發(fā).[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2017,26(10):133?138

[9]肖俊.基于Unity3D的跨平臺(tái)手機(jī)網(wǎng)絡(luò)游戲的研究與實(shí)現(xiàn).[J]科技與信息.2018(02)

[10]薛玉倩.基于Unity3D的網(wǎng)絡(luò)游戲.[J]內(nèi)蒙古科技與經(jīng)濟(jì).2018.7(13)

[11]徐軍,張子墨.基于Unity3d射擊游戲的設(shè)計(jì)及其核心功能實(shí)現(xiàn).[J]福建電腦.2018(7)

[12]李智鵬.基于Unity3D引擎的空中戰(zhàn)機(jī)游戲設(shè)計(jì)與實(shí)現(xiàn).[D].吉林.吉林大學(xué).2016

[13]干建松.基于Unity局域網(wǎng)同步與多角色玩家的設(shè)計(jì)與實(shí)現(xiàn).[J]鹽城工學(xué)院學(xué)報(bào)(自然科學(xué)版).2018.9(3)

[14]呂圣卿,陳一民等.一種基于網(wǎng)絡(luò)的并行渲染和跨平臺(tái)同步展示系統(tǒng).[J].計(jì)算機(jī)應(yīng)用與軟件.2017.10(10)

[15]梁成.基于Unity3D在基本游戲框架下客戶端研究與實(shí)現(xiàn).[J].現(xiàn)代計(jì)算機(jī).2015.09(25)

致謝我的大學(xué)生涯隨著畢業(yè)設(shè)計(jì)的完工也進(jìn)入了尾聲。在本次畢業(yè)設(shè)計(jì)開始之前,我大致了解了相關(guān)游戲的制作背景,我所模仿的游戲一開始僅僅由2人的團(tuán)隊(duì)研發(fā),使我信心大增。但在游戲制作的過程中經(jīng)常因?yàn)橹R(shí)儲(chǔ)備不足,對(duì)腳本開發(fā)的不夠熟練,在各種問題上頻頻碰壁。例如在將單人游戲更改為網(wǎng)絡(luò)聯(lián)機(jī)游戲時(shí),我就因?yàn)閷?duì)計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)儲(chǔ)備不足以及對(duì)Unity3D的網(wǎng)絡(luò)開發(fā)了解不夠,導(dǎo)致開發(fā)周期過長(zhǎng)以及精力耗費(fèi)過多。在此,我非常感謝對(duì)我有教育之恩的代課老師們,每一位老師的悉心教導(dǎo)都是我完成這篇論文的基礎(chǔ)。感謝吳志達(dá)老師一直以來對(duì)我的鼓勵(lì)和支持,為我的畢業(yè)論文格式進(jìn)行指導(dǎo),感謝指導(dǎo)老師王千秋老師在我陷入困境的時(shí)候給予我最中肯的指點(diǎn),大學(xué)里有這兩位恩師的存在讓我少走了很多彎路。因?yàn)楦魑焕蠋煹臒o私奉獻(xiàn),我的畢業(yè)設(shè)計(jì)最終得以完工。我也非常感謝在網(wǎng)上提供各種資料和教程的許多無名人士,借著他們鋪下的路,我的各種問題才得以解答。最后,感謝所有曾經(jīng)幫助過我的人,在此真誠地向你們致謝!

PowerPoint課件制作實(shí)用技巧PowerPoint是微軟公司生產(chǎn)的制作幻燈片和簡(jiǎn)報(bào)的軟件(以下簡(jiǎn)稱PPT)。在我們?cè)S多人看來,它只不過是一個(gè)簡(jiǎn)單地對(duì)文字、圖形、圖片進(jìn)行演示的軟件,教學(xué)中的課件制作軟件當(dāng)屬Authorware、Flash。Authorware和Flash制作的動(dòng)畫效果的確很好,而且它們的功能也很強(qiáng)大。不過這些軟件在制作課件的過程中往往非常耗時(shí),用這些專業(yè)軟件來制作課件用于平時(shí)的教學(xué)往往效率很低。PPT就是一個(gè)非常簡(jiǎn)單、實(shí)用的制作課件的軟件,只要你用好它,同樣能做非常棒的課件來。一、掌握基本,知道“插入”。(一)知道從“插入”菜單進(jìn)入,會(huì)給PPT課件添加文字、圖片、影片和聲音等,也就會(huì)做一般的課件了。(二)圖片插入與處理1.插入圖片具體方法:a)插入剪貼畫或文件中的圖片;b)添加圖片做背景;c)給自選圖形做填充。2.處理圖片具體方法:我們用PPT制作課件時(shí),經(jīng)常從網(wǎng)上下載圖片來用,而網(wǎng)絡(luò)中的圖片往往含有超鏈接和網(wǎng)站名稱痕跡,我們需要?jiǎng)h除其中超鏈接,并對(duì)圖片進(jìn)行裁剪處理。在Powerpoint中,我們一般可以利用“圖片”工具欄上的“裁剪”工具進(jìn)行裁剪處理,但是,這里的工具只能對(duì)圖片進(jìn)行矩形裁剪,若想裁剪成圓形、多邊形等其他形狀,通常方法就無能為力了。其實(shí)這個(gè)問題在PPT中是可以解決的。我們用給自選圖形做填充圖片的方法就可以實(shí)現(xiàn)我們需要的效果。具體步驟:a)首先利用“繪圖”工具欄畫一個(gè)想要裁剪的圖形,如橢圓。b)選中橢圓后單擊“繪圖”工具欄上“填充顏色”按鈕右側(cè)黑三角,從列表菜單中單擊“填充效果”命令。c)打開選擇“圖片”選項(xiàng)卡,單擊〔選擇圖片〕按鈕,從“選擇圖片”對(duì)話框中找到合適的圖片,單擊〔插入〕按鈕后返回到“填充效果”對(duì)話框最后單擊〔確定〕按鈕后退出。此圖片當(dāng)作橢圓圖形的背景出現(xiàn),改變了原來的矩形形狀,獲得了滿意的裁剪圖片效果。圖片在插入PPT之前,我們可以用ACDSEE軟件進(jìn)行加工,如改變大小,裁剪等操作。二、學(xué)會(huì)下載,查找方法。在制作課件過程中,我們時(shí)常需要從網(wǎng)絡(luò)上下載各種資源用以豐富課件內(nèi)容,提升課堂效果。但有許多網(wǎng)站的flash動(dòng)畫都不提供下載;還有網(wǎng)站為我們提供了許多視頻素材,這些視頻素材都是FLV流媒體格式。FLV流媒體格式是一種新的視頻格式,全稱為FlashVideo。由于它形成的文件極小、加載速度極快,使得網(wǎng)絡(luò)觀看視頻文件成為可能,它的出現(xiàn)也有效地解決了視頻文件導(dǎo)入Flash后,使導(dǎo)出的SWF文件體積龐大,不能在網(wǎng)絡(luò)上很好的使用等缺點(diǎn)。目前各在線視頻網(wǎng)站均采用此視頻格式。如新浪播客、56、優(yōu)酷、土豆、酷6等,無一例外。FLV已經(jīng)成為當(dāng)前視頻文件的主流格式。這些網(wǎng)站一般都不提供下載。我們想要這些素材,怎樣辦?1.尋找下載方法:a)在百度網(wǎng)站搜索欄中輸入下載的內(nèi)容,搜索下載方法。b)弄清格式,再搜索方法。2.具體方法推薦①flasah動(dòng)畫的下載方法一:IE緩存中尋找在網(wǎng)上看過一個(gè)flash后,一般情況下都會(huì)保存在IE緩存里。右擊桌面上的IE圖標(biāo),選“屬性”命令,單擊中間的“設(shè)置”按鈕,彈出“Internet臨時(shí)文件和歷史記錄設(shè)置”面板,單擊“查看文件”,可以打開臨時(shí)文件夾,按時(shí)間排序,找到剛才打開的flash動(dòng)畫文件。優(yōu)點(diǎn):不需要安裝其它軟件。缺點(diǎn):操作相對(duì)煩瑣。方法二:借助Flashsaver等軟件下載,這些軟件都可以快速、方便的下載你所需要的flash文件。優(yōu)點(diǎn):簡(jiǎn)單、方便、快速。缺點(diǎn):需要安裝使用。②FLV視頻的獲取方法一:IE緩存中尋找,方法同flasah。方法二:flv視頻解析下載/三、學(xué)用控件,轉(zhuǎn)化應(yīng)用1.flash動(dòng)畫的插入方法一:安裝flash插件,再插入flash。步驟:a)安裝“ppt插flash軟件”插件;b)單擊“插入”→“flashmovie”→打開要播放的flash文件→確定。方法二:利用控件插入flash動(dòng)畫。步驟:a)插入“ShockwaveFlashObject”控件對(duì)象:右擊“工具欄”→選“控件工具箱”(或點(diǎn)“視圖→工具欄→控件工具箱”);點(diǎn)“其他控件”(控件工具箱中最后一個(gè)形似錘子斧頭的按鈕),拖動(dòng)滾動(dòng)條或在英文輸入法狀態(tài)下按鍵盤上“s”鍵,快速定位到以s開頭的控件,選擇“ShockwaveFlashObject”控件。將鼠標(biāo)移到幻燈片工作區(qū),鼠標(biāo)指針變成“十”字型,拖動(dòng)鼠標(biāo)繪制出一個(gè)形似信封的矩形。b)打開控件對(duì)象“屬性”對(duì)話框:右擊矩形控件對(duì)象,在彈出的快捷菜單中選“屬性”命令。c)正確設(shè)置控件對(duì)象屬性:主要是在“Movie”空白文本域中正確輸入演示文稿要播放的.swf動(dòng)畫的完整名稱。d)將控件對(duì)象適當(dāng)縮放:為了獲得比較好的播放效果,拖動(dòng)控件對(duì)象的縮放點(diǎn)使它幾乎覆蓋整個(gè)幻燈片工作區(qū),但要在幻燈片工作區(qū)底部保留少許空白區(qū)域。這樣既可以享受.swf動(dòng)畫大屏幕播放的好處,又能夠保證幻燈片能夠順利地切換。e)一般情況下,幻燈片應(yīng)顯示出動(dòng)畫的第一幀圖形。如果控件對(duì)象仍是空白的,可保存演示文稿,關(guān)閉后再打開它,按F5放映幻燈片,應(yīng)該能夠正確播放動(dòng)畫。2.FLV視頻的插入FLV視頻與FLASH不一樣的。全稱是flashvideo,所用的播放器也不一樣。①利用控件插入PPT的方法也是有區(qū)別的。不同點(diǎn):先要下載pptflv.swf文件,此文件是類似于網(wǎng)頁中FLV視頻播放器的一個(gè)Flash文件(可用百度搜索下載下來后記著要改文件名,保留擴(kuò)展名);例如改成:pptflv1.swf“Movie”參數(shù)值填入方法不一樣,參數(shù)值示例:pptflv.swf?file=視頻.FLV“pptflv.swf”即為步驟一下載下來的Flash文件的完整文件,“視頻.FLV”即為需要播放的FLV視頻的文件名,大家只要將pptflv.swf換成自己下載后起的文件名,將“視頻.FLV”換成自己的FLV視頻文件名,則此FLV文件就可以在PowerPoint中播放了。如播放2.flv視頻參數(shù)填法:示例:pptflv1.swf?file=2.FLV②方法二:將flv轉(zhuǎn)換成swf再插入轉(zhuǎn)換軟件:UltraFlashVideoFLVConverter3.2.0軟件說明:該軟件又叫全格式FLV轉(zhuǎn)換器,支持將幾乎所有主流視頻格式轉(zhuǎn)換為FLV或者SWF且對(duì)用戶較為關(guān)心的RealMedia(RM/RMVB...)和QuickTime(MOV/QT...)支持良好。三大特色功能:既可輸出FLV格式,也可輸出SWF格式,甚至同時(shí)輸出FLV+SWF格式。此軟件也支持創(chuàng)建調(diào)用播放的網(wǎng)頁支持導(dǎo)入所有的主流字幕格式。srt,*.sub,*.idx,*.ssa,*.ass,*.psb,*.smi)有字幕合成功能,你現(xiàn)在無需再使用那些繁瑣的專業(yè)軟件來合成字幕到視頻中去,字幕合成與格式轉(zhuǎn)換一氣呵成!支持視頻分割,右鍵點(diǎn)擊列表中的源文件,選擇[編輯視頻],自己設(shè)置下起點(diǎn)終點(diǎn)即可對(duì)視頻進(jìn)行去粗取精處理?、鄯椒ㄈ簩lv轉(zhuǎn)換成其他格式視頻文件再插入工具:FLV轉(zhuǎn)AVI(FreeFLVtoAVIConverter1.5)作用:一個(gè)免費(fèi)的將FLV轉(zhuǎn)換成AVI的軟件,簡(jiǎn)單好用,自帶解碼器。四、學(xué)做交互,理解運(yùn)用。1.利用母版進(jìn)行交互母版≠模版母版和模版可以使課件統(tǒng)一整體風(fēng)格,展現(xiàn)自己的個(gè)性和特點(diǎn);模版是對(duì)同一類課件所做的整體風(fēng)格統(tǒng)一設(shè)置,母版則是對(duì)某一部課件內(nèi)部所做的個(gè)性化統(tǒng)一設(shè)置。母版設(shè)置得好,就可以存為模版,供別人在制作同類題材時(shí)使用。修改幻燈片母板的方法和技巧。如果我們希望為每一張幻燈片添加上一項(xiàng)固定的內(nèi)容,并做超鏈接,可以通過修改“母板”來實(shí)現(xiàn)。a)執(zhí)行“視圖→母板→幻燈片母板”命令,進(jìn)入“幻燈片母板”編輯狀態(tài)。b)插入固定內(nèi)容。例如:將圖片插入到幻燈片中,調(diào)整好大小、定位到合適的位置上。c)給這張圖片插入超鏈接,就可以進(jìn)行交互了。d)單擊“關(guān)閉母板視圖”按鈕退出“幻燈片母板”編輯狀態(tài)。以后添加幻燈片時(shí),該幻燈片上自動(dòng)添加上該圖片。如果說一個(gè)PPT有它的靈魂的話,那就是PPT的母板,它的作用猶如摩天大廈的根基一般。2.在PPT演示文稿中插入PowerPoint演示文稿對(duì)象實(shí)現(xiàn)交互具體效果:①導(dǎo)航目錄內(nèi)容展示效果②單擊小圖片就可看到該圖片的放大圖自動(dòng)縮效果《畫家鄉(xiāng)》一課五個(gè)畫面交互的具體操作方法:a)單擊“插入→對(duì)象”,在出現(xiàn)的選擇頁中選擇“MicrosoftPowerPoint演示文稿”,單擊確定。此時(shí)就會(huì)在當(dāng)前幻燈片中插入一個(gè)“PowerPoint演示文稿”的編輯區(qū)域。b)在此編輯區(qū)域中我們就可以對(duì)插入的演示文稿對(duì)象進(jìn)行編輯了,編輯方法與PowerPoint演示文稿的編輯方法一樣。c)在插入的演示文稿對(duì)象中創(chuàng)建所需的幻燈片??蓪D片設(shè)置為幻燈片相同大小,退出編輯后,就可發(fā)現(xiàn)圖片以縮小方式顯示了(其實(shí)是整個(gè)插入的演示文稿對(duì)象被縮小顯示了)。d)最后,我們只需對(duì)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論