崑 山 科 技 大 學
電腦與通訊系 四技部
專 題 製 作 報 告
英文打字遊戲
專題學生:蕭翊晨(4010D004)
指導老師:郭崇仁
中 華 民 國 一 零 九 年 六 月
i
摘要
從很久之前開始,英文就一直是相當普遍的國際語言,被認 為是簡單且易於學習的,使用英文是比較便利的,許多人即使他 們的母語並非英文,也會學習英文作為其第二語言,也因此,想 順利地與西方語系的外國人溝通,用英文會比較容易。 對大部分人來說,英文打字因為不常接觸,因為自身的母語 是中文,而經常使用到的則是中打,在這方面的速度也沒有中文 來的快速,有些則是得要看著鍵盤才有辦法準確的將英文打出來, 在這個已經需要頻繁使用電腦的時代,想必這樣會浪費許多不必 要的時間,所以如果有學習一點英打,記憶並熟悉英文字母的鍵 位的話,想必會相當的有幫助。ii
目 錄
頁次 摘要 i 目錄 ii 第一章 緒論 1.1 研究背景 1 1.2 研究動機及目的 3 第二章 文獻探討 2.1 鍵盤鍵位 4 2.2 Unity 遊戲引擎介紹 6 2.3 Unity 應用案例 8 第三章 製作畫面及程式介紹 3.1 Unity 製作畫面 12 3.2 Debug 及測試畫面 13 3.3 程式碼 14 第四章 成果與未來展望 4.1 遊戲畫面展示 35 4.2 未來展望 37 第五張 結論 38 參考文獻 391
第一章 緒論
1.1 研究背景
在搜尋了一些資料後,可以發現有以英文為母語的人數大約為 3.7 億人,而作為第二語言的人數更是高達將近 9 億人,再者我認為 在歐美國家即使英文並非他們的第二語言,依然擁有著可以使用英文 來作為簡易溝通的能力,因此我覺得增加自己所懂的單字數量來提升 英文能力會相當的有幫助。 語言 母語使用者 母語排名 英語 369,700,000 3 漢語 960,000,000 1 西班牙語 570,000,000 2 語言 第二語言使用者 第二語言排名 英語 898,400,000 1 漢語 193,000,000 4 西班牙語 91,000,000 8 從上面的表格可以看見英語在母語使用者數量上排名第三,而在 第二語言的使用者數量方面更是高達了第一名,是被相當普遍用 來使用的語言。2
上圖深藍色的部分為官方語言及主要母語是英文的國家 而青色的部分則是官方語言為英文而主要母語非英文的國家
3
1.2 研究動機及目的
現代人使用電腦的次數越來越頻繁,而在電腦的使用上絕大多數 像是指令、命令和程式語言等,這些都還是以英文為主,在這種情況 下如果能夠不需要一邊看著鍵盤找英文字母鍵位一邊打字的話便可 以輕鬆不費時的有效將一整串英文打出來。 而會想要用英文打字遊戲來訓練則是因為覺得這樣的方式帶有趣味 性,想必可以有效的提高人們的接受度和使用意願。 像我以前就見過一些一同上程式設計課的同學,因為他們並不熟悉英 打,便導致他們在課程上寫程式的時候需要頻繁的去找英文字母的鍵 位,這使得他們需要在這方面多花點時間以及心力去追上課程,因此 才讓我有了英文打字遊戲這個構想。4
第二章 文獻探討
2.1 鍵盤鍵位簡介
中文鍵盤 這是在台灣大量使用的鍵盤,鍵盤上有著英文字母、注音、倉頡還有 大易。 英文鍵盤5 上圖是雙手在英文打字時,每根手指頭需要負責的區塊,通常從左手 的小指到食指會依序放在 ASDF 的地方,而從右手的食指到小指則是 JKL;,也因此在 F 跟 J 兩處可以發現有兩個凸起,就是為了讓使用者 可以方便快速地尋找到手指放的位置。 雖然還有其他國家的鍵盤在英文字母位置的放置上有些些微的不同, 像是德國鍵盤的 Y 和 Z 位置就是對調過來的,而法國和比利時則是將 W 和 Z 對調過來。 不過這邊就先著重於在台灣比較常見的鍵盤來介紹。
6
2.2 Unity 遊戲引擎介紹
是一款由 Unity Technologies 研發的跨平台遊戲引擎,可用於開發 Windows、MacOS、Linux、 PlayStation、Xbox、Wii、任天堂 3DS、 Switch 等平台以及 iOS、Android 等行動裝置的電動遊戲,所支援的 遊戲平台還延伸到了基於 WebGL 技術的 HTML5 網頁平台,和 tvOS、 Oculus Rift、ARKit 等新一代多媒體平台。 除了可以用於研發電子遊戲之外,Unity 還廣泛用作建築視覺化、即 時三維動畫等類型互動內容的綜合型創作工具,並支援 對 Nvidia 的 PhysX 物理引擎、粒子系統,並且提供網路多人連線的功能,多人網 路連線功能由第三方套件提供,有 Raknet、Photon、SmartFoxServer 等多種選擇。圖形引擎使用的是 Direct3D、OpenGL 和自有的 APIs,支援 Bump mapping、Reflection mapping、Parallax mapping、Screen Space Ambient Occlusion、動態陰影使用的是 Shadow Map 技術,並支援 Render-to-texture 和全螢幕 Post Processing 效果。
Shaders 編寫使用 ShaderLab 語言,同時支援自有工作流中的編程方 式或 Cg、GLSL 語言編寫的 Shader,一個 Shader 可以包含眾多變數 及一個參數介面,允許 Unity 去判定參數是否為當前所支援並適配最 適合參數,並自己選擇相應的 Shader 類型以獲得廣大的相容性,內
7
建對 Nvidia 的 PhysX 物理引擎支援,遊戲指令碼基於 Mono,一個相 容於.NET Framework 2.0 的跨平台開源套件,因此程式設計師可用 JavaScript、C#或 Boo 加以編寫。
The Unity Asset Server:一個支援各種遊戲和指令碼的版本控制方 案,使用 PostgreSQL 作為後端,音效系統基於 OpenAL 程式庫,可以 播放 Ogg Vorbis 的壓縮音效,影片播放採用 Theora 編碼,內建地形 編輯器,支援樹木與植被貼片 內建 Lightmap ping 以及 Global illumination。
Unity因為有著層級式的綜合開發環境,視覺化編輯,詳細的屬性編
輯器和動態的遊戲預覽。也被用來快速的製作遊戲或者開發遊戲原型。
可開發微軟 Microsoft Windows 和 Mac OS X 的可執行檔,線上內容, Mac OS X 的 Dashboard 工具,Wii 程式和 iPhone 應用程式。
專案中的資源會被自動匯入,並根據資源的改動自動更新。雖然很多 主流的三維建模軟體為 Unity 所支援,不過對於 3ds Max、Maya、 Blender、Cinema 4D 和 Cheetah3D 的支援比較好,並支援一些其他 的三維格式。
8
2.3 Unity 應用案例
Wasteland2 / 荒野遊俠 2
這是一款由 inXile Entertainment 所開發,以角色扮演為主並讓玩 家控制角色去探索末日後世界的回合制戰略遊戲,在許多評分項目當 中都拿到了相當不錯的成績,是一款非常成功的遊戲,而使用的引擎 就是 Unity4,之後更將引擎升級為 Unity5 推出了荒野遊俠 2:導演剪 輯版。Escape from Tarkov / 逃離塔科夫
這是一款由Battlestate Games 所開發,多人連線對戰為主的第一人
稱射擊遊戲,遊戲畫面中的一些材質、細節等都讓人相當驚艷,沒想 到 Unity 引擎也能夠做出這種類型的遊戲。
9
Fall Guys: Ultimate Knockout / 糖豆人:終極淘汰賽
這是一款由 Mediatonic 所開發,多人連線競技為主的大逃殺類型遊 戲,讓許多玩家在一張遊戲地圖中互相合作或競爭,最後留下來的那 一位則成為整場遊戲的唯一贏家,這款糖豆人的有趣遊戲方式在剛推 出時就吸引了大量玩家,可以說是製作相當成功的一款遊戲,同樣也 是使用了 Unity 的引擎。
10
Inside
這是一款由 Playdead 所開發,以平台解謎為主的冒險遊戲,而這家 獨立遊戲工作室之前則是開發了地獄邊境,而地獄邊境同樣也是一款 解謎遊戲,這款 Inside 在氣氛的營造上相當的優秀,雖然是以解謎 的性質為主,但還是能夠透過螢幕感受到這款遊戲帶給人的沉重感。Hearthstone: Heroes of Warcraft /
爐石戰記:魔獸英雄傳這是一款由Blizzard Entertainment,Inc.所開發,讓雙方玩家用彼 此收集來的卡片進行對戰的集換式卡牌遊戲,遊戲的特色是當中登場 的人物是以同為暴雪旗下的遊戲,魔獸世界中所登場的角色,而遊戲 的內容也相當成功,多樣化的卡牌以及豐富的搭配方式讓玩法更佳的
11
多變,是款相當有趣的對戰遊戲,而這也是利用 Unity 引擎製作出來 的。
12
第三章 製作畫面及程式介紹
3.1 Unity 製作畫面
13
3.2 測試及 Debug 畫面
這些是在測試字母跟單字有沒有按照我所想要的隨機進行輸出,還有 是否能正確地出現在畫面中,並順利掉落下來,以及輸入的字母有無 正確地將畫面中的字母給消去。
14
3.3 程式碼
using System.Collections; using System.Collections.Generic; using UnityEngine; [System.Serializable]public class Word
{
public string word; private int typeIndex;
WordDisplay display;
public Word (string _word,WordDisplay _display) {
word = _word; typeIndex = 0;
15
display.SetWord(word); }
public char GetNextLetter () {
return word[typeIndex]; }
public void TypeLetter () {
typeIndex++;
display.RemoveLetter(); }
public bool WordTyped () {
bool wordTyped = (typeIndex >= word.Length); if (wordTyped)
{
display.RemoveWord(); }
16
return wordTyped; }
}
這邊的 string _word,WordDisplay _display 讓 Word 可以獲得 WordDisplay 中輸入的文字
宣告一個 typeindex 來計算輸入了多少字母,並讓其在 TypeLetter 裡面進行計算,計算後再讓它消掉字母。
wordTyped = (typeIndex >= word.Length)控制不讓輸入的字母長度 超過輸出的字母長度。
17
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class WordDisplay : MonoBehaviour {
public Text text;
public float fallSpeed = 3f;
public void SetWord (string word) {
text.text = word; }
public void RemoveLetter () {
text.text = text.text.Remove(0, 1); text.color = Color.red;
18
}
public void RemoveWord () {
Destroy(gameObject); }
private void Update() { transform.Translate(0f,-fallSpeed * Time.deltaTime,0f); } } 這段程式碼最開始宣告了 text 還有 fallSpeed 掉落速度,並令 text 在 SetWord 中讓它等於 word,以用來讓遊戲畫面中的 text 可以顯示我們要輸出的字母。
RemoveLetter 跟 RemoveWord 則是讓畫面中的字母消去,Remove(0, 1)是讓消去從第 0 個開始,一次消一個字,而讓字母變成紅色,
19
是為了在用單字進行遊戲的時候,可以讓目前在輸入中的單字變 成紅色。
在 Update 中則可以讓字母或跟單字的掉落速度會隨著遊戲時間 的進行而增加。
20
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WordGenerator : MonoBehaviour {
private static string[] wordList = {"A" , "a", "B", "b",
"C", "c", "D", "d", "E", "e", "F", "f", "G", "g", "H", "h", "I",
"i", "J", "j", "K", "k", "L", "l", "M", "m", "N"
,"n", "O", "o", "P", "p", "Q", "q", "R", "r", "S", "s", "T",
"t" , "U", "u", "V", "v", "W", "w", "X", "x", "Y", "y", "Z",
"z"};
public static string GetRandomWord () {
int randomIndex = Random.Range(0, wordList.Length); string randomWord = wordList[randomIndex];
return randomWord; }
21
這邊宣告出需要用到的英文字母,將它們放入字串裡面,以便後面讓 它們進行隨機輸出,並在下方設定隨機輸出的範圍,將範圍控制在字 串的長度內,使其不超過字串中宣告數量的總數,這樣就可以在遊戲 畫面中看到這些放在字串中的英文字母了。
22
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WordGenerator : MonoBehaviour {
private static string[] wordList =
{"Advance","Best","Cannon","Demand","Extra","Fleet","Gro und","Hospital"
,"Inn","Jungle","Knowledge","Launch","Manager","Notice",
"Other","Plan","Quiet","Route","Speech","Train","Under",
"Volunteer","Worth","Young","Zone","Almost","Blight","Ce mter","Distance","Excite","Fox","Ghost","Helix","Intent"
,"July","Knock","Limit","Mountain","North","Ocean","Powd er","Quest","Reset","Smell","Tent"};
public static string GetRandomWord () {
23
string randomWord = wordList[randomIndex];
return randomWord; } } 而將字串中的字母替換成單字的話,原先遊戲畫面中的字母就會變成 單字,就可以用這些單字來進行遊戲了。 上圖就是將字母換成單字來進行遊戲,而正在輸入的單字會變成紅色 的,像是上面畫面中的 Ground。
24
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WordInput : MonoBehaviour {
public WordManager wordManager;
void Update () {
foreach (char letter in Input.inputString) { wordManager.TypeLetter(letter); } } } 這邊的程式碼用到 WordManager 那邊 TypeLetter 的那段,讓遊戲可 以利用 Input.inputString 收到打字輸出的字母。
25
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WordManager : MonoBehaviour {
public List<Word> words;
public WordSpawner wordSpawner; private bool hasActiveWord; private Word activeWord; public GameObject Title;
public GameObject PlayButton; public bool IsPlaying = false;
void Start() {
Title.SetActive(true); }
26 { IsPlaying = true; Title.SetActive(false); PlayButton.SetActive(false); }
public void AddWord () {
if (IsPlaying == true) {
Word word =new
Word(WordGenerator.GetRandomWord(),wordSpawner.SpawnWord(); Debug.Log(word.word);
words.Add(word); }
}
public void TypeLetter (char letter) {
27 { if (activeWord.GetNextLetter() == letter) { activeWord.TypeLetter(); } } else {
foreach (Word word in words) { if (word.GetNextLetter() == letter) { activeWord = word; hasActiveWord = true; word.TypeLetter(); break; } } }
28
if (hasActiveWord && activeWord.WordTyped()) { hasActiveWord = false; words.Remove(activeWord); } } } Title.SetActive(true);這裡是讓遊戲一開始的標題是顯示著的,而 在按下PlayButton後會變為false讓遊戲標題和開始的按鈕一起消失, 而IsPlaying會變成true,並讓遊戲開始。
這邊的 AddWord 中,是從 WordGenerator 的 GetRandomWord 那段來取 得會隨機輸出的字母跟單字,再利用 WordSpawner 來讓遊戲畫面中出 現這些隨機的字母跟單字。 TypeLetter 這串用來確認輸入的字母與輸出的字母相符合,並且用 一段程式碼來除錯,確認隨機輸出的英文字母有沒有問題像是 Best 這個單字輸入到 e 的時候,不會讓它和其他開頭有 e 的單字衝突,而 是會讓你把 Best 這個單字打完才讓你可以輸入其他單字時會有效 果。
29
if (word.GetNextLetter() == letter)這段程式碼的底下則有用到 Word程式中的public void TypeLetter ()
30
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WordSpawner : MonoBehaviour {
public GameObject wordPrefab; public Transform wordCanvas;
public WordDisplay SpawnWord () {
Vector3 randomPosition = new
Vector3(Random.Range(-2.5f, 2.5f), 7f); GameObject wordObj = Instantiate(wordPrefab,randomPosition,Quaternion.identity,w ordCanvas); WordDisplay wordDisplay = wordObj.GetComponent<WordDisplay>();
31 return wordDisplay; } } 前面兩個宣告是用來控制遊戲畫面的 GameObject 跟 wordCanvas wordPrefab 是用來代表字數的。
Vector3 randomPosition = new Vector3(Random.Range(-2.5f, 2.5f), 7f); Vector3 是代表具有三個單精確度浮點值的向量,這行 程式碼是為了讓單字跟字母生成的位置為隨機亂數並將數值控制在 畫面中,所限制的範圍則是為了避免其生成位置在畫面外。 Instantiate 後面放的則是要生成的物件、物件位置、物件旋轉值這 些。 Quaternion.identity 是要讓 rotation 為(0,0,0),也就是毫無旋轉, 回歸原始旋轉值。
WordDisplay wordDisplay= wordObj.GetComponent<WordDisplay>(); 則是:物件名稱.GetComponent<元件名稱>().參數名稱;
32
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WordTimer : MonoBehaviour {
public WordManager wordManager;
public float wordDelay = 1.5f; private float nextWordTime = 0f;
private void Update() {
if (Time.time >= nextWordTime) {
wordManager.AddWord();
nextWordTime = Time.time + wordDelay; wordDelay *= .99f;
33 } } 這段程式碼一開始宣告了字母跟單字的產生延遲時間,用來控制三個 字母跟單字彼此之間生成的時間間隔,以避免同時輸出,wordDelay *= .99f;則會讓延遲的間隔漸漸縮短。
34
35
第四章 成果與未來展望
4.1 遊戲畫面展示
36
這是剛開始測試只有大小寫字母的版本,會從畫面的上方不停地掉落 英文字母下來,而掉落的速度會漸漸增加以提升難度。
而上面這個則是將原先掉落的字母改為單字的版本,可以看到當中那 個輸入到一半的單字是呈現紅色的。
37
4.2 未來展望
Unity 是一個用法相當靈活,並且可以用來開發各式各樣類型的遊戲 引擎,雖然我對遊戲開發並不是非常擅長,但希望之後如果能對 Unity 可以更加深入熟悉並且了解過後,將來有機會說不定就可以製作出更 加優秀的遊戲,讓自己有更大的進步。38
第五章 結論
在這個會需要頻繁使用到電腦的時代,並不是每個人都有機會能去學 習到或者是去接觸到英打,但是大家都可能會碰到需要使用英打的時 候,如果可以用簡單、輕鬆的方式就能學習英打,想來既不會有負擔 也可以讓自己多學會一樣技能吧,因此本專題利用 Unity 的遊戲功能, 設計出ㄧ款簡單且容易操作的打字遊戲,使得無聊的打字練習變成有 趣的遊戲進行英文打字訓練,提升訓練的效果。39
參考文獻
[1] 讀樂島 Unity 教學 [2]民族語第 20 版
[3]game dev tutorials brackeys and free assets [4]鍵盤配置-維基百科