用128行代碼實現(xiàn)一個文字冒險游戲

作者:Yumir
哈嘍大家好我是yumir
文字冒險游戲一直是一個廣受歡迎的游戲類型,有小可愛問我有沒有文字冒險游戲的制作思路,今天就分享一下,做一個簡單的文字冒險游戲,只需要128行代碼~
這次我只做了文字顯示和分支選擇的部分(已經(jīng)足夠用來制作一個游戲了),實際上不管有多少元素,按著我這個思路都是可以實現(xiàn)的。下圖是當(dāng)前的游戲效果:

我的思路是把系統(tǒng)分為三個部分:
視圖搭建:界面上所有的元素,比如:角色名稱、立繪、對話等等元素,需要在場景中搭建制作好預(yù)制體。
數(shù)據(jù)結(jié)構(gòu):根據(jù)游戲內(nèi)容設(shè)計需要填充的數(shù)據(jù),對應(yīng)以上比如:角色名、立繪圖片名稱、對話內(nèi)容等等,除此之外需要一個字段“ID”作為句子的唯一標(biāo)識。
業(yè)務(wù)邏輯:將讀取到的數(shù)據(jù)(“2”的數(shù)據(jù)結(jié)構(gòu)中的內(nèi)容)和“1”的界面元素一一對應(yīng)編寫邏輯。
一、視圖搭建
根據(jù)需求搭建界面,因人而異,我在場景中放了:背景、對話框和選項框。

背景是一張圖片,對話框是在圖片中加上文本,選項框稍微復(fù)雜,你需要新建一個空的UI物體,調(diào)整到合適的大小布局,然后在該物體上加上“Grid Layout Group”組件,設(shè)置如下(尺寸自行調(diào)整)。

然后在該物體中新建一個子物體作為選項的預(yù)制體,我的選項特簡單,就是底圖加文字組成的按鈕,選項預(yù)制體需要寫一個對文字內(nèi)容賦值用的腳本:
?? ?public Text text;
??? public int number;
??? public void Start()
??? {
??????? GetComponent<Button>().onClick.AddListener(()=> { TalkWin.instance.WhenSwitchNodeGetAnswer(number); });
??? }
??? public void SetAnswerUI(string s,int i)
??? {
??????? text.text = s;
??????? number = i;
??? }
?
二、數(shù)據(jù)結(jié)構(gòu)
為了方便填充劇情,我們需要把所有可控條件(文本、圖片名稱、是否特效等等)都用一個一個的對象存儲起來,針對需求定制不同的類。
根據(jù)我的需求,游戲中對話有兩種情況,而所有游戲?qū)υ捰钟型|(zhì)內(nèi)容,所以我將他們提煉到父類中,他們之間的關(guān)系如下(類圖):

之所以這么寫純粹是因為寫重復(fù)的字段很累,為了進(jìn)一步偷懶(不使用額外的文件)在聲明的類的前面加上[System.Serializable]。
using System;
[Serializable]
public class CommonTalkNode : TalkNode
{
??? public int nextID;
??? public CommonTalkNode(int ID, string nameText, string talkText, double charSpeed, int nextID) : base(ID, nameText, talkText, charSpeed)
??? {
??????? this.nextID = nextID;
??? }
}
?
這樣一來就可以直接在面板上填寫數(shù)據(jù)了。

三、業(yè)務(wù)邏輯
我需要一個打字機(jī)的動畫效果,而DOTween正好有現(xiàn)成的,所以直接封裝一個方法來更新對話框部分的UI刷新邏輯:
??? public void UpdateTalkWinShow(string nameText,string talkText, float charSpeed)
??? {
??????? this.nameText.text = nameText;
??????? this.talkText.text = "";
??????? this.talkText.DOText(talkText, charSpeed * talkText.Length);
??? }
?
為了知道每次持有的是哪個對話對象,我們需要在系統(tǒng)中聲明一個int值類型的字段,作為當(dāng)前“對話”的指針,初始值是第一個對話對象的ID,也就是“1001”。在每次播放當(dāng)前對話內(nèi)容之后將該值替換為實現(xiàn)設(shè)置好的“nextID”。
寫一個點擊事件根據(jù)不同的ID進(jìn)行判斷:
??????? if (textID>1000&&textID<2000)
??????? {
??????????? UpdateTalkWinShow(commonDic[textID].nameText, commonDic[textID].talkText, (float)commonDic[textID].charSpeed);
??????????? textID = commonDic[textID].nextID;
??????? }
??????? else if (textID > 2000 && textID < 3000)
??????? {
??????????? UpdateTalkWinShow(switchDic[textID].nameText, switchDic[textID].talkText, (float)switchDic[textID].charSpeed);
??????????? CreateAnswerUI(switchDic[textID].switchText);
??????????? GetComponent<Button>().interactable = false;
??????? }
?
再回到場景中點擊運行,欸,這么簡單就完成了?

鏈接:https://pan.baidu.com/share/init?surl=zaLoeu8RASWNKSyyookbFg
提取碼:8mus

歡迎加入游戲開發(fā)群歡樂攪基:610475807
對游戲開發(fā)感興趣的童鞋可戳這里進(jìn)一步了解:http://www.levelpp.com/