我們?cè)?jīng)為大家推出一些Unity教程,例如在Unity中拼一個(gè)3D“魔方”用Playmaker制作碎裂物品效果,使用UFPS創(chuàng)建第一人稱射擊游戲等,均受到了廣大開發(fā)者們的歡迎。今天我們繼續(xù)為大家分享一篇教程:教大家在Unity中制作一款文字冒險(xiǎn)游戲。

?

游戲靈感來自于“火柴人亨利(Henry Stickmin)”系列游戲,以及一些上世紀(jì)80年代的《驚險(xiǎn)岔路口》冒險(xiǎn)叢書。游戲根據(jù)玩家的不同選擇來展開故事情節(jié),通常會(huì)擁有多重結(jié)局。

?

?

基本程序設(shè)計(jì)(故事卡)

?

?

游戲會(huì)為玩家呈現(xiàn)一個(gè)“故事卡”。故事卡上包含一些文字,其中一部分是用于描述玩家當(dāng)前的狀態(tài),另外一部分是在當(dāng)前情況下玩家可以做出的一系列選擇。

?

?

根據(jù)玩家的不同選擇,劇情也會(huì)按照不同的分支向前發(fā)展,并持續(xù)出現(xiàn)新的卡片與選擇,直到最終的卡片不再有新的選擇,則游戲結(jié)束。

?

制作一張“故事卡”很簡(jiǎn)單。根據(jù)上訴需求,我們新建StoryCard腳本,腳本代碼如下:

?

?

StoryCard在檢視面板中顯示如下:

?

?

您需要在StoryCard腳本的Description字段中輸入卡片描述(玩家可以在屏幕上看到的文本)、玩家在選項(xiàng)按鈕上看到的文字(目前該程序最多支持4個(gè)按鈕)、以及按下對(duì)應(yīng)按鈕后跳轉(zhuǎn)的故事卡(即為分支,稍后會(huì)介紹)。

?

StoryCard腳本還包含兩個(gè)故事狀態(tài)屬性“States to Set True”以及“States to Set False”,這兩個(gè)屬性分別有何作用呢?下面就來看看。

?

故事狀態(tài)與分支

?

?

其實(shí)整個(gè)系統(tǒng)可以完全使用“故事卡”來制作,但僅使用“故事卡”的話,游戲流程就變得很枯燥無味。假設(shè)有某個(gè)選項(xiàng),玩家點(diǎn)擊了該按鈕,但該選項(xiàng)所導(dǎo)致的后果并不會(huì)立即在劇情中呈現(xiàn),而是在隨后的劇情中緩慢展開。假使僅使用“故事卡”,就需要立即從該選項(xiàng)開始出現(xiàn)分支,并且直至該選項(xiàng)導(dǎo)致的最終影響出現(xiàn)之前,都要在所有劇情分支上重復(fù)同樣的步驟。

?

因此,我們需要一個(gè)更好的解決辦法。

?

前面提出了“故事狀態(tài)”的概念用于存儲(chǔ)狀態(tài)值,這其實(shí)只是一個(gè)布爾值容器??ㄆ诒患せ顣r(shí)可以根據(jù)需要對(duì)特定的狀態(tài)進(jìn)行賦值。新建StoryState腳本,代碼如下:

?

?

StoryState腳本在檢視面板中顯示如下圖:

?

?

該方法解決了記住狀態(tài)值的問題,下面通過“劇情分支(Story Branch)”來應(yīng)用這些狀態(tài)值。一個(gè)分支會(huì)引用一個(gè)狀態(tài)以及劇情發(fā)展的兩個(gè)不同方向(可以是“故事卡”或者劇情分支),被引用的狀態(tài)值用于決定劇情走向何種結(jié)果。

?

游戲管理器

?

?

這個(gè)管理器用于承載整個(gè)劇情的發(fā)展,其作用是將目前的“故事卡”狀態(tài)更新到UI上,在不同按鈕按下時(shí)做出對(duì)應(yīng)的動(dòng)作,并引導(dǎo)劇情前進(jìn)。這個(gè)管理器也需要一個(gè)“故事卡”來作為故事的開端。以下是GameManager腳本的內(nèi)容:

?

?

其中SetCurrentStoryItem函數(shù)用于設(shè)置當(dāng)前顯示的劇情節(jié)點(diǎn)。SetCardDetails函數(shù)用于設(shè)置“故事卡”的細(xì)節(jié),例如劇情描述,選項(xiàng)按鈕及描述等。UpdateButtons函數(shù)用于更新所有選項(xiàng)按鈕及其響應(yīng)事件。

?

GameManager腳本在檢視面板中顯示如下圖:

?

銳亞教育