




已閱讀5頁,還剩25頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
基于Unity3D的角色扮演類游戲設計專業:數字媒體技術【摘要】游戲開發行業,隨著移動領域的崛起,近年來變得越加火熱,各游戲開發公司紛紛投入移動游戲的研究開發,其中Unity3D和Cocos2D兩款引擎受到了各公司的青睞,游戲開發人員供不應求。本文將介紹如何用Unity3D引擎開發一款角色扮演類游戲的全過程,其中包含了Unity3D引擎使用的介紹、游戲策劃及游戲各大功能模塊的實現。在游戲策劃中將規劃整個游戲項目的背景故事,游戲場景,游戲系統等,為后面實現游戲功能代碼打好基石。在游戲程序開發中,將使用Unity3D提供的編輯器結合C#先實現游戲流程整個程序框架,然后按照框架流程完成游戲各個模塊的功能,最后將游戲進行Windows和Android雙平臺打包調試。1 前言1.1 項目背景與設計理念隨便國家的富強,科技的發展,越來越多的人們需要在工作閑時進行娛樂休閑,游戲產業也隨之誕生。在21世紀的互聯網高速發展之期,游戲行業不斷壯大,從最早的紅白機時代,再到主機時代,隨后PC計算機的崛起讓游戲行業大放光彩,直到近年來移動領域的熱潮又將手機游戲推向了頂峰。在這樣的背景下,也越來越多的公司投入的游戲研發中,不過由于每次開發一款游戲都得重頭開始編碼,效率低,成本高,所以游戲設計者想如何去復用之前的東西從而進行快速發開。慢慢的,游戲引擎(GameEngine) 問世了,它集成了圖形引擎、物理引擎、碰撞檢測系統、音效、腳本引擎、電腦動畫、人工智能、網絡引擎以及場景管理等,為游戲設計者提供各種編寫游戲所需的各種工具,大大提高了游戲設計者開發游戲的時間和成本。1.2 游戲設計方法與實現技術角色扮演類游戲(Role-Playing Game),提供虛擬的計算機游戲世界,該游戲世界提供虛擬的游戲角色供玩家選擇并操作,最終使得玩家在該世界實現自己的第二人生為目標。RPG框架的設計和研究自RPG誕生以來不斷進步,至今發展到由引擎技術制作的時代。RPG游戲設計較為復雜,系統主要以戰斗、劇情、任務,交互、裝備等系統為主,其中戰斗系統為RPG游戲設計的核心部分。戰斗系統主要包含:1、 屬性系統:這是游戲中最簡單的系統,包括了主角、物品、NPC、技能、怪物等各自的屬性值,通過屬性值可計算出戰斗中各種邏輯交互數值。2、 狀態機系統:該系統標志著一個人物或者怪物現處于什么狀態,相對于動作而言,人物是站立中?還是跑動中?還是與敵人打斗中?當然有些狀態還是可以同時擁有的,這些狀態需要在程序中利用不同的變量值來區分。所以戰斗規則越多,狀態機邏輯也就越復雜,所以在開發過程中需要預先制定好一套方案,否則在后續開發中將越加難以維護。3、 行為系統:該系統決定了游戲的表演方式,每一個動作或者聲音的表現都由行為系統來管理。4、 人工智能(AI):該系統主要為了人機交互而生,在戰斗過程中,敵人將以怎樣的表現和玩家對戰,越是強大的敵人,其AI設計過程也就越復雜,需要通過不一樣的算法結合起來推導出一套怪物的AI指令。1.3 本項目的設計思路與實現技術本項目將設計一款角色扮演類游戲,游戲將采用Unity引擎進行制作,游戲中將實現游戲登錄、交互、戰斗、保存等幾大功能,各功能間還包含了許多與之相依賴的小功能。項目利用.net下mono的跨平臺編譯技術,使用C#在windows環境下進行跨平臺開發,再結合Unity引擎提供了強大的API函數庫和渲染引擎技術來實現整個RPG游戲的技術實現。1.4 本項目的主要工作任務本項目的的主要設計工作包括:(1) 設計一款基于移動平臺的RPG游戲(2) 策劃RPG游戲各模塊玩法及系統功能(3) 利用Unity3D引擎完整的實現游戲所有功能(4) 對最終實現游戲進行打包調試本項目通過對Unity3D引擎的一年的學習,實驗了許多的小項目,最后總結了如何利用它來快速開發一款RPG游戲,從前期的游戲策劃,游戲功能布局,再到游戲的程序框架、功能開發,到最后的打包調式,本文都將通過該實例一一描述。2 項目介紹2.1游戲引擎介紹Unity3D是一款由Unity Technologies開發的跨平臺游戲引擎,該引擎集成了強大的可視化用戶編輯器,采用了組件式開發,使開發者能快速的開發出自己的游戲。該引擎由于可進行跨平臺發開,在移動領域崛起時,受到了很多開發者的青睞,現已越來越多的開發者投入其中,已成為目前世界上使用最廣泛的游戲引擎。在圖形方面,Untiy3D采用了主流的實時光照,Lightmapping,全局光照GI等技術,使游戲界面更加逼真。在程序方面,該引擎支持用C#和原生的UntiyScript進行開發,大大加快了用戶開發進度,而且還提供了AssetStore商店,讓開發者能在里面找到想要的插件,能快速實現想要的功能及效果。2.2 游戲介紹本文將以中國古代唐朝做為歷史背景,利用Unity3D開發一款基于移動端的ARPG手游。游戲類型:ARPG游戲平臺:Win、Android游戲風格:中國古代游戲玩法:玩家通過副本戰斗消滅敵人獲得獎勵,還可以通過商店購買等不斷強大自己。2.3 游戲故事背景在開發游戲前,制定一個好的背景題材將決定了游戲后期的發展。如何定一個好的故事背景,需要針對玩家的喜好而決定,好的題材將更喜歡玩家的關注,所以好的故事題材將為游戲奠定基石。本文中,制定了近期較為火熱的中國古代唐朝題材為背景故事,打造一款即時戰斗的ARPG游戲,讓玩家在游戲中體驗打斗的快感和古典韻味。2.4 游戲場景游戲場景作為游戲主要的交互區,它承載了玩家在游戲中的大部分交互,其對游戲的重要性不言而喻。游戲場景可分為2D和3D,2D場景都是由一張張圖片拼成,效果相比3D稍差一些,3D給人感覺更真實,仿佛身臨其境的感覺。游戲場景還分為很多種風格,有古風,韓風,歐美風,日漫風,水墨風格等等,該如何去選擇這就需要根據題材來決定了。本文中由于題材定位中國古代,所以場景也為中國古代風格的場景, 其風格華麗,渾厚莊重,線條平直硬拐,裝飾豐富,令人感覺心曠神怡。 圖2.4 (1)華麗的長安城圖2.4 (2)華麗的長安城2.5 游戲角色一款好玩的游戲、受歡迎的游戲,其中必定有幾位受人歡迎的角色,每個角色有著自己獨特的性格和能力,更加能被玩家們記住。那么要創作一些好的角色也不容易,其中有一點很重要,那就是每個角色都要有自己存在的價值,形成鮮明的對比,要與其他角色與眾不同,因為玩家們總是會喜歡獨特的那位。本文中的游戲主角為一位初出茅廬的道士,道士途中遇到了各種磨難,消滅敵人,一步步的成長起來。道士的武功主要以劍術為主,因為性格較為外向,相信頗受玩家喜愛。本作中還有另外兩位角色,后續還可以繼續為游戲添加新角色,從而豐富游戲哦。圖2.5 帥氣的道士2.6 游戲系統本文中的游戲功能系統主要為分以下幾類u 游戲登錄u 創建角色u 背包系統u 裝備系統u 戰斗系統u 副本系統u 商店系統u NPC系統u 數值系統以上幾類為本游戲大致的游戲功能,這些功能在RPG類型的游戲中必備的幾項,通過這些功能系統,能夠展示出一款RPG游戲的核心玩法。其中數值系統最為重要,一款好的RPG游戲不僅要滿足玩家對畫面以及功能上的需求,還要滿足玩家的虛榮心。一款RPG游戲是不是好玩,和數值的相關性不是特別大,但是游戲是不是不好玩以及能玩的多深入,和數值的關系就很大了。數值做的不好,在表現層面上是讓游戲流程的體驗不好,比較容易出現的兩個極端是過度的挫折感(練功十年,出門就被小兵秒)和茫然所失的成就感(玩家還沒發力,Boss就撲街了?)!所以說,如何巧妙的運用這些數值來構建起整個游戲的可玩性是至關重要的,得學會如何去根據玩家的需求來構建不一樣的數值系統。3 游戲程序框架設計3.1 游戲核心本游戲將采用組件式的模式進行開發,不同組件維護著自己相關的功能,不與其他組件進行直接交互,降低層與層之間的耦合(俗稱:解耦),便于后期維護。本作還將根據MVC模式,即數據模型(游戲數據)、視圖(UI)和控制器(管理器)來編寫整套邏輯程序。MVC模式所帶來的優點:1、開發人員可以只關注整個結構中的其中某一層;2、可以很容易的用新的實現來替換原有層次的實現;3、可以降低層與層之間的依賴;4、有利于標準化;5、利于各層邏輯的復用。數據:管理游戲程序中各種數值數據。視圖:Unity中的控件都必須繼承于Monobehaviour。管理器:對數據和UI進行操作和管理。本文中的管理器都將繼承于Graduation.Component,這個類是本作者自己寫的一個組件管理,利用組件容器將每個管理器加入容器中,便于對各模塊的管理器進行管理和交互。游戲核心架構:游戲核心(GameCore)(單例)游戲管理器(GameManager):場景管理器(SceneManager)數據管理器(DataManager)資源管理器(ResourceManager)UI管理器(UIManager)游戲組件(Component):音效管理器(SoundManager)網絡管理器(NetManager)配置管理器(ConfigManager)邏輯管理器(LogicManager)動畫管理器(AnimationManager)游戲啟動流程:/ 啟動游戲./ 1.加載配置表InitConfig();/ 2.加載組件InitComponent();/ 3.加載游戲資源InitResource();/ 4.初始化網絡模塊InitNetwork();/ 5.進入游戲EnterGame();圖3.1 游戲核心框架流程圖為了游戲開發中的方便使用,作者在開發前已經封裝好了一整套常用工具庫,工具庫大致包含:文件讀寫工具類,數值計算工具類,UI工具類,序列化工具類等。有了這些工具庫,在開發中可以更快速編碼,省去了頻繁寫一些常用邏輯的時間。3.2 游戲UI框架在Unity3D早起的版本里,UI系統在引擎中是較為薄弱的,只能通過Unity提供的一些API來實現UI的搭建,但這種方式效率實在太差,改起來也非常麻煩。由于Untiy越加的火熱,Unity 的Asset Store 商店的插件也越來越多,其中Next-GUI插件(下文簡稱:NGUI)最受開發者歡迎,因為其彌補了Unity本身的弱點,把UI系統變得非常的強大,甚至用完美來形容。使用NGUI插件可以讓用戶通過可視化界面的方式,只要在界面上拖入各種控件、腳本,再結合自己的一些邏輯代碼即可完成游戲所需的界面。在Unity4.6版本中,Unity開發組認識到了UI系統的薄弱,隨即也在該版本發布了新版UI系統(簡稱;UGUI)。它僅吸取了NGUI的各種優點,由于UGUI屬于原生系統,所以性能上會比NGUI好很多,漸漸的也被開發者所接納。在本游戲中,將采用Unity最新的UGUI系統來完成整套游戲UI界面的開發,并講述如何來搭建游戲的UI框架,一套好的UI框架將使后期開發起來更加便捷。圖3.2 游戲UI框架流程圖UIBase:該類為所有UI腳本都繼承的基類,該類重載了大多數MonoBehaviour函數,方便在后期資源管理以及界面動畫等進行統一管理。UIManager:該類將統一管理所有UI界面的顯示、隱藏、動畫、音效,所以需要顯示的UI界面都需要通過該類進行注冊才能使用,該類還提供各種通用UI界面,例如消息框,提示框,輸入框,確認選擇框等等。UIUtils:該類為靜態類,是UI工具庫,將提供大量功能型函數供UI界面使用,例如一些UI對齊,UI的各種位置算法等。有了以上三大類,在后續的界面設計中就能輕松的利用他們實現一套完整的UI框架,實現每一個功能界面的需求。3.3 Lightmapping光照烘焙光照烘焙,該技術是指通過計算機計算模擬得到的燈光效果,省去了采用實時燈光所帶來的高消耗。簡單來說就是實時燈光計算十分耗時,隨著光源越多會倍增計算耗時。使用Lightmap模擬燈光帶來的效果,便不用去計算燈光,會帶來性能上的大大提升。當然你不用燈光效果也是沒問題的,具體還是看項目需求。最簡單的直接在3dmas或maya里面烘培完貼圖頂點色也行。對于移動手機游戲來說,由于硬件的原因,如果在3D游戲中大量的采用實時光照手機的性能是吃不消的,但如果不用實時光照效果又非常差。所以本文的游戲中將采用Untiy Pro版本自帶的Lightmap技術,大大減輕了游戲本身對手機性能帶來的開銷,而且使用Lightmap的畫面效果又非常不錯。首先,先在場景內,在合適的位置打好大量的點光源(Point Light),方向、位置、亮度這些都需要經過細心的調整。圖3.3 (1)Lightmapping的使用其次,打開Lightmapping面板調節具體的參數。圖3.3 (2)Lightmapping的使用由于手游中并不需要太高的畫質,所以這里作者調節的光照品質較為一般。最后,點擊Bake Scene即可開始場景的烘焙,烘焙需要等待一段時間。看看烘焙后的效果是不是感覺好震撼?效果絲毫不遜于實時光照。圖3.3 (3)Lightmapping的使用3.4 序列化與反序化3.4.1 序列化介紹序列化 (Serialization):將數據結構或對象轉換成二進制串的過程反序列化(Deserialize):將在序列化過程中所生成的二進制串轉換成數據結構或者對象的過程這兩個過程在游戲開發中被廣泛的使用,因為其可以讓游戲在跨平臺上方便的進行通訊傳遞,把一個完整的對象通過網絡發送到終端。序列化還能將一個對象永久的保存在硬盤上,可以用于存儲玩家的游戲數據。本文中將采用序列化方式來進行玩家數據存儲,并在序列化過程中加入了加密解密技術,使得游戲數據不會輕易的被玩家所破壞。現在主流的序列化方式大致分為二進制序列化:二進制序列化的優點是可以精確地控制序列化及反序列化的過程,并可以序列化對象的非公共成員。其序列化過程的速度非常之快,而且序列化后的體積小,非常適合用來傳輸實時性較高的應用。但因為缺乏標準的協議,裝拆箱比較麻煩。Json序列化:JSON起源于弱類型語言Javascript,與xml相比,這種序列化簡直是太簡單了,其只需要通過將變量用一個key對應一個value即可完成序列化,而且序列化速度比較快,僅次于Binary方式。Xml序列化:Xml序列化歷史較為悠久了,其缺點太明顯了,冗余太大,但擁有的非常高的安全性與可擴展性,所以至今仍被廣泛的使用著。序列化方案的選擇:每種序列化協議都有優點和缺點,它們在設計之初有自己獨特的應用場景。在系統設計的過程中,需要考慮序列化需求的方方面面,綜合對比各種序列化協議的特性,最終給出一個折衷的方案。3.5.2 序列化應用本文中的游戲為了更節省空間和解析效率,采用二進制序列化方式,并對二進制序列化方案進行了二次封裝,可更方便的在游戲中使用。本文中所有需要序列化的對象都將繼承與SerializeData類,在該類利用.net自帶的ISerializable接口通過BinaryFormatter對所有需要序列化的變量進行序列化并存儲。附:序列化與反序列化代碼(見附錄)3.5表格配置數據讀取在游戲開發中,數值模型起到了很大的作用,它將很大程度上決定了游戲的可玩性。那么如何在游戲開發中方便的配置數值使游戲更具可玩性呢?由于Unity自身有著強大的編輯器,開發者可以直接在編輯器上修改變量的數值從而修改數據模型。但這樣的作法看起來很方便,其實還是有很多弊端的。首先策劃并不見得能很好的使用Unity進行數值編輯,其次這種方式需要程序事先把所有變量都布局好供策劃調整,而且中間經常會因為一些特殊的需求而出問題。所以如果在團隊開發中,配置表格讓策劃自己填寫無非是最好的方式了,策劃只需要關心表中的字段和數值,然后根據游戲實際運行情況調整就行了。本文將介紹如何用csv表格(逗號分隔表)進行數值的讀取,然后將它配置到游戲中去。(一)、用Excel制作csv表格圖3.5(1)制作csv表格為了方便程序中開發使用,本作者自己制定了一套讀取方案。打開Excel表格,填入數值字段及數值。數據行介紹:第一行:對應程序代碼中的表類型第二行:數據字段,字段名對應程序中的表類型成員變量,后綴:s 結尾代表字符串,:a 結尾代表整型數組,如果沒有帶后綴的則默認為整型數值。第三行:以 # 號開頭的行代表這正行的數據作為解釋行,不進行數據讀取。第四行至結尾:這些行每行的數據都代表著一行數據記錄,讀取后寫入內存中方便調用。(二)、保存csv配置表選擇另存為,選擇CSV(逗號分隔)類型的文件,修改文件名為item.csv,然后保存至文檔中。圖3.5(2)保存csv表格(三)、解析csv配置表解析前需要先為該表定義指定數據類及成員變量。圖3.5(3)解析csv配置表如圖3.5(3),建立了兩個類型,一個是CsvBase,該類為所有Csv類型的基類,因為每個表的第一個字段必須是tid。第二個是CsvItem類,也就是我們上文的Csv表對應的類型,注意這里的變量名必須與表里填寫的字段相同。由于這些字段是不可變的,所以為了防止開發中意外將數值覆蓋,所以這里變量加了readonly修飾符,表示只讀。但是如果設為只讀,那在解析表數據的時候要怎么賦值呢?這里又要提到另外一項技術“反射”,利用反射可以給字符串對應的變量進行賦值,并且在反射中是不受readonly所限制的,這樣就能快速的將字段與變量配對,不需要一個一個去判斷那么繁瑣了。解析csv表關鍵點主要是對字符串進行操作,先用File.ReadAllText()將item.csv讀取進來,然后利用string.split對讀取后的字符串進行拆分,先對行進行分割,把數據分割為n行,然后對行進行解析,分析出每一行的作用,將其進行相應的賦值操作。接著對數據行進行逗號拆分,分為每一個數據項,然后利用反射賦值給對應的類型變量中。最后新建一個Dictionary將這些數據存起來供程序中使用。附:Csv配置表解析代碼(見附錄)4 游戲功能模塊實現4.2 創建角色本游戲初始將提供玩家自由創建想要的角色,玩家根據需求創建角色,每個角色都有不一樣的職業。編寫CreateRoleManager類,該類用于管理玩家創建角色,完成確認選擇后將選定的角色數據記錄到UserInfo類用戶數據中并進行存盤,下次玩家再次登錄將可繼續使用該角色。功能需求:1、 創建角色2、 隨機角色名字3、 切換角色4、 選擇角色/ 創建角色public void CreateRole(int roleIndex);/ 切換角色public void ChangeRole(int roleIndex);/ 選擇角色public void SelectRole(int roleIndex);/ 隨機角色名字public string RandomRoleName();/ 進入游戲public void EnterGame();圖4.2(1)創建角色界面圖4.2(2)角色選擇界面4.3 背包系統背包系統將用于存放玩家中打怪掉落的物品,實現該系統我們首先需要為創建一個背包管理器(InventoryManager),利用該管理器根據用戶的背包數據來操作UI控件來實現整個背包系統的邏輯操作以及數據控制。第一步:首先我們需要先分析背包系統在邏輯功能上有幾種基礎操作功能1、 查看物品詳細信息2、 交換背包物品位置,3、 添加物品4、 刪除物品5、 整理背包了解了功能需求,就可以開始功能的實現了,在InventoryManager類下新建幾個功能函數,利用這些函數對界面UI進行操作,實現背包系統的基本功能。/ 查看物品public void LookItemInfo(ItemBase _item);/ 交互物品public void ChangeItem(InventoryItem _item1, InventoryItem _item2);/ 添加物品public void AddItem(ItemBase _item);/ 添加物品到指定位置public void AddItem(ItemBase _item,int _index);/ 整理背包public void SortOutInventory();第二步:實現了背包的基本操作功能,下面就開始對背包數據進行讀取,將這些背包里的數據展現在背包界面中供玩家查看。在角色信息UserInfo里將InventoryList列表里的背包物品信息一一讀取,然后分配給每個物品格子進行顯示和操作。圖4.3(1) 背包系統界面圖4.3(2) 背包物品查看4.4裝備系統裝備系統是基于物品系統下的一種,但是它更特殊一些,它能夠給玩家提供一定量的屬性使得玩家變得更強,并且裝備可能還可能有強化等一系列的附加功能。裝備系統功能需求:1、 屬性變更2、 穿上裝備3、 卸下裝備/ 穿上裝備public void FitOnEquip(ItemEquip _equip);/ 卸下裝備public void PutOffEquip(InventoryEquip _equip);/ 穿上裝備對角色的屬性變更public void FitOnToRole(RoleInfo _role);/ 卸下裝備對角色屬性的變更public void PutOffFromRole(RoleInfo _role);圖4.4 裝備系統界面4.5戰斗系統戰斗系統是本游戲最核心的系統,游戲是一種體驗過程,在這個體驗過程中,戰斗通常是游戲中最強的交互要素,它對玩家的感覺刺激也是最大的。因此戰斗系統的設計通常是MMORPG中的重中之重,且在設計過程中處于核心地位,其他絕大部分的游戲子系統都將服務于戰斗系統,或者衍生于戰斗系統。本游戲的戰斗系統主要分為:角色控制、角色狀態機、怪物狀態機以及怪物AI四大功能模塊,再配合上角色和怪物的屬性,一個簡單的戰斗系統就形成了。4.5.1 角色控制角色的控制分為兩種:鼠標點擊和搖桿操作,通過以上操作可以控制角色在游戲中任意移動攻擊敵人等。鼠標點擊移動:首先需要先將游戲場景中的地面進行分層,將地面設為Ground層,然后通過UnityAPI函數ScreenPointToRay向鼠標點擊屏幕的地方發射一條只射向Ground層的射線,射向只會射在游戲中的地面上,射線映射到3D世界中的點坐標即為玩家點擊需要移動的點。然后調用作者事先編寫的移動函數MoveTo(Vector3 position)移動到該點即可實現角色移動。鍵盤移動:鍵盤移動相對鼠標移動較為麻煩先,我們需要先獲取角色跟隨相機的正前方方向,然后再通過 / 水平方向float horizontal = Input.GetAxisRaw(Horizontal);/ 垂直方向float vertical = Input.GetAxisRaw(Vertical);這兩個函數取得當前鍵盤按下的方向,根據鍵盤按下的移動方向再與角色相機正前方向量相乘則可得到角色移動到的方向。/ 移動方向 = 水平偏移值 * 相機向右向量 + 垂直偏移值 * 相機前方向量(horizontal和vertical為-11之間的數)moveDirection = horizontal * cameraRight + vertical * cameraForward;4.5.2 角色狀態機角色狀態機將管理角色整套操作和動畫之間的切換,能有效的管理狀態轉換之間的邏輯。第一步:需要根據需求編寫角色的狀態類型/ 角色狀態public enum PlayerState Idle, / 待機 BattleIdle, / 戰斗待機 Move, / 移動 Attack, / 攻擊 Magic, / 法術攻擊 Die / 死亡第二步:我們需要根據角色狀態利用Unity自帶的AnimatorControllter動畫控制器來規劃角色的動作流程。圖4.5.2角色動畫狀態機第三步:編寫FSM有限狀態機對角色進行狀態管理/ 通過一個Switch case語句來管理角色狀態的轉換switch (playState) case PlayerState.Idle: PlayerIdle(); break; case PlayerState.Move: PlayerMove(); break; case PlayerState.Attack: PlayerAttack(); break; case PlayerState.Magic: PlayerMagic(); break; case PlayerState.Die: PlayerDie(); break;4.5.3 怪物狀態機及怪物AI這里由于本作游戲怪物AI較為簡單,所以便直接將怪物AI邏輯直接寫在狀態機中,其實狀態機與怪物AI本來就互相有著依賴關系,AI將操縱狀態機才可以實現不同的怪物AI邏輯,就好比人腦控制人體四肢在運動一樣。1、怪物的狀態/ 怪物狀態public enum EnemyState Respawn,/ 重生 Idle, / 待命 Attack, / 攻擊 RunAway,/ 逃跑 Die, / 死亡 Homing, / 歸位 BeAttck / 被擊2、怪物動畫狀態機圖4.5.3 怪物動畫狀態機3、本作怪物AI主要分為:攻擊、追逐、死亡、重生、回到起始點怪物AI流程:首先怪物將執行等待狀態,直接角色進入怪物的視野范圍時,怪物將朝著角色的位置進行視線追逐,直接玩家離開了怪物的視野范圍時怪物將回到起始點,若角色達到了怪物的攻擊范圍之內時怪物將對角色進行攻擊,角色若將怪物殺死,怪物將會在指定重生時間復活。這整個AI流程實現了玩家與敵人的簡單戰斗交互,再配合上角色和怪物的數值屬性,整個戰斗系統就這樣誕生了。/ 怪物等待EnemyIdle();/ 怪物攻擊EnemyAttack();/ 怪物死亡EnemyDie();/ 怪物歸位EnemyHoming();/ 怪物追逐EnemyRunTo();/ 怪物受擊EnemyBeAttack();4.7商店系統商店系統可以購買一些玩家必備的裝備和補給品,首先我們需要為商店配置表格,游戲中所有的物品都由金幣購買,所以該商店也稱為金幣商店,可以點擊城鎮里的部分NPC打開商店界面進行購買。功能需求:1、 配置商店物品信息2、 顯示商店界面并載入商店物品信息3、 購買物品4、 切換商店物品類型第一步:需要先配置商店的Csv表格,由于我們已經配置好了物品信息表,所以只需要根據物品表里的tid號來配置物品即可。第二步:創建StoreManager和StoreUI腳本,前者用來管理商店的邏輯管理,后者用來驅動UI界面實現各種操作功能的需求。/ 加載商店數據public void LoadPanelData();/ 顯示商品信息public void ShowGoodsInfo(ItemBase _item);/ 購買商品public void BuyGoods(ItemBase _item);/ 切換物品類型分組public void OnGroupClick();圖4.7 商店系統界面4.8 NPC系統NPC是指“非玩家控制角色”,這些NPC一般分為劇情NPC和功能性NPC,劇情NPC用于子跟玩家進行一些人機交互,增加玩家在游戲世界中的真實感,還有一些功能性NPC可供玩家買賣物品,任務等功能。本項目里的NPC較為簡單,主要提供一些劇情對話和商店功能,NPC分布在主城各個位置中,需求開發者自行擺放。功能需求:1、 配置NPC劇情對話2、 點擊NPC進行交互3、 NPC頭頂名字第一步:NPC的劇情對話由于是可換行或者帶特殊符號,所以不配置CSV表格里,將它配置成txt文本,使得解析效率更高,還可以方便支持換行等特殊操作。第二步:通過鼠標點擊事件OnNpcClick()對NPC進行點擊操作,然后按事先配置的NPC功能觸發指定事件,NPC事件分為對話事件和商店事件。第三步:NPC頭頂名字,通過WorldToScreenPoint函數將NPC的世界坐標點轉換成2D屏幕上的坐標點,然后每次調用,將2D的名字標簽綁定在NPC頭上,讓標簽跟隨著NPC,實現NPC頭頂名字。/ 加載NPC數據public void LoadNpcData();/ 點擊NPC事件public void OnClickNpc();/ 設置NPC名字跟隨public void SetNameFollow();圖4.8 NPC劇情對話5 發布調試完成游戲內容后,我們需要打包進行測試,Unity3D是一款強大的跨平臺引擎,所以可以打出多平臺的安裝包,并且其兼容率非常高,打包過程非常簡單,下面我們就打Windows和Android平臺進行測試。1、 Windows平臺打包測試:首先,我們需要打開BuildSetting先設置Windows平臺發布相關設置,圖5.1(1) Windows平臺發布設置圖這里我們需要選好需要打包的場景,然后設置相關屬性以及選擇X86_64位的包。最后,點擊Build選擇保存路徑即可完成Windows平臺的打包流程,下面讓我們來看看最終效果圖吧。圖5.1(2) Windows平臺調試2、 Android平臺打包測試:Android平臺打包相比Windows平臺稍微復雜些,首先需要安裝Java并在Windows上配置Java環境,然后還需要下載AndroidSDK,在Unity中選擇指定AndroidSDK路徑,接著在BuildSetting中設置Android平臺發布相關設置,最后插上Android手機直接Build即可在Android系統的手機上進行真機調試了。看看在手機上的運氣效果是不是也非常棒呢!6 工作總結與未來展望6.1 工作總結6.1.1 游戲開發問題(1)遇到技術難點該如何解決作為技術行業,遇到技術難題是在所難免的事,但如何有效的解決這些技術難題尤為重要。以下為筆者個人觀點:1、 盡可能的使用最簡單的方式解決問題,采用復雜的方法或許會使得代碼越加累贅不堪,非常容易出Bug。2、 通過博客論壇、詢問前輩等方式尋得解決答案,前輩們經驗豐富,通過詢問他們能夠更快的獲得解決問題的辦法,加快項目進度。3、 如果短時間內并無法解決問題,建議先更改方案,采用簡單的方法,預留接口待后期再繼續修改。(2)先思考后編碼在項目開發中,我們需要根據策劃制定的規則去完成指定的功能,因此在決定開始編碼之前一定要理清思路,否則如果遇到功能邏輯較為復雜的系統可能由于一開始邏輯框架等問題,導致后續開發異常困難。這一點筆者親身經歷過數次,每次都是想到拿寫到哪,毫無框架可言,導致后續無法正常的完成該功能。(3)游戲程序框架很重要在游戲項目開發之前,應對游戲類型及最終完成內容進行規劃思考,總結所有系統功能,然后依此制定良好的游戲框架。特別是在項目開發前期,不應該為了節約時間而省去了大多數的框架代碼,應保證游戲在沒有功能內容的情況下該程序也是可以正常運行的。適當的制作各類工具,以及工具代碼,可以更便于我們開發使用。6.1.2 良好的編碼習慣在游戲編碼中,我們應該擁有良好的編碼習慣,應按照項目預先規定的方案進行編碼,整潔清晰的代碼將在團隊開發中起到重要作用。它會讓你更容易的維護自己的代碼,從中發現錯誤進行修改,而且規范的代碼會使得其他人更容易理解,促進項目進度。筆者以前參與項目開發時,總是忽視了這點,導致游戲后期維護極難,所以在本項目中吸取了以往的教訓,在項目開發前對整個代碼命名規則,注釋等等都做了詳細的規則,使得代碼看起來相當清晰易維護。6.2 未來展望隨著游戲玩家數量不斷上升,市面上的游戲也越來越多了,但游戲的品質卻參差不齊。作為一名游戲愛好者,開發一款受人歡迎的游戲是我最大的目標,但距離實現這個目前筆者僅僅邁出了第一步,未來還將繼續對游戲程序開發進行更深入的研究,要相信當技術水平達到一定境界時也就離這個目標越來越近了。參考文獻:1 金璽曾. Unity 3D手機游戲開發M. 北京:清華大學出版社,2013:318-3472 (美)David M.Bourg & Glenn Seemann.游戲開發中的人工智能M. 東南大學出版社, 2006:14-963 (美)Phll Co.游戲關卡設計M. 機械工業出版社, 2006:28-344 (美)Michelle Menard. Game Development with UnityM. 機械工業出版社,2012:101-1025 (美)Fletcher Dunnlan Parberry.3d數學基礎圖形與游戲開發M. 北京:清華大學出版社, 2005: 133-1586 優美締軟件(上海)有限公司. Unity4.X從入門到精通M. 北京:中國鐵道出版社, 2013:80-917 佚名.基于Unity3D的角色扮演游戲D 2013:14-208 gavinchengshubo博客. C#序列化(Serialize)與反序列化(Deserialize)J, /gavinchengshubo/article/details/83784419 百度百科.角色扮演游戲N ,/link?url=EETfbUlR1Iz7JV_PHDgJGaWsDVmokeiFVQ4jDNfsJcGcC9TD38pN2LPDkD5d_6YhFaUIMwSSAmXKhWz_QQmeRr9oqEDGUYOP1Q55l2RxKIpHfAvLWkKtaWh_T93EKpv2XpCsF6MpCZGMgTsUeLazfAog4-r5MrZKx4_gdnpdn-K10 wuzhang博客. Unity 讀取CSV與ExcelJ,/wuzhang/p/wuzhang20150511.html?utm_source=tuicool&utm_medium=referral致謝:本論文是由王大昕老師精心指導和督促之下設計完成,從選題到設計再到論文編寫,每一步老師都給予我很大的指導與支持,非常感謝老師在我大四一年的學習中對我的教誨讓我受益匪淺。在實習工作中,要感謝廈門吉比特網絡技術股份有限公司給與了我學習的機會,這公司這段時間里,公司的前輩們對我非常的照顧,細心的指導我工作中的點滴,使我的技術有了很大的進步,感謝他們對我的幫助。最后,感謝家人和學校對我的培養,正是有了你們的支持使我更加努力學習,為理想奮斗。附錄:游戲部分核心代碼:1、 序列化與反序列化 public abstract class SerializeData : ISerialize public SerializeData() private int m_intData = null; private ulong m_ulongData = null; private string m_strData = null; protected int intData get return m_intData; set m_intData = value; protected ulong ulongData get return m_ulongData; set m_ulongData = value; protected string strData get return m_strData; set m_strData = value; public virtual void Serialize(IWriteBuffer w) for (int i = 0; i intData.Length; i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 沈陽北軟信息職業技術學院《現代測試技術》2023-2024學年第二學期期末試卷
- 阜陽職業技術學院《社會化媒體運營》2023-2024學年第二學期期末試卷
- 上海南湖職業技術學院《會計模擬實驗》2023-2024學年第二學期期末試卷
- 吉林警察學院《礦物加工儀表與過程控制》2023-2024學年第二學期期末試卷
- 珠海城市職業技術學院《動力設備調節及控制》2023-2024學年第二學期期末試卷
- 青島電影學院《臨床生物化學及檢驗技術》2023-2024學年第二學期期末試卷
- 安徽機電職業技術學院《控制與調節技術》2023-2024學年第二學期期末試卷
- 廣東松山職業技術學院《信息技術基礎與應用》2023-2024學年第二學期期末試卷
- 華北電力大學《民法四》2023-2024學年第二學期期末試卷
- 湖北健康職業學院《工程測量》2023-2024學年第二學期期末試卷
- 《光電顯示技術》OLED原理
- 2022年重慶江津中考數學試題及答案(A卷)
- 反恐安全政策
- 創新教學任務
- 淺談膿毒血癥的集束化治療及護理-PPT課件
- 新部編版《道德與法治》五年級下冊第7課《不甘屈辱 奮勇抗爭》優質課件(含視頻)
- 架子工班組承包協議
- 化驗室化學試劑臺賬范例
- 楊家灣220KV變電站工程預算表
- 第七課:構圖的形式
- 六類網線檢測報告(共9頁)
評論
0/150
提交評論