當前位置:首頁 >教程首頁 > Unreal Engine >如何學習遊戲引擎?

如何學習遊戲引擎?

發布時間:2021-12-08 09:03:46

前言:遊戲引擎,表麵上看是一個工具,實質上卻是一本“技術圖譜”,每一個點擊行為的背後都有著其獨到的意義。每一個模塊都索引著數以萬行的工程代碼、數以百計的科研論文以及數以十計的專業書籍。學習引擎,其實就是一個修煉內功的過程,需要你不斷深挖裏麵的技術細節,找到對應的學習資料並消化理解。

遊戲引擎,其實就是一套整合了各種遊戲開發工具、封裝底層並提供程序函數庫的軟件係統。

0.webp.jpg

遊戲引擎架構係統分層

引擎技術固然複雜,但通過這些年的不斷迭代,大部分商業引擎已經擁有了非常完善的編輯係統、不錯的交互體驗、詳細的文檔以及豐富的開發功能,學習的門檻的降低也讓更多的崗位參與進來(進而誕生出了越來越多的獨立遊戲)。下麵列舉了遊戲開發中常見的崗位 以及 兩條常見的協作開發的流水線:

1.webp.jpg1-2.webp.jpg

其實學習遊戲引擎,前期對於任何崗位來說路線都是相似的,基本上就是一個熟悉基本操作、理解基本概念、拓展專業知識的過程。但進入後期階段,程序員需要擁有更多的思考和知識儲備,需要從代碼層麵理解並進一步達到能夠獨立編寫的境界。下麵分享一下我近些年學習引擎的經驗,希望能夠幫助到你,

預備階段:引擎選擇,語言基礎,計算機基礎

Cocos、Cryengine、Unity、Unreal我都有接觸過,其實發展了這麼多年各有適合的領域,當然也有不少值得詬病的地方。如果非要一句話說出來誰好誰壞是不現實的,也顯得很不負責任(其實每天都有人吐槽UE耦合的Gameplay、藍圖不好維護,吐槽Unity一堆半成品功能、資源加載慢、Mono低效等)。

在我看來,大部分人隻要考慮學習引擎的成本,就業難度,發展方向就可以了,考慮目前市麵上就業以及影響最廣泛的是Unity和Unreal,所以隻推薦這兩個。

不過這兩個引擎一開始就給開發者出了道難題:我是學C#還是C++?

如果你是在校生,有時間慢慢學習,那麼更推薦Unreal,開源代碼有更多的研究空間,C++學透了也是好處多多。

如果你是為了盡快找到一份工作或者快速出成品,Unity上手確實更快一些,C#也相對友好一點。

當然這不是絕對的,任何引擎的開始階段和大成階段都是相似的。但Unreal的學習曲線可能曲折一些(C++占了不小的因素),某一個階段的受挫很可能會影響到開發者學習的動力和進度。

2.webp.jpg

不管怎麼說,學習語言、看書都是必經之路,無論哪個方向都要沉下心來好好看一兩本經典書籍。比如C++,有《C++ Primer》《Effective C++》《C++語言的設計和演化》入門和拓展,進階有《C++Template》《深入探索C++對象模型》《More Effective C++》,虛幻引擎裏麵的C++是經過魔改的,如果你專注於寫遊戲邏輯,確實用不到太多的C++特性,但考慮到未來的成長還是要盡可能深入。C#書籍,《C#圖解教程》《C#本質論》《C#高級教程》《深入理解C#》《CLR via C#》,如果是純小白,那麼先隻看一本,其他的慢慢消化。多說一句,語言的本質殊途同歸,真正的大佬也不會拘泥於某一個語言。

除了語言外,還有一個更重要的預備知識——計算機基礎。計算機基礎水平決定了你以後的發展速度和天花板(也是科班出身的優勢所在),所以強烈建議學好一門語言並持續性的鞏固操作係統、計算機網絡、數據結構和算法等專業知識。我一直後悔本科的時候並沒有吃透這些內容,所以工作的這些年來從來沒有停止過操作係統等知識的學習。這對很多人來說是一個漫長的過程,因此我們可以在後續的工作中慢慢鞏固。

關於這些知識的意義,比較直觀的例子就是他們通常能幫我解決各種疑難雜症,比如:

遇到崩潰但是堆棧信息不準(彙編可以輔助我們定位)

本地能編譯通過,但是遠端編譯不過(可能是宏定義或者UnityBuild導致)

手機直接卡死,沒有任何堆棧信息(可能是內存問題)

字符串莫名的亂碼,Debug和Shipping版本表現不一致(編譯器優化問題)

這些問題在沒有融會貫通那些計算機基礎知識前是很難找到解決方案的

