遊戲引擎
遊戲引擎(粵拼:jau4 hei3 jan5 king4;英文:game engine)係一類整嚟俾人開發電子遊戲嘅整合開發環境(IDE)。一個典型嘅廿一世紀初遊戲引擎會包括四個基本組成部份[註 1][1]:Ch. 1:
- 聲引擎(audio engine),包含一啲好多遊戲都用嘅聲效,例如係爆炸嘅聲喺好多動作遊戲都會用到;
- 彩現引擎(rendering engine),包含一啲能夠做彩現,由立體模型嗰度製作出圖像嘅演算法(睇埋電腦圖像)[2];
- 物理引擎(physics engine),指處理遊戲物理嘅程式,會幫遊戲製作者模擬重力等多數遊戲嘅虛擬世界都要有嘅嘢;
- 遊戲人工智能(game AI),包括多數遊戲都用嘅人工智能程式,例如係基本嘅搵路演算法(pathing algorithm)噉;
除此之外,遊戲引擎一般仲會有個圖像用家介面(GUI),而且多人用嘅遊戲引擎仲會有網上舖頭俾用家交流遊戲資產(game asset;指一隻電子遊戲當中可以獨立抽出嚟嘅一個有用部份,例如一個角色嘅立體模型、一首音樂或者係一段有用嘅程式碼呀噉)。廿一世紀初常用嘅遊戲引擎有 Unity 同 Unreal Engine 等等[3][4]。
遊戲引擎嘅存在令遊戲製作呢家嘢平民化:就算係冇受過遊戲製作相關訓練嘅人一有遊戲引擎,就可以攞住遊戲引擎嘅資源(聲效、程式同由網上舖頭買到嘅第啲遊戲資產)砌自己嘅遊戲出嚟,唔使吓吓都靠自己搵同編寫(例如)碰撞探測(指喺每個時間點探測遊戲世界裏面「有冇邊對物件相撞」嘅演算法)呢啲隻隻遊戲都要用嘅基本程式;因為噉,遊戲引擎被指係 2010 年代獨立遊戲(indie game)得以崛起嘅主因之一[5]。
概論[編輯]
核心諗頭[編輯]
遊戲引擎係俾人用嚟開發遊戲嘅整合開發環境(IDE;泛指俾人用嚟開發軟件嘅電腦軟件):電子遊戲定義上就係以電腦軟件嘅型式存在嘅遊戲;一隻電子遊戲會有多個組成部份,包括咗聲效(sound effect;仲有指定「乜嘢時候要出邊個聲效」嘅電腦碼)、一套處理圖像嘅系統(包括隻遊戲用嘅 3D 模型同彩現方法)、遊戲物理(game physics;例如係一段指定遊戲世界嘅物件跟牛頓力學法則移動嘅碼)同人工智能(AI;通常係用嚟控制啲 NPC)[1];一般嚟講,有某啲組成部份係好多遊戲都會想用嘅,例如係爆炸嘅聲效多數動作遊戲同戰略遊戲都會用到[6],或者一樖樹嘅 3D 模型,可以喺好多唔同遊戲裏面用嚟製作遊戲嘅虛擬世界[7]。因為噉,電子遊戲業界嘅人就有咗個諗頭,想為遊戲開發者一站式噉提供呢啲開發遊戲所需嘅資源[4]。
基本特性[編輯]
為咗達到呢個目的,一個由專業軟件工程師設計嘅遊戲引擎最基本上會做到兩樣嘢:
例如廿一世紀初常用嘅遊戲引擎 Unity 同 Unreal Engine 會為用家提供呢啲資源之餘,仲會俾用家以「用踎士點擊同將物件拖入去遊戲世界」嘅方法製作遊戲世界-而唔係要用家齋靠編輯(對一般人嚟講相當難明嘅)遊戲程式源碼嚟製作遊戲[8]。
除此之外,一個遊戲引擎通常會有返咁上下可延伸性(extensibility):可延伸性喺軟件工程上係指一隻軟件做到能夠喺出咗街之後容易加入新功能,而且加新功能嗰陣唔會搞到程式出錯[9];遊戲引擎本質上要應對係噉創新嘅遊戲設計(game design),所以要能夠容易俾用家加入佢哋想要用嘅遊戲資產,而隻遊戲引擎嘅開發又需要能夠容易加入全新嘅功能[10]。
組成部份[編輯]
一個遊戲程式嘅架構最基本上可以想像成以下噉嘅虛擬碼[11]:
while(isRunning) // 當隻遊戲行緊,就一路做... { Input->readInput(); // 睇玩家俾嘅輸入... isRunning = GameLogic->doLogic(); // 行遊戲邏輯... // Update 遊戲世界嘅狀態... Camera->update(); World->update(); GUI->update(); AI->update(); Audio->play(); // 播要播嘅聲效。 Render->draw(); // 按上述嘅資訊,畫出玩家應該要睇到嘅畫面。 }
用日常用語講即係話,一個遊戲程式做嘅嘢係一路係噉觀察玩家(用遊戲控制器等嘅架生)俾嘅輸入,按照輸入同遊戲世界嘅法則,決定遊戲世界跟住要點變化,然後更新遊戲世界嘅狀態同埋將更新咗嘅狀態顯示俾玩家睇。更新遊戲世界嘅途中會用到多個子系統[12][13]:
聲引擎[編輯]
- 內文:聲引擎
一般嚟講,電子遊戲都需要有聲效同音樂,例如玩家開槍嗰陣就要有槍聲,等個遊戲世界有真實感,而背景音樂對於營造氣氛嚟講不可或缺。聲引擎(audio engine)就係指處理聲相關工作嘅遊戲引擎部份,喺遊戲製作上,一個聲引擎需要做到以下嘅工作[1]:Ch. 1:
- 以某啲檔案格式儲住啲聲檔案(呢啲檔案係遊戲資產);
- 俾遊戲製作者決定遊戲程式喺乜嘢時候播邊段聲(例:遊戲世界發生爆炸嗰時要播爆炸聲);
- 按照遊戲物理,計算要播嗰段聲需要有乜嘢變化(例:如果玩家企喺離爆炸地點遠嘅地方,噉佢聽到嘅爆炸聲應該會細聲過企正喺爆炸地隔離聽到嘅)[註 2];
- 俾用家喺個遊戲引擎裏面一定程度上噉編輯啲聲檔案,例如係混音(audio mixing)嘅功能;
- 將適當嘅訊號傳遞俾部電腦嘅音響喇叭,等音響喇叭實際播啲聲出嚟;
... 等等[14]。
彩現引擎[編輯]
- 內文:彩現引擎
彩現引擎(rendering engine)包含一啲能夠做彩現(rendering),由 3D 模型嗰度製作出圖像嘅演算法:人同第啲動物(例如狗)比起上嚟相當依賴視覺[15][16],而廿一世紀嘅電子遊戲一般都係以視覺訊息做向玩家俾回輸嘅主要途徑[註 3],即係話一隻用三維電腦圖像嘅遊戲嘅程式要係噉做彩現嘅工作,俾玩家睇到更新咗嘅世界係乜嘢樣嘅。喺電腦圖像(CG)上,彩現(rendering)係指運用電腦程式由一柞 3D 模型嗰度整一幅二維影像出嚟嘅過程。想做彩現嘅人會首先整一個景檔案(scene file)出嚟,呢個檔案會包含咗多種訊息,包括係「個景入面用咗啲乜嘢 3D 模型」、「每個 3D 模型喺邊個位置」、「光源喺邊」同「個鏡頭擺喺邊個位置」呀噉,描述個景係點。然後部電腦會將呢個檔案入面嘅數據傳去一個彩現程式嗰度,等個程式做大柞人手做唔嚟嘅運算,計出個鏡頭會睇到嘅二維影像應該係點嘅樣嘅,並且將個鏡頭所睇到嘅影像俾出嚟做輸出[17][18]。
一個遊戲圖像引擎要識得處理以下嘅嘢(睇埋電腦圖像):
- 用某啲檔案格式儲住啲 3D 模型(如果隻遊戲用三維電腦圖像)同精靈圖(如果隻遊戲用二維電腦圖像)等嘅遊戲資產;
- 俾用家揀啲資產點樣擺入去啲景入面,以及鏡頭要擺邊同點郁(例如喺動作遊戲當中,遊戲鏡頭通常會喺主角嘅眼嗰度);
- 做彩現,途中要處理好多物理相關現象,例如係光源、陰影同反射等[註 4];
... 等等[17]。
物理引擎[編輯]
- 內文:物理引擎
物理引擎(physics engine)泛指用嚟模擬物理現象嘅電腦軟件,喺遊戲製作上好有用:除咗互動式小說等少數嘅遊戲類型之外,電子遊戲多數都會有個空間俾玩家控制某啲嘢喺入面郁動,所以一隻遊戲嘅世界多數要有物理定律主宰啲嘢應該點郁[註 5],而喺「更新遊戲世界狀態」嘅過程當中,個遊戲程式要按照遊戲嘅物理法則同玩家輸入計返個世界嘅狀態應該點變,例如一隻用牛頓力學(Newtonian mechanics)嘅賽車遊戲,喺玩家撳咗「踩油」嘅掣嗰陣,要改變架車嘅加速度數值,而架車相應嘅速度同位置等變數亦要跟牛頓力學裏面嘅法則作出相應嘅改變[19]。除此之外,聲引擎同彩現引擎亦會用到聲學同光學等物理學領域上嘅理論模型。
舉個例說明,模擬牛頓第二定律(Newton's second law)之下郁動嘅物體可以想像成以下噉嘅 C 程式語言源碼[20]:
double t = 0.0;
float dt = 1.0f;
float velocity = 0.0f;
float position = 0.0f;
float force = 10.0f;
float mass = 1.0f;
// 設一大柞變數,包括咗時間點(t)、時間間隔(dt)、速度(velocity)、位置(position)、件物體受嘅力(force)同件物體嘅質量(mass)。
while ( t <= 10.0 ) // 重複噉計若干次,計到時間點係 10 為止。
{
position = position + velocity * dt;
velocity = velocity + ( force / mass ) * dt; // 用牛頓第二定律計吓件物體受嘅力同佢嘅質量會點影響佢嘅速度。
t += dt;
}
人工智能[編輯]
- 內文:電子遊戲嘅人工智能
電子遊戲會用到人工智能(AI)嘅技術:好多遊戲嘅關卡入面都會有敵人俾玩家打,啲敵人要曉唔只淨係企喺度,仲要識探測玩家嘅位置,並且攻擊玩家,以及對玩家嘅攻擊作出迴避等等,為玩家提供一定程度嘅挑戰-即係話要令遊戲角色作出有智能嘅行為,而「令機械展示智能」正正就係人工智能嘅定義[21]。
一般嘅電子遊戲人工智能(video game AI)有以下嘅部份:
- 刺激詮釋器(stimulus interpreter):刺激詮釋器會話俾一個人工智能程式知個遊戲狀態係點;一般嚟講,每個個體敵人都會有個獨立嘅人工智能(除非隻遊戲係講玩家角色打緊一班具有集合心靈嘅外星人),每個智能會透過刺激詮釋器得到佢哋應該得到嘅資訊,跟住個程式要有方法表示「foreach 敵人,嗰個敵人手上有乜資訊」[22]。
- 決策系統(decision system):每一個人工智能都要按手上嘅資訊同自己嘅目的,計出跟住要採取乜嘢行動;例如一個敵人見到玩家,知道玩家嘅位置,而佢目的係要行埋玩家度攻擊佢,佢個人工智能程式就要有個方法教佢點樣用「玩家嘅位置」同「自己嘅位置」(個決策系統嘅輸入)計出「自己應該向乜方向移動」(個決策系統嘅輸出)[22]。
例如以下呢段碼,定義咗兩個子程式,用嚟教人工智能避開障礙物[23]:
private function collisionAvoidance() :Vector3D { // 計要點樣避,呢個子程式俾嘅結果會係一股力(睇返上面遊戲物理嗰度)。
ahead = ...; // calculate the ahead vector
ahead2 = ...; // calculate the ahead2 vector
var mostThreatening :Obstacle = findMostThreateningObstacle(); // 用「findMostThreateningObstacle」呢個子程式搵出最有威脅性嘅障礙物。
var avoidance :Vector3D = new Vector3D(0, 0, 0);
if (mostThreatening != null) { // 如果有障礙物,計避開嗰股力要係幾多,用「最有威脅性嘅障礙物」嘅位置同個角色嘅速度計。
avoidance.x = ahead.x - mostThreatening.center.x;
avoidance.y = ahead.y - mostThreatening.center.y;
avoidance.normalize();
avoidance.scaleBy(MAX_AVOID_FORCE);
} else {
avoidance.scaleBy(0); // nullify the avoidance force // 如果冇,避開嗰股力變 0(唔使避)。
}
return avoidance;
}
private function findMostThreateningObstacle() :Obstacle { // 用嚟搵出環境入面邊件障礙物最危險嘅子程式
var mostThreatening :Obstacle = null; // 首先將「最有威脅性嘅障礙物」設做「冇嘢」。
for (var i:int = 0; i < Game.instance.obstacles.length; i++) { // 逐件逐件障礙物計一次
var obstacle :Obstacle = Game.instance.obstacles[i];
var collision :Boolean = lineIntersecsCircle(ahead, ahead2, obstacle); // 計吓個角色會唔會同件障礙物相撞
// "position" 係個角色現時嘅位置
if (collision && (mostThreatening == null || distance(position, obstacle) < distance(position, mostThreatening))) {
// 如果會相撞,而且件障礙物近過目前手上最近嗰件「最有威脅性嘅障礙物」嘅話,將件障礙物設做「最有威脅性嘅障礙物」。
mostThreatening = obstacle;
}
}
return mostThreatening; // 將最後「最有威脅性嘅障礙物」俾做輸出。
}
喺個遊戲程式「更新遊戲狀態」嘅部份入面會有「foreach 人工智能角色,幫佢做 collisionAvoidance()
」噉嘅碼[23]。
圖像用家介面[編輯]
一個遊戲引擎要將上述嘅嘢擺喺一個圖像用家介面(graphical user interface,GUI)當中:原則上,聲、彩現、遊戲物理同埋人工智能冚唪唥都係可以齋用電腦碼嚟處理嘅(詳情可以睇遊戲編程);不過電腦碼對一般人嚟講唔係咁易明,而遊戲引擎為咗要做到大眾化,會將各引擎嘅內容以一啲圖像-而唔係齋靠電腦碼-嘅型式顯示出嚟,呢種用圖像表示嘅方式就係所謂嘅 GUI [24]),例如有若干個視窗,一個視窗顯示現有嘅遊戲資產、下一個視窗顯示個景、下一個視窗用文字型式列出個景有嘅物件同每件物件嘅名... 等等,而且每個視窗都會對用家俾嘅輸入起反應,例如喺用家用指標點擊咗景現有物件視窗所列嘅其中一件物件嗰陣,個引擎彈個新視窗出嚟,顯示嗰件物件嘅詳細資訊[11]。即係類似以下噉嘅碼[24]:
while True: // 一路係噉做... event = get_next_event() // 睇吓發生咗乜嘢事(例:用家係咪撳咗踎士左掣同埋指標喺邊個位置) // 做相應嗰個子程序 a_function_to_handle_the_event = event-handlers[event] if a_function_to_handle_the_event: a_function_to_handle_the_event() if window_needs_to_close: // 如果個視窗要關閉(例如用家撳咗踎士左掣,而指標喺個視窗嘅關閉掣嗰度),離開迴圈。 break # out of the event-loop
常用遊戲引擎[編輯]
註釋[編輯]
睇埋[編輯]
參考文獻[編輯]
- Anderson, E. F., Engel, S., Comninos, P., & McLoughlin, L. (2008, November). The case for research in game engine architecture (PDF). In Proceedings of the 2008 Conference on Future Play: Research, Play, Share (pp. 228-231).
- Gregory, J. (2018). Game engine architecture. crc Press.
- Nandy, A., & Chanda, D. (2016). Beginning Platino Game Engine (PDF). Apress.
攷[編輯]
- ↑ 1.0 1.1 1.2 Nandy, A., & Chanda, D. (2016). Beginning Platino Game Engine. Apress.
- ↑ Outerra: A seamless planet rendering engine. Gamasutra.
- ↑ "What is a Game Engine?". GameCareerGuide.com.
- ↑ 4.0 4.1 4.2 Gregory, J. (2018). Game engine architecture. crc Press.
- ↑ Top 5 best Game Engines to start indie game development in 2020. Gamasutra.
- ↑ Using memorable, iconic sounds in video games. Gamasutra.
- ↑ Art Tips for Building Forests. Gamasutra.
- ↑ Reasons Why Unity3D Is So Much Popular In The Gaming Industry. Medium.
- ↑ Johansson, Niklas, and Anton Löfgren. Designing for Extensibility: An Action Research Study of Maximizing Extensibility by Means of Design Principles. N.p.: n.p., n.d. University of Gothenburg Department of Applied Information Technology, 29 May 2009. Web. 26 Apr. 2014.
- ↑ The What and Why of Game Engines. Medium.
- ↑ 11.0 11.1 Writing a Game Engine from Scratch - Part 1: Messaging. Gamasutra.
- ↑ McShaffry, M. (2014). Game coding complete. Nelson Education.
- ↑ Valente, L., Conci, A., & Feijó, B. (2005). Real time game loop models for single-player computer games. In Proceedings of the IV Brazilian Symposium on Computer Games and Digital Entertainment (Vol. 89, p. 99).
- ↑ Thiparpakul, P., Jiravansirikul, T., & Dheandhanoo, T. (2020, March). The Satisfaction of Sword's Sound Effect in Game Design in Case of Metal Gear Rising and Sekiro: Shadow Dies Twice. In Proceedings of the 2020 8th International Conference on Information and Education Technology (pp. 252-256).
- ↑ Tranel, D., Logan, C. G., Frank, R. J., & Damasio, A. R. (1997). Explaining category-related effects in the retrieval of conceptual and lexical knowledge for concrete entities: Operationalization and analysis of factors. Neuropsychologia, 35(10), 1329-1339.
- ↑ Schifferstein, H. N. (2006). The perceived importance of sensory modalities in product usage: A study of self-reports. Acta psychologica, 121(1), 41-64.
- ↑ 17.0 17.1 Bouknight, W. J. (1970). "A procedure for generation of three-dimensional half-tone computer graphics presentations". Communications of the ACM. 13 (9): 527–536.
- ↑ Phong, B-T (1975). "Illumination for computer generated pictures". Communications of the ACM. 18 (6): 311–316.
- ↑ McShaffry, M. (2014). Game coding complete. Nelson Education. Ch. 2.
- ↑ Integration Basics: How to integrate the equations of motion 互聯網檔案館嘅歸檔,歸檔日期2018年10月26號,.. Gaffer on Games.
- ↑ Yannakakis, Geogios N (2012). "Game AI revisited" (PDF). Proceedings of the 9th Conference on Computing Frontiers: 285–292.
- ↑ 22.0 22.1 McShaffry, M. (2014). Game coding complete. Nelson Education. p. 45 - 46.
- ↑ 24.0 24.1 MSCOM (March 12, 2007). "The GUI versus the Command Line: Which is better? (Part 1)". Technet.com.
拎[編輯]
![]() |
維基同享有多媒體嘅嘢: 遊戲引擎 |
- Engines of Creation: An Overview of Game Engines. Gamasutra. (2008).
- Writing a Game Engine from Scratch - Part 1: Messaging. Gamasutra. (2015).
- Unity User Manual (2019.4 LTS).
- Unreal Engine Manual.