使用 Unity 3D 開發遊戲的架構設計難點

2021-08-19 12:53:14 字數 2855 閱讀 3402

unity 3d 引擎對於開發者來說,入手非常快,因為它採用的是 c# 作為開發語言,這也大大降低了開發者的門檻。但凡只要懂一門程式語言的人都能使用 unity 3d 引擎開發,另外 unity 3d 的內部架構設計非常好,採用的是元件開發,開發者能快速通過元件堆積出乙個遊戲。既然使用 unity 3d 引擎開發遊戲這麼簡單,那它有沒有坑呢?答案是肯定的,比如開發遊戲經常遇到的坑:被很多開發者吐槽的包體過大、遊戲架構設計,熱更新,包防破解問題等等,下面筆者分享在遊戲開發中的坑及解決方案,為大家的學習之路提供一定的參考。

關於架構設計,很多人對此褒貶不一,筆者認為架構設計還是非常重要的。unity 提供了各種開發元件,導致很多開發者遇到問題不是想著如何解決而是先在網上搜尋看看有沒有別人實現的元件,這種做法不能說是錯誤的,至少你在使用別人元件時是否能夠完全掌握它,能否看明白人家寫的東西,開發遊戲不難,難在遊戲後期的版本更新維護。記得我朋友公司做了乙個遊戲專案,即將上線運營,但是遇到了各類問題,其中最嚴重的問題是版本迭代時,各個模組功能耦合性太緊,很難進行功能擴充套件,牽一髮而動全身,導致專案遲遲上不了線。他特意邀請我過去幫他解決這個問題,我去他公司看了一下他們的專案程式,各個模組之間邏輯互相交叉,耦合性特別強,在某個模組增加乙個功能會涉及到其他模組的修改,一不留神就出 bug,程式每天為這樣的事情鬧的焦頭爛額,疲於應付。我根據他們的專案分析了一下出現的問題,首先是它們在 ui 這塊邏輯太亂,ui 上掛接了各種邏輯指令碼,我們首先拿 ui 這塊開刀,去掉掛接在 ui 上的各種指令碼,換句話說,ui 不掛任何邏輯指令碼。我選擇的架構模式是 mvc,它是架構 ui 的不二選擇,將 ui 的邏輯放到了對應的各個 view 指令碼中,每個 ui 面板都有自己的 view 類,controller 主要實現的是控制 view 的切換顯示,每個 view 對應自己的 controller 模組,model 模組處理的是 ui 面板上的資料更新。

思路理清了後,接下來就是整理邏輯**,花了整整兩個星期加班加點把這塊邏輯重新寫了一遍。接下來是理順專案中各個系統的設計,這塊主要體現在技能系統上,它是遊戲核心與玩法直接有關係的。關於技能系統的設計方式也是很多的,以前我做的是把動作和技能系統放在一起,使用的是 fsm 有限狀態機,這樣設計也是可行的。關於我朋友公司的這個專案改造,由於它前期已經寫好了,只是耦合性太高,只能在它原有的基礎上進行修改,各個模組之間互相交叉,我對它們的改造採用的是模組化設計,用於降低耦合性,架構圖如下所示:

圖中顯示的各個技能系統是需要自己封裝的,router 是所有技能對外的邏輯介面,它是聯絡各個技能系統與對應角色邏輯的紐帶。不論是 npc 和玩家角色,它們都需要呼叫 router 函式中的介面去實現技能邏輯。router 與 npc 和玩家之間的關聯,我採用的是訊息傳送的方式,就是說如果需要用到 router 中的函式可以通過訊息傳送的方式進行,這樣減少了模組之間的耦合性。一旦有需求變化只需要維護好 router 類即可。在這裡友情的給讀者提示一下注意事項,在重構**時,不要把整個專案重構,那樣很容易破壞專案的整體性而且容易造成功能細節丟失,導致經過重構後的專案被廢棄。如果出現這樣的結果,還不如不重構。一般重構**時,先把需要重構的模組熟悉了才動手做,而且重構時以模組為單位去重構**,採取各個擊破的方式,重構後的遊戲專案在擴充套件性方面明顯改善。所以說遊戲架構對於產品來說是非常重要的,遊戲產品上線只是第一步,後期版本迭代才考驗你產品架構設計的好壞。在這裡不是給讀者介紹如何架構好,而是做適合於你遊戲產品本身的架構設計。

