Unity項目 - DeathtrapDungeon死亡地牢


游戲原型

死亡地牢是一款 2D-Roguelike 的地牢冒險游戲。手握利刃,斬殺怪物,在凶險的地牢內生存下去。但注意,敵人也並非善茬,保持警惕,取舍果斷,足智多謀才是制勝的關鍵。

開發環境:Unity2019.3.0a2 + VS2017
項目地址:DeathtrapDungeon - SouthBegonia
試玩下載:DeathtrapDounge 提取碼:wekp

項目演示

繪圖資源

代碼實現

總控系統:

  • GameManager.cs:單例模式,統一管理各類的實例

基類:

  • 生命值類:Fighter.cs(生命值,傷害系統)
  • 移動類:Mover.cs(移動系統)
  • 交互類:Collectable.cs(檢測碰撞體是否為Player)

Player

  • Player.cs:Rage怒氣系統;換皮膚,死亡重生等
  • Weapon:武器攻擊系統,Rage技能系統

Enemy

  • EnemyHitBox.cs:傳輸傷害到玩家
  • Enemy.cs:大部分敵人的類,包含經驗值,追逐攻擊系統,死亡復活系統等
  • Enemy_Chest.cs:寶箱怪
  • Trap.cs:陷阱
  • Boss0.cs:最終boss

GUI

  • UIManager.cs:UI管理
  • CharacterMenu.cs:菜單欄系統
  • CharacterHUD.cs:玩家生命值,經驗值,怒氣值顯示,死亡頁面
  • SCUI.cs:異步切換場景加載畫面
  • FloatingTextManager/FloatingText.cs:浮動文本顯示系統

場景

  • CameraFollow.cs:相機跟隨系統
  • SceneTranslate.csa:異步加載場景系統
  • Portal.cs:不同場景傳送門
  • Portal_Door.cs:當前場景傳送門

交互物件

  • NPCTextPerson.cs:NPC交互
  • Chest.cs:寶箱
  • Crate.cs:可破壞物件
  • HealingFountain:治愈泉水
  • Door.cs:開關門




技術探討

關於武器揮動進行攻擊的animation

  1. 武器的Swing動畫時間建議大於0.3s,否則間隔過短即便每次都能攻擊到敵人但不足以有效推開敵人而被攻擊
  2. 武器劈砍至水平的時間建議在前半時間內完成,因為涉及武器的碰撞傷害;水平下的武器碰撞器范圍較長,利於和敵人保持距離,並造成傷害
  3. 最好模擬真實情況下的劈砍動作,我將其分為以下幾部分:
    • p1:武器抬起並后仰,此過程速度適中,禁用collider
    • p2:從90'到0'進行主劈砍動作.此過程前半速度快,后半速度極快,啟用collider
    • p3:0'到-20'最終劈砍動作.此過程不在於速度,而在於保持幀數(時間)
    • p4:武器收回,速度快,禁用Collider

Tilemap的繪制

  1. 最好在確定美術資源時即確定整體繪制的像素信息,場景風格等,假若后期要添加其他要素,風格不同很不應景
  2. Tile的類型最好也確定,使用普通tile+animation物體,或是RuleTile實現各類功能
  3. 瓦片的渲染順序體現在Tilemap的順序(例如上牆wall層,下牆壁ScreenWall層;上層可被player遮擋,下層可遮擋player)
  4. 非瓦片物體的渲染順序體現在SpriteRenderer里的SortingLayer和OrderLayer;合理設置遮擋與被遮擋關系

2D碰撞問題

所有物體最好處於同一z=0平面,否則一些碰撞檢測容易出問題

Draw Call優化

  • Tilemap地圖:占用5+DrawCall,主要體現在牆壁層。由於本例采用了兩種類型的美術資源,且含有普通Tile和RuleTile,故此處產生較多DrawCall,因此在往后Tilemap繪制時,應注意美術資源和Tile類型的統一性,此外,對於靜態物體設置為static
  • 裝備欄Menu:占用9+DrawCall,由於裝備欄信息眾多(Weapon、Player的Sprite切換,游戲數值信息等)。不同Sprite的部件眾多、Button功能各異、Text字體不一,因此造成較多DrawCall。此處除了統一字體,減少Panel縮放外暫無更好辦法
  • 數值面板HUD:占用4+DrawCall,此處功能為顯示畫面左上角的數值信息,同樣也是存在不同Sprite部件,暫無更優解
  • Animator物件:被當做Object的Animator物件,可將其CullingMode設置為Cull Completely,即不在視野內時停止運作,可有效降低DrawCall

GC優化

通過Profiler分析腳本中的GC Alloc,找到對應腳本進行代碼優化(減少循環內new對象、減少foreach等),此外對場景中暫時不用的物體進行隱藏

內存優化

  • 由於是2D游戲,本例目前僅對bgm進行了優化,即將其LoadType變更為Streaming流媒體播放形式,大幅降低了運行時占用內存
  • 其他優化方法:AssetBundle打包、降低貼圖大小、采用MipMap等

*注意事項

游戲的核心機制,如戰斗,場景切換,物體交互等已成型,且Tilemap完善(地面層,上下牆壁層,地表物件層,碰撞層),除了基本的靜態Tiles外,還有幾個AnimatedTile(泉水,熔岩等),及ChestBrush寶箱筆刷方便寶箱的擺放設置等等。如想要自行定制關卡,完全可以基於此腳本系統下,對Tilemap的重繪、游戲數值、場景物件擺放、NPC台詞等即可。

此外,itch.io網站內含有大量優秀的2D繪圖資源,可按需合法使用。

參考來源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM