最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

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

2020-06-04 23:23 作者:皮皮關(guān)做游戲  | 我要投稿

作者:Yumir


哈嘍大家好我是yumir

文字冒險游戲一直是一個廣受歡迎的游戲類型,有小可愛問我有沒有文字冒險游戲的制作思路,今天就分享一下,做一個簡單的文字冒險游戲,只需要128行代碼~

這次我只做了文字顯示和分支選擇的部分(已經(jīng)足夠用來制作一個游戲了),實際上不管有多少元素,按著我這個思路都是可以實現(xiàn)的。下圖是當(dāng)前的游戲效果:

我的思路是把系統(tǒng)分為三個部分:

  1. 視圖搭建:界面上所有的元素,比如:角色名稱、立繪、對話等等元素,需要在場景中搭建制作好預(yù)制體。

  2. 數(shù)據(jù)結(jié)構(gòu):根據(jù)游戲內(nèi)容設(shè)計需要填充的數(shù)據(jù),對應(yīng)以上比如:角色名、立繪圖片名稱、對話內(nèi)容等等,除此之外需要一個字段“ID”作為句子的唯一標(biāo)識。

  3. 業(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)一步了解:levelpp.com/

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

分享到微博請遵守國家法律
华池县| 闵行区| 老河口市| 揭阳市| 涪陵区| 大宁县| 上林县| 河曲县| 玛多县| 江安县| 洞口县| 桂东县| 贵溪市| 彩票| 黔西县| 太康县| 兴城市| 麦盖提县| 德江县| 樟树市| 大化| 德庆县| 呼伦贝尔市| 绍兴县| 洛南县| 洛阳市| 广西| 永年县| 珠海市| 微博| 南阳市| 临夏市| 崇礼县| 沅陵县| 炉霍县| 武邑县| 大余县| 崇州市| 贺兰县| 伊金霍洛旗| 准格尔旗|