




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
摘要隨著我國經濟的快速發展,大多數的家庭也購置了交通工具;但在上下班高峰期,車主在開車回家的路上已經因為塞車而在路上浪費了不少的時間,對交規和道路規劃感到失望。但大多數的車主并不了解城市規劃部門和交警同志的做過為了盡可能的使交通流程所做出的努力。我想通過制作一款交通管理模擬器,讓車主們通過游戲的形式了解城市規劃部門和交警同志的不易。Unity3D(以下稱為U3D)是一款用于多平臺游戲開發的游戲引擎。它提供了一個完善的多平臺游戲系統。平臺之間的差異通常會影響產品開發的速度和進度,因此大多數開發人員會花很多時間在上面,但U3D出現,標志著此游戲引擎可以完美地移植到幾乎10個主流平臺之間。該游戲并不像名字那樣是一款嚴肅的游戲;恰恰相反,交通管理模擬器是一款氛圍幽默且易于上手的游戲。因為我想用通俗易懂的游戲方式讓人們大致的了解交通部門的日常工作,從而明白交通部門日常工作的艱辛。該游戲是以3D塔防游戲的系統作為基礎進行開發,并加入了我不少的創新設計,且游戲將以3D的形式制作。本文主要描述了該游戲的開發原理,游戲的設計與實現以及游戲功能測試等。為后續希望開發同類游戲的開發者提供借鑒與參考。關鍵詞:Unity3D交通管理模擬器3D塔防游戲
AbstractWiththerapiddevelopmentoftheChineseeconomy,mostfamilieshavealsopurchasedmeansoftransportation;butduringrushhourdailycommutes,carownerslostalotoftimeontheroadbecauseoftrafficjamsontheroadtogethome.Bedisappointed.Butmostcarownersdonotunderstandtheeffortsoftheurbanplanningserviceandthefellowtrafficpolicetomaketrafficassmoothaspossible.Iwanttomakeatrafficmanagementsimulatortoallowcarownerstounderstandthedifficultyofurbanplanningservicesandfellowtrafficpoliceintheformofgames.
Unity3D(hereinafterreferredtoasU3D)isagameengineforthedevelopmentofgames.Itprovidesaperfectcross-platformgamesystem.Differencesbetweenplatformsgenerallyaffectthespeedandprogressofproductdevelopment,somostdeveloperswillspendalotoftimeonit,buttheemergenceofU3Dmarksthatthisgameenginecanbeperfectlytransplantedbetweencloseof10consumerplatforms.
Thegameisnotaseriousgameasthenamesuggests;onthecontrary,thetrafficmanagementsimulatorisahumorousandeasytousegame.BecauseIwanttousesimpleandeasytounderstandgamestoallowpeopletohaveageneralunderstandingofthedailyworkofthetransportservice,inordertounderstandthedifficultiesofthedailyworkofthetransportservice.Thegameisdevelopedonthebasisofthe3Dtowerdefensegamesystem,andincorporatesmanyofmyinnovativedesigns,andthegamewillbeproducedin3D.Thisarticlemainlydescribestheprinciplesofgamedevelopment,gamedesignandimplementation,andgamefunctiontesting.Provideareferenceandreferencetolaterdeveloperswhowishtodevelopsimilargames.Keywords:Unity3DTrafficManagementSimulator3DTowerDefenseGame目錄第一章 緒論 緒論選題的目的和意義我認為塔防游戲是一種對玩家易于上手,卻難于精通的游戲類型,當此游戲類型面向一般不接觸游戲的藍海用戶時也能讓他們快速上手并沉浸其中;但在大多數玩家眼里,塔防游戲的玩法已經被游戲廠商們挖掘的差不多了;但我認為塔防游戲在玩法方面還是有不少可創新的空間,隨著手機游戲的崛起,越來越多的游戲廠商也開始在手機平臺上制作塔防游戲。且塔防游戲的玩法也與我的畢業設計,交通模擬器的游戲主題十分契合;即能讓玩家通過上帝視角觀察日常中馬路上的交通情況,也能讓玩家通過管理馬路上的交通情況,明白交警在日常管理交通的工作中的不易。國內外研究現狀塔防游戲已經存在很長時間了,從《桌面塔防游戲》的開始到War3時代功能強大的關卡編輯器的幫助下出現的各種讓人印象深刻的塔防游戲關卡。最初爆火的《植物大戰僵尸》、《獸人必須死》和其他具有不同主題的流行獨立游戲作品,再到近年來《部落戰爭》和其他手游杰作,塔防游戲的發展速度可以說是突飛猛進了。但是另一方面,塔防游戲注重細節,例如防御單位的位置,進攻和防御價值,甚至在困難的情況下,通關方法也總是過于功利。關卡也是總是換湯不換藥,使得玩家很快就喪失興趣。結果,塔防多年以來一直未能擺脫玩家數量稀少的命運,許多玩家玩過塔防,但卻很少有人會堅持只玩一款塔防游戲。要想讓玩家一直只專注在一款塔防游戲上,是廣大游戲廠商難以做的。實際上,對于任何具有先天游戲性缺陷的游戲,打破命運并將其從小眾游戲轉變為可以真正進入大眾游戲市場的并流行,仍然是那句老生常談的方法——要創新!但是,對于像塔防游戲這種具有相對固定玩法的游戲,創新應該從哪里開始呢?如果您想制作高質量的塔防游戲并想創新,那么游戲玩法上的創新無疑是重中之重。誠然,塔防的基本玩法仍然基于炮塔(或近似概念的道具、建筑)的放置和搭配,但這并不意味著沒有新的設計可用于塔防游戲的游戲創新。一方面,塔防游戲可以嘗試在炮塔升級系統,戰術,技能,地形和其他元素上進行創新,或者可以使用不同的游戲主題來制作戰斗和塔防策略的突破。另一方面,塔防游戲還可以為習慣于獨自作戰的游戲玩家創建實用且易于使用的交互式平臺,以增強游戲的社交游戲屬性和使用社交系統。在社交化的幫助下,塔防游戲具有更多的變量和更深入的體驗內容。除了特定于產品的創新之外,當今產品的同質化也變得越來越嚴重,大多數的游戲公司都是以制作成本低廉的山寨網頁游戲和手機游戲的塔防游戲為主。在當前這種情況下,優質的產品需要什么?想要獲得市場認可除了產品的創新外,也需要一些創新的營銷手段。傳統的塔防游戲,無論是獨立游戲還是Flash游戲,除了引入大量廣告流量外,便是依靠玩家之間的口口相傳,這種傳統在網頁游戲和手機游戲領域繼續。但是,在硬廣告的轉換率越來越差,相似產品的數量在增加并且參與者的選擇也在增加的情況下,這些舊的營銷方法變得越來越難以使用。論文組織結構?論文從最初構思到分析實踐,結合了在網上查詢的塔防游戲開發課程與資料和關于交通部門和城市規劃部門的工作資料,進行了一個交通管理模擬器游戲的設計與制作,其中,具體介紹游戲的制作步驟,包括游戲的系統功能設計與實現和與之相關的代碼編寫。論文分為五個章節,各章節安排如下:?第一部分:緒論,主要闡述了該畢業設計制作的背景、國內外對相關課題的研究現狀以及本設計的大概介紹;?第二部分:介紹了本文制作游戲使用的各類開發工具和Unity3D的大致介紹;?第三部分:詳細介紹游戲的各個模塊需求設計;第四部分:詳細介紹游戲的各個模塊的設計與實現;??第五部分:詳細介紹了游戲各個功能的測試;?第六部分:總結了在完成畢設游戲的過程中的困難與今后的學習目標。
開發工具介紹Unity3D游戲引擎Unity3D軟件介紹Unity3D(以下稱為U3D)是一款用于多平臺游戲開發的游戲引擎。它提供了一個完善的多平臺游戲系統。平臺之間的差異通常會影響產品開發的速度和進度,因此大多數開發人員會花很多時間在上面,但U3D出現,標志著此游戲引擎可以完美地移植到幾乎10個主流平臺之間。同時,U3D還提供了良好的交互式操作界面,可以完美地部署在Windows和MacOS上。該軟件中包含的五個工程視圖框架可以幫助設計人員對游戲中的對象進行分類,并觀察游戲創建的進度。其中,項目視圖主要存儲游戲內資源文件,分層視圖主要將特定的游戲對象放置在游戲場景中,檢查者視圖主要用于描述游戲資源的信息,場景視圖主要在游戲中存儲模型的資源,游戲視圖用于觀察完成游戲的當前結果。U3D還為我們提供了編譯多種腳本語言的通用環境。用戶可以根據需要調整默認編譯環境。Unity3D支持多種腳本語言,其中包含但不限于C#,javascript和boo。API接口Unity3D豐富API可以幫助您滿足各種需求。API是預定義的函數,可用于為應用程序和開發人員提供基于某些軟件或硬件的訪問例程集的功能,而無需訪問源代碼或了解內部工作機制的細節。U3D具有完整的API函數庫集。使用這些API函數,開發人員可以輕松實現項目初始化,調用功能模塊的每一幀,如何執行觸發檢測和對觸發事件的響應以及如何判斷是否進入該區域觸發,是否在觸發區域,是否離開觸發區域,如何響應滑動事件等。GUI(圖形用戶界面)此次畢業設計主要使用NGUI和UGUI開發用戶界面,GUI是英文圖形用戶界面的縮寫。Unity的GUI系統稱為UnityGUI。UnityGUI使您可以快速輕松地添加各種功能和各種界面元素,包括在創建GUI控件時實例化,定位和定義功能。只需編寫少量代碼即可完成GUI實例的創建,在屏幕上定位該實例,并在元素時執行的腳本界面已激活。UGUI與Unity3D集成在一起,而NGUI是一個用戶界面插件,它擴展了為Unity游戲引擎開發的工具的功能。它還可以為開發人員提供快速便捷的用戶界面設計方法,以此加快游戲設計和制作。C#開發語言C#是由微軟公司開發并在.NETFramework上運行的高級面向對象的編程語言。C#與Java類似,是一種語言,一種工具。但是在這里我們需要知道Unity是跨平臺的,而C#不是跨平臺的語言。只是由于Mono的重新實現,Unity才能使用C#進行開發,因此我們可以在Unity上編寫C#代碼,且代碼語法清晰,類庫易于使用。因為以上的各種優勢,為此C#是游戲開發者在Unity開發中首先考慮的語言。VisualStudio2019VisualStudio2019(以下稱為VS)是Microsoft獨立啟動的開發環境。其中,它支持最新的集成開發環境。VS還帶來了NETFramework4.6,MicrosoftVisualStudio2019CTP,并且還支持開發人員開發面向Windows的應用程序。并支持MicrosoftSQLSever,IBM,Oracle數據庫等。
游戲需求設計游戲基本介紹交通管理模擬器是一款類3D塔防的游戲,玩家可通過修改場景中的紅綠燈的紅燈時間和綠燈時間來控制車輛通行綠燈的時間與行人過馬路的時間,且游戲在特定的場景內會出現酒駕的車輛,玩家需要通過場景內的測速攝像機得知場景內是否存在酒駕的車輛,通過場景內的測速攝像機的車輛,其速度會顯示在玩家的界面上,若玩家不處理場景中的酒駕車輛,當酒駕車輛與行人碰撞發生意外時,玩家的游戲就會失敗;玩家可通過在公路上設置測量駕駛員的酒精含量的交警來阻攔酒駕車輛的通行。游戲通過游戲內順利通過的車輛和行人的數量來給予玩家積分,在場景中限制的時間內獲得的積分越多,玩家的評分就越高。若玩家游玩的場景內發生意外,則游戲失敗。游戲對象的需求設計正常行駛車輛的需求設計圖3-1正常行駛車輛的模型正常行駛車輛的AI邏輯:看見紅燈:停車看見綠燈:車輛行駛看到行人:停車經過測速攝像機:GUI讀取車速看到測酒駕交警:停車等待酒精檢測,完成檢測后通過酒駕車輛的需求設計圖3-2酒駕車輛的模型酒駕車輛的AI邏輯:看到紅燈:不停車看到綠燈:不停車看到行人:不停車經過測速攝像機:GUI讀取車速看到測酒駕交警:停車等待酒精檢測,完成檢測后銷毀自身行人的需求設計圖3-3行人的模型行人的AI邏輯:看到紅燈:行走 看到綠燈:不行走 看到行人:不行走紅綠燈的需求設計圖3-4紅綠燈的模型紅綠燈的AI邏輯:當為紅燈時:阻止車輛通過,放行行人通過當為綠燈時:發行車輛通過,阻止行人通過紅綠燈的操控:玩家通過點擊紅綠燈的游戲對象后,紅綠燈會顯示可改變紅燈的時間和綠燈的時間的UI供玩家進行設置。交警的需求設計圖3-5交警的模型交警的AI邏輯:看到車輛時:阻止車輛前進,并對其進行檢查交警的操作:玩家通過點擊交警的游戲對象后,交警會顯示升級和撤離的UI供玩家進行設置測速攝像機的需求設計圖3-6測速攝像機的模型高速攝像機的AI: 當有車輛經過時:把車輛測出來的速度顯示在玩家的UI上游戲功能的需求設計游戲對象自動生成功能的需求設計:此功能的需求是:通過自動生成游戲對象腳本的編寫,實現車流和人流自動生成(只是在游戲內自動生成,但還是要通過開發者的設置才行)的功能。在游戲場景中生成交警功能的需求設計此功能的需求是:在游戲場景中通過GUI的Button選擇交警,并在游戲場景相應的位置中生成交警、升級已經生成的交警和撤離交警的功能。游戲場景中攝像機的操控的需求設計此功能的需求是:讓玩家能在游戲場景中通過鍵盤和鼠標對游戲的視角進行平移和放大的功能。游戲的暫停功能的需求設計此功能的需求是: 為了防止玩家手忙腳亂,游戲中會有暫停功能,玩家可通過UI中的暫停按鍵和繼續按鍵進入暫停狀態;在暫停狀態下,玩家依然可以生成交警和改變紅綠燈的時間。游戲場景的需求設計新手教程場景的需求設計:此場景(圖3-7)教會玩家如何游玩交通模擬器。圖3-7新手教程場景早高峰場景的需求設計:此場景(圖3-8)內會出現行人和正常行駛的車輛。圖3-8早高峰場景晚高峰場景的需求設計:此場景(圖3-9)內會出現行人、正常行駛的車輛和酒駕車輛。圖3-9晚高峰場景游戲的設計與實現游戲界面設計與實現游戲開始界面的設計與實現此界面為開始界面(圖4-1),其功能如下:玩家按開始按鈕時加載游戲第一個游戲場景玩家按退出按鈕時退出游戲給攝像機添加一個Animator使攝像機可以實現自動平移移動的功能。圖4-1游戲開始界面圖4-2攝影機的動畫TimeLine玩家操作界面的設計與實現此界面為玩家操作界面(圖4-3),其功能如下:顯示玩家的得分顯示游戲剩余的時間顯示空閑交警的數量顯示車輛的時速玩家可通過按測量酒精檢測站,在馬路上生成交警玩家可通過按暫停游戲彈出菜單(圖4-4)玩家可通過按暫停,讓游戲進入暫停狀態,按繼續可繼續進行游戲圖4-3玩家操作界面游戲暫停界面的功能與實現此界面為游戲暫停界面(圖4-4),其功能如下:玩家可通過按繼續游戲按鈕繼續游戲玩家可通過按返回主菜單按鈕返回游戲圖4-4暫停游戲界面游戲分數結算界面的功能與實現此界面為游戲分數結算界面(圖4-5),其功能如下:在剩余時間為0時,顯示此界面顯示玩家最終得分在剩余時間為0時,顯示此界面玩家可通過按下一個按鈕進入下一關玩家可通過按返回主菜單按鈕返回主菜單圖4-5游戲分數結算界面游戲對象設計與實現正常行駛的車輛設計與實現正常行駛的車輛可根據場景內的設置好的目標點(Targetpoint)來實現自動尋路。車輛通過與Tag為Start的游戲對象進行碰撞,從而獲得Tag為Start的游戲對象下的子對象來獲取目標點,并存到數組positions中。碰撞檢測代碼如下:private
void
OnTriggerEnter(Collider
coll)
{
if(coll.tag
==
"Start")
{
wayPoint
=
coll.gameObject;
FindWayPoint();
}
}
獲得并將子對象存儲的代碼如下: public
void
FindWayPoint()
{
positions
=
new
Transform[wayPoint.transform.childCount];
for
(int
i
=
0;
i
<
positions.Length;
i++)
{
positions[i]
=
wayPoint.transform.GetChild(i);
}
}
車輛的移動通過判斷獲得的子對象的數組內的數量,當數組內的數量大于1時開始執行移動,先對準子對象,再向子對象進行移動。當車輛與子對象的距離小于0.2f時則車輛會向數組內的下一個子對象進行移動。當目標點都移動完時,車輛會銷毀自身游戲對象。移動的腳本如下:void
Move()
{
if
(index
>
positions.Length
-
1)
return;
transform.LookAt(positions[index].position);
transform.Translate(Vector3.forward.normalized
*
Time.deltaTime
*
nowSpeed);
if
(Vector3.Distance(positions[index].position,transform.position)
<
0.2f)
{
index++;
}
if
(index
>
positions.Length
-
1)
{
ReachDestination();
}
}
銷毀自身游戲對象的腳本如下:void
ReachDestination()
{
GameObject.Destroy(this.gameObject);
}
車輛是通過自身游戲物體上的射線來與游戲物體的碰撞體(collider)進行碰撞,并通過與子碰撞到的對象的Tag進行判斷該進行怎么樣的行動。當Tag為Red(紅燈)、People(行人)和Car(車輛)時,速度將變成0以停止移動;當Tag為Green(綠燈)時將進行移動;當Tag為TrafficPilice(交警)和TrafficPiliceUpgrade(交警)時,將執行交警腳本;若射線沒有與游戲對象進行碰撞,則移動。車輛的碰撞檢測代碼如下:void
Update()
{
Move();
Ray
ray
=
new
Ray(transform.position
+
transform.forward,
transform.forward);
Vector3
forward
=
transform.TransformDirection(Vector3.forward);
Debug.DrawRay(ray.origin,
forward,
Color.green);
RaycastHit
hit;
int
layA
=
LayerMask.NameToLayer("TrafficLights");
int
layB
=
LayerMask.NameToLayer("Enemy");
bool
isCollider
=
Physics.Raycast(transform.position,
transform.forward,
out
hit,
3f,
(1
<<
layA)
|
(1
<<
layB),
QueryTriggerInteraction.Collide);
if
(isCollider)
{
if
(hit.collider.tag
==
"Red"
||
hit.collider.tag
==
"People"
||
hit.collider.tag
==
"Car")
{
nowSpeed
=
0;
}
if
(hit.collider.tag
==
"Green")
{
nowSpeed
=
speed;
}
if(hit.collider.tag
==
"TrafficPolice")
{
TrafficPolice1(5f);
}
if
(hit.collider.tag
==
"TrafficPoliceUpgrade")
{
TrafficPolice1(3f);
}
}
else
{
nowSpeed
=
speed;
}
}
當車輛的射線與Tag為TrafficPilice(交警)和TrafficPiliceUpgrade(交警)的游戲對象進行碰撞時,車輛的速度將會變成0,并顯示車輛身上的Slider來表示車輛被測量酒精含量的等待時間;在時間結束后,車輛將繼續移動。交警的代碼如下:public
void
TrafficPolice1(float
x)
{
if
(TT
==
true)
{
StopAllCoroutines();
}
else
{
StartCoroutine(TrafficPolice2(x));
}
}
IEnumerator
TrafficPolice2(float
x)
{
totalTime
=
x;
if
(TT
==
false)
{
TimeGO.SetActive(true);
nowSpeed
=
0;
for
(int
i
=
0;i
<=
x;i++)
{
yield
return
new
WaitForSeconds(1);
Debug.Log(x);
totalTime
-=
1;
TimeSlider.value
=
totalTime/x;
if
(i
==
x)
{
TT
=
true;
}
}
}
酒駕車輛的設計與實現酒駕車輛的移動代碼與正常行駛的車輛一樣,但在射線與游戲物體發生碰撞時判斷條件不一樣,且功能不一樣;只有當碰撞體的Tag為car(車輛)時,車輛的速度才會變成0,從而停止移動;當Tag為TrafficPilice(交警)和TrafficPiliceUpgrade(交警)時車輛的速度將會變成0,并顯示車輛身上的Slider來表示車輛被測量酒精含量的等待時間;在時間結束后,車輛將銷毀自身;當Tag為People(行人)時,游戲失敗,且顯示游戲失敗UI。碰撞檢測代碼如下:if
(isCollider)
{
if
(hit.collider.tag
==
"Car")
{
nowSpeed
=
0;
}
if
(hit.collider.tag
==
"TrafficPolice")
{
TrafficPolice1(2f);
}
if
(hit.collider.tag
==
"TrafficPoliceUpgrade")
{
TrafficPolice1(5f);
}
if
(hit.collider.tag
==
"People")
{
GameManager.Instance.Failed();
}
}
else
{
nowSpeed
=
speed;
}
當Tag為TrafficPilice(交警)和TrafficPiliceUpgrade(升級交警)所執行的代碼如下:IEnumerator
TrafficPolice2(float
x)
{
totalTime
=
x;
if
(TT
==
false)
{
TimeGO.SetActive(true);
nowSpeed
=
0;
for
(int
i
=
0;
i
<=
x;
i++)
{
yield
return
new
WaitForSeconds(1);
Debug.Log(x);
totalTime
-=
1;
TimeSlider.value
=
totalTime
/
x;
if
(i
==
x)
{
TT
=
true;
}
}
}
GameObject.Destroy(this.gameObject);
}
行人的設計與實現行人與車輛的移動代碼與正常行駛的車輛沒有太大區別,除了在射線碰撞中Tag為Red(紅燈)與Tag為Green(綠燈)時結果以外且不與Tag為TrafficPilice(交警)和TrafficPiliceUpgrade(升級交警)的游戲對象進行碰撞檢測外;行人多了一個Animator組件(圖4-6),通過組件里的Bool值Walk來判斷行人是否在移動。圖4-6行人的Animator組件行人的動畫判斷腳本如下:if(nowSpeed
==
speed)
{
man.SetBool("Walk",
true);
}
else
if(nowSpeed
==
0)
{
man.SetBool("Walk",
false);
}
紅綠燈的設計與實現紅綠燈功能的是通過綠燈時間與紅的時間分別顯示和隱藏不同GameObject實現的,不同的GameObject內的Tag不一樣,分別為Red(紅燈)和Green(綠燈)。圖4-7Tag為Green(綠燈)的游戲對象圖4-8Tag為Red(紅燈)的游戲對象紅綠燈的根據綠燈時間和紅燈時間分別顯示和隱藏不同GameObject和在游戲場景中顯示紅燈時間和綠燈時間,是通過IEnumerator接口實現的;它是一個真正的集合訪問器,沒有它,就不能使用foreach語句遍歷數組或集合,因為只有IEnumerator對象才能訪問集合中的項,假如連集合中的項都訪問不了,那么進行集合的循環遍歷是不可能的事情了。實現根據綠燈時間和紅燈時間分別顯示和隱藏不同GameObject的代碼與顯示紅燈時間與綠燈時間的代碼如下:public
IEnumerator
Red()
{
for(;
;
)
{
while
(NowRedTime
>
0)
{
x
=
false;
TimeText.text
=
""
+
NowRedTime;
TimeText.color
=
Color.red;
yield
return
new
WaitForSeconds(1);
NowRedTime--;
}
yield
return
new
WaitForSeconds(NowRedTime);
NowGreenTime
=
GreenTime;
while
(NowGreenTime
>
0)
{
x
=
true;
TimeText.text
=
""
+
NowGreenTime;
TimeText.color
=
Color.green;
yield
return
new
WaitForSeconds(1);
NowGreenTime--;
}
yield
return
new
WaitForSeconds(NowGreenTime);
NowRedTime
=
RedTime;
yield
return
null;
}
}
玩家修改紅綠燈的紅燈時間與綠燈時間是通過紅綠燈游戲對象上的一個UI(圖4-9)來進行,且玩家只能輸入大于零的整數,諾玩家輸入不為大于零的整數時,紅綠燈的游戲對象上會彈出錯誤提示(圖4-9)。圖4-9紅綠燈游戲對象上的UI圖4-10錯誤提示紅綠燈時間修改UI代碼如下:public
void
ChangerTime()
{
String
Rtext
=
ChangerRedTime.text;
String
Gtext
=
ChangerGreenTime.text;
if
(Rtext
==
null
||
Rtext.Equals("")
||
Gtext
==
null
||
Gtext.Equals(""))
{
Wrong.SetActive(true);
}
else
{
float
r
=
Convert.ToSingle(ChangerRedTime.text);
float
g
=
Convert.ToSingle(ChangerGreenTime.text);
if
(r
<
0
||
g
<
0)
{
Wrong.SetActive(true);
}
else
{
GreenTime
=
g;
RedTime
=
r;
TlUi.SetActive(false);
Wrong.SetActive(false);
ShowButton.SetActive(true);
}
}
}
交警的設計與實現游戲中的交警只是作為一個被車輛的射線碰撞測速判斷是否執行酒精檢測的游戲對象,所以交警的游戲對象上并無代碼,只有Tag為TrafficPilice(交警)和TrafficPiliceUpgrade(升級交警)的游戲對象。測速攝像機的設計與實現測速攝像機的功能是通過OnTriggerEnter的接口實現的,OnTriggerEnter的功能是當碰撞器進入觸發器時OnTriggerEnter被調用;所以當Tag為Car(車輛)的游戲對象的Collider(碰撞體)進入測速攝像機的Collider(碰撞體)時,測速攝像機會讀取Tag為Car(車輛)的游戲對象上的腳本里的Speed(速度),并將其顯示在測速UI(圖4-11)上。圖4-11測速UI測速的代碼如下:private
void
OnTriggerEnter(Collider
other)
{
if(other.tag
==
"Car")
{
Car
=
other.gameObject;
Speed
=
Car.GetComponent<Enemy>().speed;
SpeedText.text
=
"時數:"
+
Speed*10
+
"KM/S";
}
}
游戲功能設計與實現游戲對象自動生成的設計與實現游戲對象的自動生成是通過IEnumerator接口和Instantiate實現的,且在此基礎上加入一個foreach進行遍歷;用foreach遍歷相較于for效率更高且不用擔心數組的索引是幾;以腳本Wave為遍歷條件(Wave腳本中的是保存每一波敵人所生成所需的屬性),并設置publicWave[]waves來決定要生成多少組游戲對象。Wave的腳本如下://保存每一波敵人所生成所需的屬性
[System.Serializable]
public
class
Wave
{
public
GameObject
enemyPrefab;
public
int
count;
public
float
rate;
}
游戲對象生成的腳本如下:public
class
EnemySpawner
:
MonoBehaviour
{
public
static
int
CountEnemyAlive
=
0;
public
Wave[]
waves;
public
Transform
START;
public
float
waveRate
=
0.2f;
private
Coroutine
coroutine;
private
void
Start()
{
coroutine
=
StartCoroutine(SpawnEnemy());
}
public
void
Stop()
{
//StopCoroutine(coroutine);
}
IEnumerator
SpawnEnemy()
{
foreach(Wave
wave
in
waves)
{
for(int
i
=
0;
i
<
wave.count;
i++)
{
CountEnemyAlive++;
GameObject.Instantiate(wave.enemyPrefab,
START.position,
START.rotation);
if(i!=wave.count-1)
yield
return
new
WaitForSeconds(wave.rate);
}
yield
return
new
WaitForSeconds(waveRate);
}
while(CountEnemyAlive
>
0)
{
yield
return
0;
}
//GameManager.Instance.Win();
}
}
圖4-12開發者可通過游戲對象生成器進行調整在游戲場景中生成交警的設計與實現在游戲場景中創建交警是先通過按UI上的創建交警按鈕,并選中可創建交警的位置進行創建。并在一個Tag為MapCube和Layer為MapCube的名為MapCube的游戲對象上生成交警游戲對象(圖4-13)。圖4-13MapCube的游戲對象MapCube游戲對象上有用于生成交警、升級交警、撤離交警和通過自身的顏色變化提示是否可以創建交警的腳本。MapCube生成交警代碼如下:
public
void
BuildTp(TP_Data
tpData)
{
this.tpData
=
tpData;
isUpgraded
=
false;
tpGO
=
GameObject.Instantiate(tpData.GoPrefab,
transform.position,
Quaternion.identity);
GameObject
effect
=
GameObject.Instantiate(buildEffect,
transform.position,
Quaternion.identity);
Destroy(effect,
1.5f);
}
MapCube升級交警的代碼如下:
public
void
UpgradeTp()
{
if
(isUpgraded
==
true)
return;
Destroy(tpGO);
isUpgraded
=
true;
tpGO
=
GameObject.Instantiate(tpData.GoUpgradedPrefab,
transform.position,
Quaternion.identity);
GameObject
effect
=
GameObject.Instantiate(buildEffect,
transform.position,
Quaternion.identity);
Destroy(effect,
1.5f);
}
MapCube撤離交警的代碼如下:public
void
DestroyTp()
{
Destroy(tpGO);
GameObject
effect
=
GameObject.Instantiate(buildEffect,
transform.position,
Quaternion.identity);
Destroy(effect,
1.5f);
isUpgraded
=
false;
tpGO
=
null;
tpData
=
null;
}
MapCube改變自身顏色的代碼如下:void
OnMouseEnter()
{
if(tpGO
==
null
&&
EventSystem.current.IsPointerOverGameObject()==false)
{
renderer.material.color
=
Color.green;
}
}
void
OnMouseExit()
{
renderer.material.color
=
Color.white;
}
在項目中創建一個保存交警信息(TP_Data)的腳本,用于存放交警的游戲對象、升級交警的游戲對象、生成交警所花費的人力、升級交警所花費人力。TP_Data的代碼如下:using
System.Collections;
using
System.Collections.Generic;
using
UnityEngine;
[System.Serializable]
public
class
TP_Data
{
public
GameObject
GoPrefab;
public
int
cost;
public
GameObject
GoUpgradedPrefab;
public
int
costUpgraded;
public
GoType
type;
}
public
enum
GoType
{
TrafficPolice
}
名為BuildTP的腳本是用于根據玩家手上的人力資源與MapCube上是否已經存在游戲對象,從而來判斷是否能在MapCube上生成交警和判斷是否能升級交警。且BuildTP腳本可讀取TP_Data的腳本來設置交警的數據(圖4-9)。圖4-14設置交警數據的游戲對象BuildTP腳本上判斷是否能生成交警和是否能升級交警的腳本如下:void
Update()
{
if
(Input.GetKeyDown(KeyCode.Z))
{
OnNull();
}
if
(Input.GetMouseButtonDown(0))
{
if
(EventSystem.current.IsPointerOverGameObject()
==
false)
{
//交警的建造
Ray
ray
=
Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit
hit;
bool
isCollider
=
Physics.Raycast(ray,
out
hit,
1000,
LayerMask.GetMask("MapCube"));
if
(isCollider)
{
MapCube
mapCube
=
hit.collider.GetComponent<MapCube>();//得到點擊的mapCube
if
(selectedGoData
!=
null
&&
mapCube.tpGO
==
null)
{
Debug.Log("bbb");
//可以創建
if
(man
>=
selectedGoData.cost)
{
ChangeMoney(-selectedGoData.cost);
mapCube.BuildTp(selectedGoData);
}
else
{
//人力不夠
manAnimator.SetTrigger("Flicker");
}
}
else
if
(mapCube.tpGO
!=
null)
{
//升級處理
if
(mapCube.tpGO
==
selectedMapCube
&&
upgradeCanvas.activeInHierarchy)
{
StartCoroutine(HideUpgradeUI());
}
else
{
ShowUpgradeUI(mapCube.transform.position,
mapCube.isUpgraded);
}
selectedMapCube
=
mapCube;
}
}
}
}
}
在MapCube上會綁定一個用于升級交警和撤離交警的UI(圖4-15),是通過判斷玩家所擁有和資源和MapCube游戲對象上是否存在交警進行判斷而顯示,且判斷MapCube游戲對象上交警是否已經升級來播放動畫提示玩家交警已升級。圖4-15升級交警與撤離交警UIBuildTP上關于升級交警和撤離交警的代碼如下:void
ShowUpgradeUI(Vector3
pos,
bool
isDisableUpgrade
=
false)
{
StopCoroutine("HideUpgradeUI");
upgradeCanvas.SetActive(false);
upgradeCanvas.SetActive(true);
upgradeCanvas.transform.position
=
pos;
buttonUeractable
=
!isDisableUpgrade;
}
IEnumerator
HideUpgradeUI()
{
upgradeCanvasAnimator.SetTrigger("Hide");
yield
return
new
WaitForSeconds(0.8f);
upgradeCanvas.SetActive(false);
}
public
void
OnDestroyButtonDown()
{
if
(selectedMapCube.isUpgraded
==
true)
{
ChangeMoney(+(selectedGoData.costUpgraded+
selectedGoData.cost));
}
if
(selectedMapCube.isUpgraded
==
false)
{
ChangeMoney(+selectedGoData.cost);
}
selectedMapCube.DestroyTp();
StartCoroutine(HideUpgradeUI());
}
public
void
OnUpgradeButtonDown()
{
if
(man
>=
selectedMapCube.tpData.costUpgraded)
{
ChangeMoney(-selectedMapCube.tpData.costUpgraded);
selectedMapCube.UpgradeTp();
}
else
{
manAnimator.SetTrigger("Flicker");
}
StartCoroutine(HideUpgradeUI());
}
游戲場景中攝像機的操控設計與實現游戲中的攝像機玩家可以通過WSAD來控制攝像機的平行位置,并通過滾輪來調整攝像機的垂直位置。控制攝像機的代碼如下:public
float
speed
=
1;
public
float
mouseSpeed
=
60;
//
Update
is
called
once
per
frame
void
Update()
{
float
h
=
Input.GetAxis("Horizontal");
float
v
=
Input.GetAxis("Vertical");
float
mouse
=
Input.GetAxis("Mouse
ScrollWheel");
transform.Translate(new
Vector3(h
*
speed,
mouse*mouseSpeed,
v
*
speed)
*Time.deltaTime,Space.World);
}
游戲的暫停功能的設計與實現為了防止玩家手忙腳亂,游戲中會有暫停功能,玩家可通過UI中的暫停按鍵和繼續按鍵進入暫停狀態;在暫停狀態下,玩家依然可以生成交警和改變紅綠燈的時間。實現游戲暫停功能的代碼如下:public
void
OnStop()
{
Debug.Log("游戲暫停");
Time.timeScale
=
0;
}
public
void
UpStop()
{
Debug.Log("游戲繼續");
Time.timeScale
=
1;
}
游戲的打包和導出當游戲編寫完成后,需要將項目打包并導出。在Unity3D的界面File中,選擇BuildSettings,就會顯示BuildSetting界面(圖4-16);將需要打包的場景導入,且選擇相應的導出格式,之后按Build按鈕,即可實現打包并導出項目。圖4-16打開BuildSetting進行打包游戲打包并導出完成后,即可獲得如圖4-17的文件圖4-17打包發布后的文件游戲測試游戲功能測試游戲的功能表的表頭分別是用例描述、測試步驟、預測結果和實際結果。表5-1游戲UI功能測試表用例描述測試步驟預測結果實際結果開始游戲在主界面按開始游戲按鈕進入第一個游戲場景進入第一個游戲場景退出游戲在主界面按退出游戲按鈕退出游戲程序退出游戲程序暫停游戲在游戲場景中按暫停游戲的按鈕暫停游戲,并退出暫停游戲菜單暫停游戲,并退出暫停游戲菜單返回主菜單在暫停界面中按返回主菜單按鈕返回游戲主菜單返回游戲主菜單繼續游戲在暫停界面中按繼續游戲按鈕繼續游戲繼續游戲開啟暫停游戲狀態在游戲場景中按暫停按鈕開啟狀態游戲狀態,且玩家可繼續控制游戲開啟狀態游戲狀態,且玩家可繼續控制游戲繼續游戲狀態在游戲場景中按繼續按鈕繼續游戲繼續游戲游戲剩余時間UI在游戲中等待游戲剩余時間減少剩余時間減少剩余時間減少游戲得分UI等待正常行駛車輛、酒駕車輛和行人到達終點正常行駛車輛、酒駕車輛和行人到達終點,得分UI里的分數提高正常行駛車輛、酒駕車輛和行人到達終點,得分UI里的分數提高測速UI等待正常行駛車輛和酒駕車輛通過測速攝像機測速UI顯示相應的車速測速UI顯示相應的車速生成測量酒精檢查點點擊測量酒精檢查點按鈕,在相應的位置生成檢測酒精檢查點在相應的位置生成檢測酒精檢查點,且檢測酒精檢測點功能正常在相應的位置生成檢測酒精檢查點,且檢測酒精檢測點功能正常交警空閑人數UI完成生成測量酒精檢查點的操作;升級測量酒精檢查點;撤離測量酒精檢查點交警空閑人數UI在生成時空閑人數數量減一;升級測量酒精檢查點人數減一;撤離測量酒精檢查點人數加一或加二交警空閑人數UI在生成時空閑人數數量減一;升級測量酒精檢查點人數減一;撤離測量酒精檢查點人數加一或加二結算UI等待游戲剩余時間為0時當游戲剩余時間為0時,顯示結算UI,并顯示玩家最終得分當游戲剩余時間為0時,顯示結算UI,并顯示玩家最終得分進入下一關卡在結算UI中按下一關的按鈕進入下一個進入下一個在結算UI中返回主菜單在結算UI中按返回主菜單的按鈕返回主菜單返回主菜單表5-2游戲對象生成測試用例描述測試步驟預測結果實際結果生成正常行駛的車輛在游戲場景中等待正常行駛車輛的生成生成正常行駛車輛,且按照指定好的路線移動生成正常行駛車輛,且車輛安裝指定好的路線移動生成行人在游戲場景中等待正常行駛行人的生成生成行人,且按照指定好的路線移動生成行人,且按照指定好的路線移動生成酒駕車輛在游戲場景中等待正常行駛酒駕的生成生成酒駕車輛,且按照指定好的路線移動生成酒駕車輛,且按照指定好的路線移動
總結 通過完成基于Unity3D交通管理模擬器的開發,標志著我畢設的完成,也標志著我大學學習生涯的結束;在做畢設的過程中,我學習了不少關于塔防游戲制作流程的知識,在此過程中我受益匪淺。 在制作過程中,我學習了在不使用Navigation插件的情況下,如何完成一個3D的AI腳本制作,讓我了解AI的尋路系統的大致代碼邏輯。但要是從0開始制作AI腳本對我來說難度十分巨大,為此我在網上查閱了不少的教程,并針對我的畢設所需要實現的AI功能進行學習。而在關于如何在一個游戲對象上生成一個新的游戲對象的功能實現也讓我十分頭痛,因為在制作此次畢設的過程中我并沒有做過此功能,但我跟著網上開發一款塔防游戲的網課先做了一款基本功能完整的塔防游戲后,明白了該如何實現此功能并用于我的畢設游戲中。 為了游戲的玩法設計,我在網上查詢了不少關于交警日常工作和城市規劃的知識;在此過程中,網上查閱的資料不止讓我將其簡化加入到了畢設游戲的玩法中,也讓我了解了另一個領域的知識,對我來說也是一種進步。 但我對于我的畢設游戲并不是十分滿意,認為還能加入更多的功能和關卡,如把游戲做成一個玩家不但能操作城市規劃還能控制一名交警在城市中進行工作的游戲,但因本人的技術有限無法完成,為此我會在大學畢業后繼續深入學習Unity3D,提高自己的技術水平,以此來實現完成能表達自己觀點和可玩性更高的游戲。
參考文獻苗藝楠;申閆春.基于Unity3D的交通事故虛擬再現系統研究.北京:北京工業大學文法學部,1006-9348(2018)12-0122-05謝新慧,司占軍,劉恩銳.基于Unity3D的汽車展示系統的設計與制作.安徽:電腦知識與技術Vol.14,2018年11月第14期胡杭.基于Unity3D的移動塔防游戲設計與實現].廣州:現代計算機,2019.02上沈馬躍,王藝超.基于Unity3D的交通安全交互式課件的設計與制作,安徽:電腦知識與技術期刊,2019.15-5徐欣祺,葉江涵,曹洪濤,高子軒,王詩語.基于機器學習與3D可視化技術的智慧交警系統.現代信息科技,2019第3卷第13期,7月10日段薛孔,李潼,朱旭東,吳蘭.Unity3D游戲場景中人物角色動畫的設計.安徽:電腦知識與技術期刊,2019.15-9仲曉慶,蔡朝暉,基于unity3D的塔防游戲開發,黑龍江省:科技創新與應用,2018年29期張茜,基于Unity3D的汽車功能模擬與駕駛場景演示系統的設計和實現,東南大學毛翔宇,基于Unity3D的非真人玩家(NPC)智能行為分析,湖北武漢:武漢紡織大學計算機學院430200程廷,潘耘,姜瑞娟.基于Unity3D的蟻群算法仿真,北京:中國傳媒大學學報自然科學,第24卷,第3期程彬彬,王明鑫,商楠.淺談游戲開發平臺Unity3D的應用與發展前景.遼寧沈陽:沈陽理工大學,110159盧毅,周維,高語陽.基于Unity3D引擎的虛擬測量設備的設計.蘇州中科天啟遙感科技有限公司,江蘇蘇州215000;南京航空航天大學航天學院,江蘇南京210016任諾文.基于Unity3d的多出口行人流疏散仿真.內蒙古:內蒙古大學.2018年4月25日李兵川.基于Unity3D游戲開發流程分析.重慶:重慶科創職業學院,402160
致謝隨著畢業設計的完成,我的大學生涯也步入了尾聲。在此特別感謝我的指導老師楊超老師,在我制作畢業設計的過程中給予了我不少的幫助。也感謝我的游戲設計與制作老師吳志達老師,是您帶我跨進游戲制作大門,踏入了游戲制作的世界。同時也感覺網上無私分享的極客們,是你們讓我的游戲制作水平不斷進步。最后感謝我的同學和室友,是你們陪伴了我走完四年美好的大學生活。在此我也感謝我的所有大學老師們,是你們讓我在四年的大學生活里不斷成長和進步。由衷的感謝我的指導老師吳志達,感謝關心幫助我的同學,感謝所有的課程老師,感謝我的母校。在此向他們表示深深的謝意。
電腦故障檢測卡代碼表
1、特殊代碼"00"和"ff"及其它起始碼有三種情況出現:
①已由一系列其它代碼之后再出現:"00"或"ff",則主板ok。
②如果將cmos中設置無錯誤,則不嚴重的故障不會影響bios自檢的繼續,而最終出現"00"或"ff"。
③一開機就出現"00"或"ff"或其它起始代碼并且不變化則為主板沒有運行起來。
2、本表是按代碼值從小到大排序,卡中出碼順序不定。
3、未定義的代碼表中未列出。
4、對于不同bios(常用ami、award、phoenix)用同一代碼代表的意義不同,因此應弄清您所檢測的電腦是屬于哪一種類型的bios,您可查閱您的電腦使用手冊,或從主板上的bios芯片上直接查看,也可以在啟動屏幕時直接看到。
5、有少數主板的pci槽只有一部分代碼出現,但isa槽有完整自檢代碼輸出。且目前已發現有極個別原裝機主板的isa槽無代碼輸出,而pci槽則有完整代碼輸出,故建議您在查看代碼不成功時,將本雙槽卡換到另一種插槽試一下。另外,同一塊主板的不同pci槽,有的槽有完整代碼送出,如dell810主板只有靠近cpu的一個pci槽有完整代碼顯示,一直變化到"00"或"ff",而其它pci槽走到"38"后則不繼續變化。
6、復位信號所需時間isa與pci不一定同步,故有可能isa開始出代碼,但pci的復位燈還不熄,故pci代碼停要起始代碼上。
代碼對照表
00.已顯示系統的配置;即將控制INI19引導裝入。
01處理器測試1,處理器狀態核實,如果測試失敗,循環是無限的。處理器寄存器的測試即將開始,不可屏蔽中斷即將停用。CPU寄存器測試正在進行或者失敗。
02確定診斷的類型(正常或者制造)。如果鍵盤緩沖器含有數據就會失效。停用不可屏蔽中斷;通過延遲開始。CMOS寫入/讀出正在進行或者失靈。
03清除8042鍵盤控制器,發出TESTKBRD命令(AAH)通電延遲已完成。ROMBIOS檢查部件正在進行或失靈。
04使8042鍵盤控制器復位,核實TESTKBRD。鍵盤控制器軟復位/通電測試。可編程間隔計時器的測試正在進行或失靈。
05如果不斷重復制造測試1至5,可獲得8042控制狀態。已確定軟復位/通電;即將啟動ROM。DMA初如準備正在進行或者失靈。
06使電路片作初始準備,停用視頻、奇偶性、DMA電路片,以及清除DMA電路片,所有頁面寄存器和CMOS停機字節。已啟動ROM計算ROMBIOS檢查總和,以及檢查鍵盤緩沖器是否清除。DMA初始頁面寄存器讀/寫測試正在進行或失靈。
07處理器測試2,核實CPU寄存器的工作。ROMBIOS檢查總和正常,鍵盤緩沖器已清除,向鍵盤發出BAT(基本保證測試)命令。.
08使CMOS計時器作初始準備,正常的更新計時器的循環。已向鍵盤發出BAT命令,即將寫入BAT命令。RAM更新檢驗正在進行或失靈。
09EPROM檢查總和且必須等于零才通過。核實鍵盤的基本保證測試,接著核實鍵盤命令字節。第一個64KRAM測試正在進行。
0A使視頻接口作初始準備。發出鍵盤命令字節代碼,即將寫入命令字節數據。第一個64KRAM芯片或數據線失靈,移位。
0B測試8254通道0。寫入鍵盤控制器命令字節,即將發出引腳23和24的封鎖/解鎖命令。第一個64KRAM奇/偶邏輯失靈。
0C測試8254通道1。鍵盤控制器引腳23、24已封鎖/解鎖;已發出NOP命令。第一個64KRAN的地址線故障。
0D1、檢查CPU速度是否與系統時鐘相匹配。2、檢查控制芯片已編程值是否符合初設置。3、視頻通道測試,如果失敗,則鳴喇叭。已處理NOP命令;接著測試CMOS停開寄存器。第一個64KRAM的奇偶性失靈
0E測試CMOS停機字節。CMOS停開寄存器讀/寫測試;將計算CMOS檢查總和。初始化輸入/輸出端口地址。
0F測試擴展的CMOS。已計算CMOS檢查總和寫入診斷字節;CMOS開始初始準備。.
10測試DMA通道0。CMOS已作初始準備,CMOS狀態寄存器即將為日期和時間作初始準備。第一個64KRAM第0位故障。
11測試DMA通道1。CMOS狀態寄存器已作初始準備,即將停
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 游泳救生員職業生涯規劃分析試題及答案
- 農作物種子繁育員職業資格考試專業深度試題及答案
- 2024年農業植保員考試三大重要模塊試題及答案
- 高校輔導員的職業滿意度考察試題及答案
- 證券從業資格證考試創新方法與思路試題及答案
- 深入探討項目管理中的文化因素影響試題及答案
- 項目管理考試備考中的常見誤區與正解實踐試題及答案
- 2025年證券從業資格證考試金融事件解析試題及答案
- 證券從業資格證的全景復習試題及答案
- 項目管理考試文獻及試題及答案
- 軟件測試技術課程教學大綱
- 河流納污能力計算
- 液壓與氣壓傳動完整版課件
- 鉆井液防塌機理與措施-第六組
- 停車場應急預案
- 研究生在讀證明.docx
- 觀音庵收費站關于計重設備的管理和使用細則
- 卡農曲譜canon-in-D-鋼琴小提琴合奏-五線譜(共6頁)
- IATF16949:2016中文完整
- 2020年度希望之星英語大賽小低組看圖說話(圖文五篇
- 場營銷學試題含答案
評論
0/150
提交評論