包體被破解一直是困擾程式設計師的難題,由於現在破解技術的快速發展使得我們對產品的保護顯的尤其重要。下面介紹一下防破解的技術:

最常用的技術是對**進行混淆,但是這個只是防治那些想破解**的人,這樣的防破解方式只防技術,現在很多上線的包被破解並不是採用這種方式實現的,盜版專案通常是將正版專案進行破解、篡改後重新打包生成的應用,也就是通常說的二次打包。如果移動端專案能夠具備防反編譯、防反破解能力,就可以有效的防止遊戲專案被盜版。接下來介紹一下我的做法,架構如下圖所示:

實現思路:首先對客戶端的**進行混淆,避免**的破解,再就是加了驗證訊息資料合法性,如果有玩家利用破解工具繞過付費,直接購買道具,這塊交給伺服器去處理,伺服器會對你付費和不付費的資料做乙個驗證,如果資料合法會存入資料庫,否則把資料丟棄掉,同時把賬號封掉,加入資料庫黑名單永不準登陸,目前這種方式可以滿足需求。另外針對客戶端的防破解,也給讀者介紹乙個比較靠譜的工具。

在此推薦給大家的是 360 加固包,360 加固保專為開發者的應用提供免費安全加固服務,獨創了多重防護方式,對應用程式深度加密處理;獨有的程式文字資訊加密功能,能有效防止應用被反編譯和惡意篡改,保護應用不被二次打包,保護資料資訊不會被黑客竊取。開發者無需任何開發成本,一鍵上傳,即可在 5 分鐘內完成應用加固,從而徹底防止應用在上線後被反編譯、除錯、破解、二次打包和記憶體擷取等多種威脅。

在使用 360 加固包時注意乙個問題,就是在提交審核時,一旦加固包體,它裡面的內容是無法被改變的,所以在使用時如果計費檔案不是最新的,不要對其進行加固否則計費這塊會出問題,因為經過加固的包是無法替換計費檔案的,這也是筆者在使用 360 加固包時遇到的問題。

使用 unity 3d 引擎開發,雖然其上手容易,但是它的坑也很多,在此只是給讀者列覺了幾個重點問題,一些小問題並沒有給讀者介紹。作為程式設計師必須具備解決實際問題的能力,這就需要在實戰中不斷的磨礪自己,提公升自己。

Unity3D遊戲開發

入門級unity安裝教程 一 unity五大面板 unity3d的介紹 1 介面 選單 面板 元件 unity5.x 編輯器介紹 unity開啟篇 一 滑鼠右鍵 wsadeq前後左右上下移動 shift加速移動 滑鼠右鍵旋轉檢視 滑鼠中鍵移動檢視 alt 右鍵縮放 alt 左鍵旋轉物體視角 q移動場...

Unity3D遊戲開發初探

1 如何在遊戲指令碼程式中建立物件而不是一開始就建立好物件?使用gameobject的靜態方法 createprimitive view code 其中在createcube方法中,使用gameobject.createprimitive方法來建立cube型別的遊戲物件例項,設定了它出現的座標並為它...

Unity 3D遊戲開發導學

策劃 美工軟體工程師 測試工程師 客服等.unity是一款遊戲引擎 遊戲引擎 一款遊戲最最最核心的 程式框架。包含以下系統 渲染引擎,物理引擎,碰撞檢測系統,音效,指令碼引擎,動畫系統,人工智慧,網路引擎,以及場景管理。使用遊戲引擎,開發者可以重用已有的核心技術,將精力集中在遊戲邏輯和設計上,從而簡...