一. 弹幕框架三层结构
生活随笔
收集整理的這篇文章主要介紹了
一. 弹幕框架三层结构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 摘要
- 游戲要素分析
- 行為接口
- 對象池技術
- 彈幕框架三層結構
摘要
- 本文主要講解用于Unity開發2D彈幕游戲的個人向的簡單框架的設計結構及其思想。
- 在本文中將會講解到對象池、接口等要素
游戲要素分析
- 在一款2D彈幕射擊類游戲中,除了玩家角色以外,場景的對象大致可分為:道具,敵機、彈幕。它們的共同點都是會在出現后按一定的運動軌跡進行運動(靜止視為特殊的運動),區別在于角色觸碰到道具會得到分數/Buff,而角色觸碰到敵機和彈幕會被銷毀。
- 玩家、道具、敵機、彈幕這四種游戲要素在場景中的數量一般是升序關系。其中彈幕的數量最多,玩家數量最少,一般只有一個。
- 我把游戲中各種與運動相關的要素,統稱為運動學實體。它們從誕生之初,就會按照自身的規則進行運動,直到滿足銷毀條件為止。因此,“運動”是這些實體的共有屬性。
行為接口
- 分析了游戲要素后,可以知道,運動是這些要素的共有屬性。從外界看來,無論這些實體的運動形式如何,它們本質上都是一種運動。而從面向對象設計的角度來看,作為調用者,只需要知道該對象是否具備“運動”的能力,而不關心它到底是如何運動的。
- 因此,我希望為每種實體(彈幕/敵機)自定義一種運動規則,同時用統一的途徑去開啟它們的運動行為。而能夠做到這一點的,就是面向對象中的繼承與多態。因為C#語言中,類之間只支持單繼承。考慮到框架使用者會需要繼承不同的父類(MonoBehaviour或者其他父類),因此不使用基類的方案,這樣就不會占用了類的繼承的位子。
- 也正是如此,我使用了接口Interface的方案。在接口中只有一個方法:void OnShotBehaviour()
對象池技術
- 我們知道,實例化對象是一個比較耗費性能的事情。如果在短期內實例化若干簡單對象,則還沒什么問題。但如果要源源不斷地在幾幀時間內實例化大量對象,而這些對象又有著剛體、碰撞器等物理組件,則會產生極大的性能消耗,使得游戲場景十分的卡頓。這在實時游戲過程中是十分影響體驗的。
- 因此一個很好的想法是在游戲開始前先將必要的對象全部實例化到內存中,在游戲過程中循環利用這些對象,只有在供不應求的時候才實例化少數對象,就能極好地優化游戲性能。
- 而對象池的實現也非常簡單,只需要利用一個隊列數據結構即可實現。
- 如圖所示,從隊列中取對象需要調用方法,在方法內要進行一些條件判斷,如隊列中是否有足夠的對象等。
- 對象池的特點就是有借有還,一般而言,誰取出來,誰還回去,這樣的目的在于防止一個對象已經在池子中了,卻依舊被外界引用并使用。當然在這里誰還回去都行。
彈幕框架三層結構
- 我們在上面已經講了對象池技術。一般而言,一個對象池只存放一種類型的對象。而在游戲場景中,不可能只有一個或少數對象池,而是有大量對象池,這些對象池有各式各樣的彈幕、敵機、道具等。
- 為了方便統一管理和調度各種對象池,我們就需要設立一個新的類來管理所有的對象池。
- 這種由“管理類—對象池—對象”組成的三層結構,就是標題所述的彈幕框架三層結構。
- 在管理類中,它應當具備基本的幾個功能,首先它需要能存儲各種對象池的引用,我所采用的方案是字典,即鍵值對的形式進行存儲和訪問。而管理類首先它能夠提供方法接口給外界進行注冊和注銷對象池,以及從指定對象池中得到一個對象
- 以下是我個人設計的類圖:
- 可見,為了擴展考慮,對象池和實體我都采用的接口形式,而管理類則是采用了抽象類的形式。這樣就構成了基本的三層結構。而要以這個結構出發進行具體實現,則有各種各樣的思路。
- 在后續文章中,我將從該結構出發,來講解我自己的一套具體實現
總結
以上是生活随笔為你收集整理的一. 弹幕框架三层结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样将dwg转换成pdf格式?
- 下一篇: MySQL之介绍