遊戲開發和遊戲腳本的那些事

0x00 前言:

自從年末換了公司以後已經有一段時間沒有寫博客了。多是這段時間工做的更愉快了,所謂「業精於勤,而荒於嬉」吧(此處有表情)。這周終於意識到了這點,看來仍是要恢復以前寫博客的狀態。今天就來寫寫遊戲引擎和腳本編程的話題吧。html

0x01 遊戲腳本,用仍是不用?

這是一個問題?
遊戲開發提供對腳本的支持可謂源遠流長。
f2817bcb0a46f21fe838a1c2f6246b600d33aeda.jpg
2002年的無冬之夜,玩家能夠方便的開發Mod。c++

20090713065321-1538168564.jpg
2005年的黑與白2,按照劇本演繹大電影的感受。程序員

122433gz64zw4xmrshd9xs.jpg
2011年的老滾5,玩家能夠方便的開發本身的Mod,生命力直到6年後的如今依然旺盛。編程

固然,讓更多人知道遊戲腳本的是網絡遊戲的興起。網絡

20100530_b6bc8e047ae9176e4f68QBsCEiZELMds.jpg
24b0b051f8198618df2b57d64aed2e738ad4e6a4.png
開發網絡遊戲的插件或是外掛,遊戲腳本老是要打交道的。函數

好像你們都在使用腳本開發遊戲。插件

0x02 什麼是遊戲腳本


使用c/c++開發項目,隨着項目的擴大,源碼的編譯時間也會愈來愈長。有時修改一些常量就須要從新編譯整個項目。是否感受到了痛苦?設計

見招拆招,爲了解決這個問題,能夠將不少常量放到一個初始化文件中。而且編寫一段代碼去讀取並解析這個文件。這樣,常量就以初始化文件/配置文件的形式獨立出來了。修改常量的值不再用從新編譯整個項目了!3d

這就是一個最初級的遊戲腳本!並且初始化文件中的文本就是最基本的遊戲腳本語言。調試

可是,僅僅是提供一些常量的讀取和解析彷佛還不可以知足遊戲開發的需求,爲了提升遊戲開發的效率,節約編譯c/c++項目時泡咖啡的時間,更高級的遊戲腳本語言顯然有必要引入。
20121115101523703.jpg
So,更高級的腳本語言增長了腳本和c/c++的交互性,咱們不但能夠初始化變量,並且能夠建立遊戲邏輯甚至時遊戲對象。

遊戲腳本的運行經過虛擬機來進行,咱們使用腳本語言的語法編寫的函數能夠被虛擬機讀取並運行。換言之,腳本能夠經過虛擬機與c/c++進行通訊,使得數據能夠在二者之間來回傳遞。

腳本能夠是解釋執行的,也能夠是編譯執行的。解釋執行的腳本經過解釋器,逐行的讀取、解析和執行。可是,爲了節約在運行時的開銷,一些解釋執行的腳本會自動編譯腳本。Lua即是其中的表明。

固然,腳本還能夠是編譯執行的。編譯執行的腳本是經過這種腳本語言的編譯器編譯爲某種形式的中間語言(IL)的腳本。虛擬機是能夠直接執行這種中間語言的。
這種中間語言是平臺無關的,換言之,這種中間語言是供虛擬機使用的,而不關心具體的平臺。

例如如今很流行的Unity引擎所使用的C#語言。
C_Sharp_wordmark.png
在使用Unity開發遊戲的過程當中,腳本代碼的編譯只須要分爲兩部分就能夠了:
第一部分是從C#代碼自己到CIL的編譯(其實以後 CIL還會被編譯成一種位元碼,生成一個 CLI assembly);
第二部分 是運行時從 CIL(實際上是 CLI assembly,不過爲了直觀理解,此處沒必要糾結這種細節)到本地 指令的即時編譯(這就引出了爲什麼 Unity 3D官方沒有提供熱更新的緣由:在 iOS平臺中 Mono 沒法使用 JIT 引擎,而是以 Full AOT 模式運行的,因此此處說的即時編譯不包括 iOS 平臺)。

0x03爲何要使用腳本?

便捷的初始化文件:

最簡單的應用即是咱們可使用腳本做爲初始化文件,這是一個讀入/修改遊戲數據快速而方便的方法。

1366785737_283556289.jpg

節約遊戲開發的時間,提升效率:

隨着遊戲規模的日益龐大,C/C++代碼的編譯時間會愈來愈久。一些須要常常調試的功能若是每次修改都編譯一遍整個項目,無疑會形成效率的地下。例如ai程序員,經常須要調試查看效果。所以若是都在C/C++中實現,會形成效率的低下。
153_151217092353_1.jpg

下降了編程的門檻,提升了創造性:

不能否認的一點,一些腳本語言比C/C++更高級,這主要體如今語法更加直觀、上手更加容易。所以,一些非程序員也可使用腳本語言來實現本身的需求。
固然,另外一方面來講更容易招到初級程序員。不過,我認爲這同時也致使了另一個問題,即不少程序員所以成爲了API搬運工,只知其然而不知其因此然。
276_150719085700_2.jpg

帶來了拓展性,Mod:

使用腳本語言,遊戲開發商能夠把遊戲引擎的功能交給玩家。反過來,經過玩家創造的Mod又爲遊戲提供了新的生命力。
這方面老滾5是一個經典的例子。11年發售的老滾5因爲其拓展性,生命力十分頑強。
0d338744ebf81a4ce2694adbd12a6059252da64d.jpg

0x04 遊戲開發中腳本的常見使用場景

對話流

2015111914527186.jpg

使用腳原本管理遊戲中的對話是一個最多見的應用。這類腳本經常隨某個特定的事件而觸發。例如場景設計師設計主角在靠近某個NPC時觸發和該NPC的對話。對話內容能夠直接由場景設計師來製做。

舞臺設計

fda29e9e78f74f000930.jpg
腳本在遊戲中常見的一個應用還包括設計舞臺。經過腳原本控制遊戲場景中的對象和各類事件能夠營造出頗有沉浸式的遊戲場景。
這裏遊戲腳本就十分相似電影的劇本。

玩法邏輯

1559061_092430.jpg
因爲邏輯開發須要常常的調試,若是每次代碼修改都要進行一次冗長的從新編譯,這會形成工做效率和開發人員身體健康的降低。所以使用腳本能夠避免這一點。

0x05 後記

在下一篇文章中咱們就來聊聊使用Unity遊戲引擎開發遊戲的過程當中和遊戲腳本有關的話題吧。
歡迎你們關注個人公衆號慕容的遊戲編程:chenjd01
201701312351412651fGTISk.png

最後打個廣告,歡迎支持個人書《Unity 3D腳本編程》~
686199-20160919193306199-2036072132.jpg

相關文章
相關標籤/搜索