趙佳 喬鳳天



摘? 要? 以Unity3D作為游戲引擎,設計開發一款有關化學基本儀器使用的卡牌配對的科普類教育游戲。該游戲可作為一種科普工具,能夠幫助學習者了解基本化學儀器的使用。詳細介紹游戲制作的流程以及主要功能的實現,呈現游戲最后實現的效果圖,將科普知識融入游戲當中,增強學習的趣味性和游戲的科普性。
關鍵詞? Unity3D;教育游戲;科普游戲;卡牌配對;化學儀器
中圖分類號:TP317.6? ? 文獻標識碼:B
文章編號:1671-489X(2023)10-0038-05
Design and Implementation of Science Game Based on Unity3D: Taking Basic Chemical In-struments as Example//ZHAO Jia,QIAO Feng-tian
Abstract? Using Unity3D as the game engine, this paper designed and developed a popular science edu-cation game about the card pairing of basic chemical instruments, which can be used as a popular science tool to help learners understand the use of basic chemical instruments. This article details the pro-cess of game production and the implementation of the main functions, and presents the final effect diagram of the game. The integration of popular science knowledge into the game enhances the fun of learning and the popularity of the game.
Key words? Unity3D; education game; science games; card matching; chemical instrument
Authors address? Teacher Education Institute, The Capital Normal University, Beijing, China, 100037
0? 引言
近年來,游戲已被應用到教學領域,游戲和教學的融合程度越來越高,游戲化學習成為一種越來越普遍和受歡迎的學習方式,已經慢慢被教師和家長所接受。以科普為目的的科普類教育游戲也應運而生,它作為一種教育資源,本身所具有的娛樂性功能吸引了不少的學習者。此外,科普活動的教育目標不只是科學知識,還包括科學方法與科學精神,游戲化的實現手段使公眾在學習了解科學知識本身的同時,全方面地鍛煉溝通實踐等能力[1]。相比于傳統科普教育方式的枯燥和晦澀難懂,以游戲化的方式呈現科普知識,能夠增強科普過程中的趣味性以及學習者和科普知識之間的互動性。
科普游戲作為教育游戲的一種,從字面上了解,就是以知識科普為目的的教育游戲。但截至目前,國內還沒有對“科普游戲”作出明確的定義。劉玉花等[2]提出了“科普網游”的廣義概念和狹義概念。周忠和認為,科普游戲要符合游戲的四大特征:目標、規則、反饋、自愿參與。科普游戲不能離開科學的核心,還要有趣味,沒有科學的所謂科普游戲都是偽科普游戲,而科普游戲沒有了游戲的趣味和設定就不是游戲[3]。不容置疑的是,科普游戲的真正目的是寓教于樂,要將科普知識植入游戲當中,使學習者在與游戲的交互過程中潛移默化地學到知識,提高能力。
盡管科普游戲對于促進學習具有重大意義,但并未引起國內游戲行業的足夠重視。目前,國內的科普游戲主要用在科普場館,受眾面嚴重受限,而且,無論是在理論上還是在實踐上,國內科普游戲的發展與國外相比都存在較大的差距。科普游戲在不斷發展的過程中,逐漸暴露出它所存在的一些問題,比如科普游戲的娛樂性與教育性的平衡問題,很多游戲設計者都不能完美解決這一問題,一般都會出現兩個極端:有些科普游戲過分注重知識的科普性,附加了太多的教育元素,因而使它淪為了一個純粹的教育工具,像游戲“心理游戲”規定在有限時間內將給出的4張牌通過加減乘除計算得到結果24,整個游戲過程非常枯燥,且具有一定的難度;還有一部分科普游戲過分注重游戲的娛樂性,附加了太多的游戲元素,從而使它淪為了一個純粹的游戲軟件。諸如此類的問題一直困擾著科普游戲的開發者,而正確的科普游戲旨在使學習者在輕松愉悅且具有一定教育意義的游戲環境中獲取知識,鍛煉能力,增強技能。
本研究基于Unity3D游戲引擎,遵循游戲開發的系統性、實用性、藝術性等特點,設計并開發了一款面向小學高年級學生的有關基本化學儀器使用的卡牌配對類的科普游戲,該游戲具有一定的輔助教學的功能,能夠使學習過程變得簡單有趣,可以滿足向學生科普知識的基本需求。
1? 游戲設計
1.1? 游戲主題
本案例是以向學習者科普基本化學儀器的使用為主題,借鑒卡牌配對游戲的精髓,在設計過程中加入化學儀器,使用Unity3D引擎制作的一款科普游戲,游戲共分為兩大板塊,即游戲板塊和學習板塊。學習者通過鼠標點擊翻開卡牌,找到相互配對的卡牌,以此在與游戲的交互過程中,寓教于樂,獲得新知。
1.2? 游戲機制
本游戲共設置了3×4共12張卡牌,學習者可僅通過點擊鼠標來完成游戲。在游戲板塊,學習者在每點擊兩張卡牌后,游戲會檢測這兩張卡牌是否配對,配對成功則獲得時間獎勵,否則將自動翻過這兩張卡牌,并重復上述操作;在學習板塊,主要向學習者介紹一些基本的化學儀器,能在游戲過程中為學習者及時補充知識。作為一款科普類教育游戲,設定該游戲為單人版,難度適中,具有一定的可玩性和科普性。
1.3? 游戲項目制作流程
該游戲的制作共分為兩部分:一為前期的圖片和音樂等資源的收集與整理;二為后期的游戲UI設計、場景設計及程序實現等。在該游戲的設計開發工作全部完成之后,要先經過游戲測試,方能發布到相關平臺以投入使用。項目的具體制作流程如圖1所示。
1.4? 主要界面展示
基于以上游戲項目制作流程,展示游戲當中的一些主要界面圖,游戲界面和學習界面分別如圖2和圖3所示。
1.5? 游戲UI之間的邏輯關系
在游戲首頁共為玩家提供了兩種選擇,玩家若點擊“先學習”,則進入學習界面,學習完畢后會進入游戲界面,根據游戲結果進入相應的界面(游戲成功或游戲失敗界面),并在相應界面點擊要執行的相應的操作按鈕進行跳轉;玩家若在游戲首頁點擊“先游戲”,則進入游戲界面,根據游戲結果進入相應的界面(游戲成功或游戲失敗界面),并在相應界面點擊要執行的相應的操作按鈕進行跳轉。游戲邏輯圖如圖4所示。
2? 游戲的算法設計及實現思路
2.1? 如何生成牌面隨機分布的卡牌矩陣
本游戲提供了六種互為配對,但牌面各不相同的共計12張卡牌。在游戲開始時,會初始化生成3×4的卡牌矩陣,并依據每張卡牌之間的間距,將每張卡牌放置到其相應的位置上,隨后通過Random()函數實現卡牌的隨機分布。具體實現思路為:首先,創建一個一維數組images[]來存放12張牌面;其次,創建一個一維數組numbers[],并初始化為{0,11,1,10,2,9,3,8,4,7,5,6},num-bers[]數組中每個元素的值代表了images[]數組中每張牌面所對應的索引值,其中每相鄰的兩個元素所代表的卡牌互為配對(即卡牌索引值相加為11的兩張卡牌互為配對);再次,使用雙重循環語句來存儲卡牌的順序,并定義一個臨時變量tempObj來保存生成的卡牌;最后,使用Random()函數來實現卡牌分布的隨機化。
2.2? 如何通過鼠標點擊實現卡牌翻面
每張卡牌均有三種狀態,分別為“未翻面”“已翻面”和“配對成功”,可以創建一個枚舉類型來保存這三種狀態,定義兩個變量first Revealed Card和second Revealed Card分別用來保存第一次和第二次翻開的卡牌,并且要實時刷新這兩個變量的值。如果卡牌處于未被翻開狀態或是未配對成功狀態,則可通過鼠標點擊來實現卡牌的翻面,同時修改卡牌的狀態為“已翻面”狀態。
2.3? 如何檢測卡牌是否配對
每當玩家連續翻開兩張卡牌后,程序都要檢測這兩張卡牌是否配對成功。如若配對成功,則要使這兩張卡牌牌面朝上,并修改其狀態為“配對成功”狀態。具體實現思路為:首先,要判斷這兩張卡牌的索引值相加是否等于11,若是,則修改兩張卡牌的狀態為“配對成功”狀態,若否,則修改兩張卡牌的狀態為“未翻面”狀態;其次,要實時刷新存儲這兩張卡牌的臨時變量(即變量first Revealed Card和second Revealed Card),在判斷結束后,要將這兩個變量的值設為空。
2.4? 其他功能
倒計時和時間獎勵功能:規定該游戲要在30s的時間內完成,進入游戲時開始倒計時,若卡牌配對成功,會給予一定的時間獎勵。具體實現思路為:定義一個浮點型變量time,并初始化為30.0f,定義一個布爾類型的變量canCountdown,初始化為false;當進入游戲時,修改canCountdown的值為true,變量time開始自減;當配對成功時,變量time自增1;當變量canCountdown的值再次變為false時,表明時間耗盡,游戲失敗,并跳轉到游戲失敗界面。
游戲成功或失敗的判定:在規定時間內,將所有卡牌均配對成功,則表明游戲勝利。具體實現思路為:定義一個整型變量score,并將其初始化為0,每當卡牌配對成功時,score自增1,在游戲的規定時間30 s內,若score的值達到卡牌總數量的一半,即表明游戲成功,并跳轉到游戲成功界面。當時間耗盡,表明游戲失敗。
游戲步數的判定:規定每連續翻開兩張卡牌,步數加1。具體實現思路為:定義一個整型變量step來保存步數,并將其初始化為0;當翻開第二張卡牌時,step自增1。
背景音樂音效的觸發:本游戲共有四段音樂:背景音樂、卡牌配對錯誤提示音、游戲成功音效以及游戲失敗音效。當進入游戲時,觸發背景音樂;當連續翻開兩張卡牌,但未配對成功時,觸發卡牌配對錯誤提示音效;當游戲成功或失敗時分別觸發游戲成功和游戲失敗音效。
3? 游戲關鍵功能的算法實現
通過上述對游戲算法的設計和實現思路,在Unity3D游戲引擎中來進行游戲的制作,以下給出了游戲當中一些關鍵功能的算法實現。
3.1? 資源的導入和預制體的制作
在Unity3D引擎中的Project窗口創建“Prefabs”“Audio”和“Sprites”三個文件夾分別用來保存項目制作過程中所用到的預制體、音頻資源和圖片資源,分別如圖5、圖6和圖7所示。該游戲中的預制體為卡牌的背面圖片,音頻資源主要包括游戲背景音和游戲中的各種觸發音效,圖片資源主要是游戲背景圖、卡牌的牌面和各種UI背景等。
3.2? 卡牌的初始化和隨機分布
游戲初始界面生成3×4的卡牌矩陣。通過一個雙重循環語句來保存生成的卡牌,借助Random()函數來實現卡牌的隨機化分布。該功能的關鍵代碼如下:
private int gridRows = 3, gridCols = 4;
//卡牌矩陣的行數和列數
private float offsetX = 2.5f, offsetY = 2.7f;
//卡牌之間的間距
private float originalX = -5f, originalY = -3f;
//卡牌的原始位置
//初始化生成卡牌
void ArrangeCards()
{
for (int i = 0; i < gridRows; i++)
{
for(int j = 0; j < gridCols; j++
{
//初始化生成卡牌
MemaryCard tempObj = Instantiate(Card) as MemaryCard;
tempObj.GetComponent
bers[i * gridCols + j]]);
//設置每張卡牌的狀態為未翻開狀態
tempObj.GetComponent
//計算每張卡牌的位置
float posX = (offsetX * j) + originalX;
float posY = (offsetY * i) + originalY;
//將每張卡牌放置到相對應的位置上
tempObj.transform.position = new Vector3(posX, posY, 0);
}
}
}
//卡牌的隨機化分布
int[] ShuffleCards(int[] numbers)
{//定義一個數組來保存每張卡牌的索引值
int[] tempNums = numbers.Clone() as int[];
for (int i = 0; i < tempNums.Length; i++)
{
//定義一個變量來保存隨機生成的索引值
int r = Random.Range(i, tempNums.Length);
//定義一個臨時變量來存放每張卡牌,并將其與隨機生成的索引值所代表的卡牌互換位置,從而實現卡牌的隨機化分布
int temp = tempNums[i];
tempNums[i] = tempNums[r];
tempNums[r] = temp;
}
//返回卡牌的索引值
return tempNums;
}
3.3? 鼠標點擊卡牌翻面
當鼠標點擊卡牌時,需完成的任務包括保存每次點擊的卡牌以及需改卡牌的狀態。需要判斷是第一次還是第二次點擊卡牌,當卡牌第一次被點擊時,需保存到變量firstRevealedCard中,當卡牌第二次被點擊時,需保存到變量secondRevealedCard中。該功能的關鍵代碼如下:
public void CardReveal(MemaryCard card)
{
//首先判斷是否為第一次點擊,翻開牌面
if(firstRevealedCard ==null)
{
//如果是,則將這張卡牌存儲在變量firstRevealedCard中
firstRevealedCard = card;
}
else
{
//如果不是,則將這張卡牌存儲在變量secondRevealedCard中
secondRevealedCrad = card;
//更新步數
step++;
stepText.text = “步數:” + step;
//調用CheckMatch()函數,判斷是否配對成功
Invoke(“CheckMatch”, 1f);
}
}
//鼠標點擊操作
public void OnMouseDown()
{
//可翻開卡牌的條件:卡牌處于未翻開狀態、未配對成功狀態以及第二張卡牌為空
if (cardstate == cardState.Unreveal && cardstate != cardState.Matched && sceneManager.canReveal())
{
//調用Reveal()函數,修改卡牌的狀態為“已翻面”狀態
Reveal();
sceneManager.CardReveal(this);
}
}
3.4? 卡牌的配對
兩張卡牌成功配對的條件為索引值相加等于11,若滿足此條件說明卡牌成功配對,此后需要修改這兩張卡牌的狀態。該功能的關鍵代碼如下:
private void CheckMatch()
{
//如果兩張卡牌的索引值相加等于11,則說明這兩張卡牌配對成功
if (firstRevealedCard.getID() + secondRevealedCrad.getID()==11)
{
//修改兩張卡牌的狀態為“配對成功”狀態
firstRevealedCard.Matched();
secondRevealedCrad.Matched();
timer.time++;
//變量score用來保存已配對成功的卡牌數量
score++;
//每次成功配對后,都要判斷游戲是否成功
Victory();
}
else
{
//觸發警告音效
source.PlayOneShot(warningSound, 1F);
//修改兩張卡牌的狀態為“未翻面”狀態
firstRevealedCard.Unreveal();
secondRevealedCrad.Unreveal();
}
//將臨時存放兩張卡牌的變量設為空
firstRevealedCard = null;
secondRevealedCrad = null;
}
4? 結束語
本文借助Unity3D游戲引擎開發了一款關于基本化學儀器使用的卡牌配對類的科普教育游戲,后續可發布到PC端、Android手機等多種平臺,具有較好的跨平臺特征。本游戲能夠將化學知識與Unity3D引擎有效融合,在游戲設計和開發的過程中,既提供了一定的娛樂功能,又保證了在游戲中融入一定的科普知識,使玩家通過簡單的鼠標點擊操作,在游戲的過程中學到知識,具有較好的互動性和沉浸效果,能夠在一定程度上彌補傳統的科普方式的缺陷,具有一定的輔助教學的功能。雖然在游戲的前期準備階段和后續的開發階段遇到了一些問題,但經過深入研究之后,都能夠找到相應的解決方案。由于本游戲現在的結構功能還不完整,因此,筆者在后期會嘗試將其他一些化學知識加入本游戲當中,從而形成一個更完整、更有體系的有關化學知識的科普類教育游戲。
5? 參考文獻
[1] 肖云,谷美慧.科普教育游戲化的研究與思考[M]//2018年(第五屆)科學與藝術研討會論文集,2018:98-107.
[2] 劉玉花,費廣正,姜珂.科普網游及其產業發展研究[J].科普研究,2011,6(6):34-38.
[3] 托波.游戲改變教育:數字游戲如何讓我們的孩子變聰明[M].何威,褚萌萌,譯.上海:華東師范大學出版社,2017.