第一階段:熟悉遊戲開發,學習引擎編輯器的基本操作

如果你從來沒有接觸過任何引擎,也沒有相關的技術積累,那麼無論你是做什麼崗位都要放平心態,當做一普通的軟件去學習即可。這個階段的目的是熟悉引擎的基本操作,方法就是找一個入門教學視頻/入門書籍跟著做,遇到不懂直接去搜索引擎(或者官方文檔)上查,同時嚐試理解引擎中的一些基本概念,比如unity中的GameObject、Component、Script或者Unreal中的actor、Component、藍圖等(一個月的時間足夠了)。很多大佬總是對教程或者視頻嗤之以鼻,但是在我看來,視頻教學確實是一個速度最快、理解起來最容易的方案。

如果你有一定的相關經驗和積累,可以跳過上麵這一步,直接嚐試脫離教程進行Demo的編寫。注意不要急於一口氣把所有的Demo都做一遍,挑一個感興趣的方向並盡可能地去完善,你的收獲會更大的。比如做一個橫版跳躍,一個簡單的RPG或者ACT項目,不同的項目側重點都有所不同,可以提前大致了解一下。此外,脫離教程並不是脫離項目,教程(或者官方案例)裏麵的項目代碼、藍圖等還是有很大的參考意義的,自己在實現Demo的時候要多對比和借鑒,真正的理解其意圖才能更好的優化和改進。

3-1.webp.jpg3-2.webp.jpg

Unreal和Unity的編輯器界麵其實都很相似,觸類旁通

第二階段:補充遊戲專業知識,理解基本原理

當你可以輕車熟路地配置一個Prefab,寫寫腳本或者能手到擒來地拉一個藍圖,實現一個Demo後,就不要甘心再當一名熟練工了。接下來我們需要開始補充相關專業知識,盡量理解你常用的每一個模塊以及每一個資源背後的意義。

當你將一個Prefab拖入場景時或是當你打開一個藍圖時,不妨思考一下他到底是個什麼東西?為什麼模型分為靜態模型和骨骼模型,而不是動態模型?為什麼骨骼模型的外表叫做蒙皮?

這個階段你可以配合官方文檔去索引相關的技術概念,比如動畫係統裏麵的IK、Montage(蒙太奇)、BlendSpace、骨骼動畫、蒙皮動畫,然後就能通過這些概念到網上搜索相關的書籍、論文、視頻等等。如此往複拓展,你的知識圖譜會迅速被打開並充實起來。

4.webp.jpg

動畫係統的書籍有哪些——《Character Animation With Direct3D》

動畫係統一般包含哪些技術—— 骨骼蒙皮動畫、Morph動畫、狀態機、Ragdoll、Root Motion、IK

骨骼蒙皮的技術原理—— Mesh按照權重綁定到骨骼上進行遞歸移動

動畫係統有哪些前沿的技術——Motion Capture、Motion Match、Path Warpping等

(其他模塊類似,時間充裕的話建議係統的學習並整理該模塊相關的知識)

此外,你應該再次打開工程項目和引擎,開始嚐試深入看一些成熟項目(引擎)的代碼。在理解了一些專業的概念後,最好去代碼裏麵再去看一下他的實現方式,這時候你的理解會比第一階段更加深刻。比如一個組件是如何掛到對象上並生效的?動畫藍圖本質上是一個什麼東西?這些動畫數據是如何傳遞的?這個時候你就可以嚐試性的梳理和分析源碼,逐個的解決你的問題。這裏建議合理利用堆棧信息、畫圖工具、斷點調試等手段進行輔助。

這個階段其實比較艱難,除了專業知識外你還會遇到各個方麵的難題。比如數學物理基礎、語言特性、係統原理、編譯調試方法以及各種Bug,一個一個攻破。

上麵這些並不是隻針對程序的,其實作為一名合格的策劃/美術,即使不看源碼至少也需要把官方文檔研究透徹,通過一些視頻或者書籍理解部分係統的基本原理。隻有真正的理解了這些,你才會真實的感受到自己的進步和成長,以後在麵對這些係統的時候也會更加遊刃有餘。

5.webp.jpg

不過考慮到現代引擎如此的複雜和龐大,有必要逐個模塊去學習麼?答案是否定的,畢竟人的精力有限。即使我已經接觸引擎5年了,還是有很多模塊幾乎沒有碰過,不是說他不重要,而是他不在我的規劃目標之內。所以要自己規劃發展方向和感興趣的內容,然後再進行相關資料的查閱和學習。

第三階段:代碼修煉(針對程序員)

這階段的已經對引擎的某些模塊有了專業的理解和思考,下一步就是動手去使用和完善。這個時候光看書籍和資料已經不夠了,需要去看相關的源碼或者Demo來加深理解,並嚐試寫一些複雜的代碼模塊。這一步其實和第二步是相輔相成的,你在查閱各種資料的同時,就可以動起手來仿寫一些相關的代碼並根據自己的需求進行拓展。

比如說你通過書籍《網絡多人遊戲架構與編程》理解了什麼是幀同步和狀態同步,那麼在當前的引擎中使用的是什麼方式?能否轉換成另一種方式呢?難點都有哪些?你可能需要下麵的能力

計算機網絡基礎知識

TCP/UDP Socket編程

序列化的實現和應用

理解引擎Tick和各個模塊的更新邏輯

C++一些常見的語言技巧

操作係統內存知識

複雜模型的抽象能力

再比如,你了解了AI中基本的尋路算法和行為樹概念,你知道引擎裏麵是如何實現的麼?A*算法在引擎裏麵有集成麼?一個複雜的場景如何拆成格子類似來應用A*呢?能不能自己寫一個簡易的行為樹呢?這些都是我們在學習引擎以及拓展開思路後需要思考和解決的問題。

在編寫這些代碼的時候,你會遇到各種各樣的問題,不僅是對編程能力的鍛煉也是對你個人編程素養以及計算機素養的提升,以往許多看起來高端且理解不夠透徹的知識點也會逐漸被消化和關聯起來,比如內存池以及內存管理、無鎖編程、異步編程、Hook技術、遊戲安全等。

另一方麵,我們的大腦會不斷地對其進行抽象,引擎的代碼結構也會逐漸變得清晰,漸漸的我們就可以真正地理解模塊的結構和意義。當然,平時如果保持一個畫圖分析、寫筆記總結的習慣,這個過程會更順利一些。

6-1.webp.jpg

個人繪製的一些架構圖

6-2.webp.jpg

個人的一些筆記目錄

第四階段:脫離引擎(針對程序員)

這個階段已經基本脫離引擎了,我們更多的是從程序的角度思考架構與實現方式,思考如何將更先進的理論思想(包括架構方式和專業的論文知識)應用到我們的環境中來。你可以嚐試看不同的引擎源碼,參考不同的開源項目與論文,開始對比不同引擎的優劣並嚐試自己實現與優化,不斷磨練自己編碼能力的同時,也在深入著某個方向的專業能力以及架構能力。慢慢地,你會擁有屬於自己的一套思考理論(比如我習慣先跑流程,梳理概念然後關注數據存儲方式),可能打開一個引擎源碼就能猜到哪些模塊是幹什麼的,它的結構大致是什麼樣子的,運行時類型怎麼獲取、資源的管理方式是什麼、GC的方式是什麼、Tick更新的順序是什麼、多線程如何進行封裝與應用等等,這時候他是Unity還是Unreal對你個人的技術來說似乎沒有太大的差別了。

不過,你依然很難做到遊戲開發領域全方向的專家,換一個方向可能還需要重新走一遍相似的路(當然會快很多)。另一方麵,每一個領域的技術也一直在推進著,科研界從沒有停止過論文的產出(比如每年的siggraph,近些年深度學習與遊戲AI的結合),工業界也從來不會放慢對新技術投入生產的腳步(比如DX12、Vulkan的推進),我們的學習仍不能止步。

7.webp.jpg

以上就是我關於引擎學習的一些經驗分享。當然最後一個階段某種程度上已經超過我的能力範疇,算是我後續發展的一個方向吧。總的來說,多思考、多提問、多查資料、多寫代碼、多總結,隻要堅持下去每個人都可以成為一名優秀的開發者。

作者:Jerish

來源:遊戲開發那些事

华体会hth体育网 賞析
  • 2101期學員李思庭作品

    2101期學員李思庭作品

  • 2104期學員林雪茹作品

    2104期學員林雪茹作品

  • 2107期學員趙淩作品

    2107期學員趙淩作品

  • 2107期學員趙燃作品

    2107期學員趙燃作品

  • 2106期學員徐正浩作品

    2106期學員徐正浩作品

  • 2106期學員弓莉作品

    2106期學員弓莉作品

  • 2105期學員白羽新作品

    2105期學員白羽新作品

  • 2107期學員王佳蕊作品

    2107期學員王佳蕊作品

專業問題谘詢

你擔心的問題,火星幫你解答

微信掃碼在線答疑

掃碼領福利1V1在線答疑

點擊谘詢
添加老師微信,馬上領取免費課程資源

1. 打開微信掃一掃,掃描左側二維碼

2. 添加老師微信,馬上領取免費課程資源

×

同學您好!

您已成功報名0元試學活動,老師會在第一時間與您取得聯係,請保持電話暢通!
確定