Azure 「機器學習」: 免費試用及收費機制簡介 (pricing)

[本篇完全不含技術內容,請慎入]

「機器學習」日漸火紅的因素之一,即是如 Azure 等公有雲的普及,讓電腦運算及儲存成本大幅下降。

那麼,現在要完成一個完整的「機器學習」實驗需要多少錢呢? 是一台 Mac Pro、一杯星巴克、一趟捷運、還是 15 分鐘的 UBike?

免費層

我們以 Azure 「機器學習」初體驗 文中的實驗為例,在其中我們作了以下這些事:

  • 上傳了一個有 1 萬筆資料的檔案、

  • 在 Azure ML Studio 中拖拉元件以決定資料流向、

  • 測試了第一種演算法 (按下“RUN”)、

  • 再加入第二種演算法作比較 (按下“RUN”)、

  • 檢查了兩種演算法的成效、

  • 最後再按“RUN”,發佈為 Web Service 並測試。

以上所有步驟中,僅在你按下 “RUN” image 之後亦即將實驗丟到雲端去作計算的期間,才計入「實驗小時」之中 (實際上我按了約 10 次 “RUN”…),每「實驗小時」收費台幣 NT$11.8 元:

image

其他諸如上傳至多 10GB 的資料、在 ML Studio 中作預測及測試、發佈 Web Service 服務等,則都是免費。

所以,到底我這個實驗花了多少錢呢? 我們先進入 Azure 管理介面看看使用報表:

image

可看到我總共使用了 0.04 小時 (約 1 分鐘) 的「實驗小時」,總計美金 $0.01 元 (約台幣 0.3 元…XD)。

不過請記得,Azure 有 NT$6,300 的免費試用額度! 也就是(這個定價是定假的微軟收不到錢的)完成上述實驗其實是免費的! 無需信用卡即可申請:

image

而且,若您是

都能各自享有更多,且更久的免費額度 (詳文後附註)。

標準層

至此,您定義了問題、設計了實驗模型、完成並調整了模型測試,也發佈為 Web Service,準備讓其他應用程式來使用 (以上皆是免費層)。

接下來,這個完成並發佈後的 Web Service,被使用的收費方式又要怎麼算呢?

image

也就是依每 1,000 次預測約台幣 5 塊多來計費,而當正在進行預測時,同時依計算時數來計費,每小時約 23 塊台幣。若少於 1,000 次的預測數量和不足的計算時數,則按比例計費。

目前 Azure ML (Machine Learning) 服務是屬於公開預覽階段,預計正式上線之後的價格應該會提高~ Smile,詳細的定價及 FAQ (中文) 請見: 機器學習預覽定價

註:

1. 既有的 MSDN 訂戶每月免費額度可達約 NT$4,700 元。

2. 新創公司可免費申請 BizSpark 計畫,取得三年的每月免費額度 NT$4,700 元。需滿足以下條件:

  • 公司成立小於5年
  • 年收入小於一百萬美金
  • 以開發軟體產品或服務為公司的主要營業項目

3. 學校老師要開課: The Microsoft Educator Grant Program provides access to Azure for use in the classroom by university students and their professor.

Faculty will be receive a 12 month,
$250/month account
Students will receive a 6 month,
$100/month account

ELIGIBILITY REQUIREMENTS:

  • Requester must be a faculty member of an accredited university
  • Passes must be used for a specific class
    1. Multiple classes should have multiple requests
    2. Multiple sections of same class may use one request
  • Passes must be used by students
  • Faculty must provide all information requested
  • If you are unable to provide any of the requests, please attach a document explaining reason for omission, and another method to verify,

image

 

Azure 「機器學習」:我該用哪種演算法 (algorithms)?

在「Azure 「機器學習」初體驗」一文中,我們了解到如何透過 Azure ML 工具,很快的完成一個實驗 (Experiment)。基本上是遵循以下流程:

image

上圖的紅框 (apply Algorithms) 則是本文所要介紹的重點。也就是,我該在實驗中選擇哪一種演算法,來解決問題呢?

Azure ML 將內建的演算法分為三種類型:Classification (分類), Regression (迴歸分析) 以及 Clustering (分群):

image

1. Classification (分類): 如字義所見,即是透過機器學習,預測結果是屬於哪一種類別的方法。最常見的情境就是二分法了,亦即可以回答 True/False 或 Positive/Negative 的問題,比如:

  • 現有的中x電信客戶,會不會轉去遠x電信呢?

  • 客戶有沒有潛在升級或加購產品的商機呢?

以下是 Azure ML 所內建提供的 Classification 演算法 (竟然有類神經網路啊!! 回想到以前在交大修這門課時的熬夜歲月 ><…):

幾種不同「二分法 (Two-Class)」 Classification 演算法的示意圖:

f:id:TJO:20140106225421p:plain

(圖片來源: http://tjo-en.hatenablog.com/entry/2014/01/06/234155)

2. Regression (迴歸分析): 與前者 Classification 方法的不同之處,在於 Regression 演算法通常是預測出一個「數值」。比如:明天的台北股市收盤價是多少? 如何根據所在城市、坪數、學區等來預測房價? 都是適合使用 Regression 演算法的問題。

Azure ML 提供的 Regression 演算法包括:

image

例如我想以汽車馬力 (horsepower) 來預測耗油量 (miles per gallon),以下即是透過 Linear Regression 演算法的預測示意圖:

image

(圖片來源: “Predictive Analytics with Microsoft Azure Machine Learning: Build and Deploy Actionable Solutions in Minutes”)

3. Clustering (分群): 通常是用來處理「沒有正確答案」的問題,這種問題該怎麼辦呢? Clustering 能將有相同特徵者叢集在一塊。比如:Facebook 辨別使用者屬於哪些不同的群組 (運動愛好者、通勤族、蘿莉控…等),以滿足廣告投放商的需求。

以下是原始資料,及以 K-means Clustering 分群之後的示意圖:

_images/kmeans_2d.png

(圖片來源: http://pypr.sourceforge.net/kmeans.html)

小結:

所以回到最初的問題,當我們在設計 Machine Learning 實驗時,要如何決定使用哪種演算法呢?

  • 如果您的問題能夠以 Yes/No 來回答 => Classification (分類)

  • 如果您期望的解答是一個數值的話 => Regression (迴歸分析)

  • 如果您想將具相同特性的資料群集分類 => Clustering (分群)

但請注意,以上僅是大致的判斷法則,仍請各位能徵詢資料科學家的專業意見,選擇最合適的演算法。

另外,有注意到文章標題中的 algorithms 用了複數嗎? 是的,在實際的應用模型中,多種演算法被合併使用是很常見的 (如: Amazon 的情緒分析模型)。

練習題:

最後各位要不要猜猜看,以下這 3 種預測或應用,主要是用了什麼演算法呢?

1. 如左圖,照張狗的照片即可辨別出,這隻狗是屬於哪個品種。 (羅得西亞背脊犬– 影片連結: https://www.youtube.com/watch?v=zOPIvC0MlA4#t=45)

imageimage

2. 2014 年的第 86 屆奧斯卡金像獎共 24 獎項中,在頒獎典禮前針對入圍者給出一個得獎的機率,最後成功預測了 21 個!

3. 蘇格蘭是否要脫離英國的獨立公投,是 2014 年屬一屬二的國際新聞,在投票前預測結果

註:本文介紹的演算法分類中,前兩類 (Classification & Regression) 都是屬於「監督式學習」(Supervised Learning);Clustering 則是屬於「非監督式學習」(Unsupervised Learning) 的範疇。

再註:Azure ML 基本上是根據學習的方法 (如監督式學習/非監督式學習),以及可被應用的方式來作分類。故各位可以注意到,如決策樹 (Decision Tree) 或類神經網路 (Neural Network) 等,可分別被應用到 Classification 或是 Regression 的類別中,以解決不同類型的問題。

延伸閱讀:

1. Azure 「機器學習」FAQ,以及實際應用模型

2. Microsoft Azure 機器學習官方學習網站 (含教學影片及文件):

http://azure.microsoft.com/zh-tw/documentation/services/machine-learning/

3. TechDays Taiwan 2014 「微軟新世代雲端大數據戰略剖析與 Machine Learning 實例分享」 (中文)

https://channel9.msdn.com/Events/TechDays/TechDays-Taiwan-2014/DCIM310

4. 台灣大學資訊工程系林軒田老師 Coursera 線上課程 (中文)https://www.coursera.org/course/ntumlone

Azure 「機器學習」FAQ,以及實際應用模型

到底什麼是機器學習 (Machine Learning)?

機器學習並非新的觀念或技術,多年前電腦科學家們即已定義了何謂 Machine Learning:

“A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E”

– Tom M. Mitchell

“The goal of machine learning is to program computers to use example data or past experience to solve a given problem.”

– Introduction to Machine Learning, 2nd Edition, MIT Press

呃…可以用白話的中文再講一次嗎?

「機器學習,可藉由電腦系統分析歷史資料,來預測未來趨勢和行為。」

所以重點是…?

重點即在於「預測」,若能預期事情將如何發展,企業或個人即能早期投資以開創新商機、或是迴避重大風險的發生。

分析資料的方法有很多啊,Machine Learning 與他們有什麼不同?

我們可以在以下的 Analytics Spectrum 光譜中,了解 Machine Learning 的定位:

image

(圖片來源: “Predictive Analytics with Microsoft Azure Machine Learning: Build and Deploy Actionable Solutions in Minutes”)

由圖中可以看到 Gartner 將資料分析分為四種類別,愈往右邊,複雜程度就愈高:

– Descriptive (描述性的):可以回答 “What happened?” 的問題,以增加對資料的了解程度。常用的分析方式包含 Data Clustering (資料分群) 等。

– Diagnostic (診斷性的):可以回答 “Why did it happen?” 的問題,通常用來找出事情發生或出錯的原因。常用的分析方式則包含 Business Intelligence (商業智慧) 等。

– Predictive (預測性的):可以回答 “What will happen?” 的問題,也就是預測未來可能發生什麼事。Machine Learning (包含迴歸分析及類神經網路) 即是其中重要的分析方式。

– Prescriptive (規範性的):可以回答 “What should I do?” 的問題,也就是不但要預測未來,還要知道若作出某決策後的結果。著名的蒙地卡羅模擬法以及 Machine Learning 便是常見的方式。

為何「機器學習」最近愈來愈紅?

早期要實作「機器學習」進行實務應用是相當昂貴的。不但需要高階的硬體設備及複雜的軟體環境,同時還需要深諳統計學、人工智慧等的資料科學家團隊,更遑論隨之而來的管理及作業成本。

但隨著公有雲服務 (如 Azure) 讓計算機運算以及儲存成本大幅降低、科學家們持續發展出強固的各種演算法、再加上如 Azure ML 等易用工具的產生,將使用成本、學習成本及管理成本一併大幅下降。即是讓傳統上 resources boundary 的 Machine Learning 應用日漸火紅的主要原因。

(註:為何 Azure ML 的出現至關重要? “Why Microsoft’s Azure Machine Learning is such a big deal?”)

image

image

(圖片來源: “Predictive Analytics with Microsoft Azure Machine Learning: Build and Deploy Actionable Solutions in Minutes”)

別管紅不紅了,我要如何判斷哪些問題,是適合讓 Machine Learning 解決的?

不僅於「預測」,Machine Learning 技巧能被使用在許多其他問題。在此引用台灣大學資訊工程系林軒田老師的 Coursera 「機器學習基石 (Machine Learning Foundations)」教材作說明:

image

簡單來說,若有些問題,是需要我們設計一個非常複雜的系統來解決的話,那麼 Machine Learning 即能提供另一種解法,而不需實際設計出這樣一個系統。

舉例而言:

– 當人們無法定義出所有可能的規則時 (比如要在火星上探險)、

– 當沒有簡單、甚或不完全的解法方案時 (如語音/視覺識別)、

– 需要超快速的判斷時 (如極短線股票交易)、

– 或是資料量大到人為經驗亦無法負荷的程度 (如消費市場行銷策略)

以上皆是機器學習可應用在實務上的判斷準則。

微軟自己有在用 Machine Learning 嗎?

最近較著名的例子就是微軟的 Cortana 個人小幫手了,其背後即是利用大數據配合 Machine Learning,預測世界盃足球賽的各場勝負:

巴西世足 微軟Cortana 預測世足神準

Big data 告訴你2014 年世界盃冠軍是德國| TechNews 科技新報

我不是資料科學家,也能使用 Azure ML 嗎?

請參閱「Azure 「機器學習」初體驗」文中,以簡單幾個步驟即完成一個實驗,即可了解 Azure 的機器學習,可讓人們在沒有深入的資料科學背景下開始資料採礦與預測。它提供一個整合的開發環境,讓你利用拖放與簡單的資料流程圖來設定實驗。

image

你無需撰寫程式碼即可執行多項工作。

我是很有經驗的資料科學家,使用 Azure ML 的好處在哪?

若你是資料科學家,使用 Azure ML 會有更多好處。支援 R 語言,所以既有的 R 程式碼可直接拖放並執行,你也可在其中自行撰寫 R 程式碼,這兩種方式均支援超過 410 個 R 套件 (on top of R 3.1.0 as of now)。可立即混搭預先安裝妥當且最佳化過的演算法,包括超過 400 個以上的 CRAN packges, plyr and dplyr, car, datasets, HMisc, MASS, Intel Math Kernal Library,並可使用諸如 ggplot2 之 R plotting 視覺化及 rpart, nnet, survival, boot 等資料探勘工具。

image

您可測試最多十種不同的模型。同時 Azure 機器學習實驗是可以共享的,其他人可從您中斷的地方接續下去。

imageimage

Azure 機器學習也讓您可以在 Azure 儲存體中保留無數個檔案,同時能順暢地連結其他 Azure 資料相關服務,包括 HDInsight、Hadoop 巨量資料解決方案、SQL Database 和虛擬機器。

我(或我的客戶)想實作「機器學習」,有模型可供參考嗎?

茲列舉幾個實務的企業應用為例:

信用風險預測: 利用公開的德國信用資料集來訓練和比較多個 ML 演算法,以預測新申請人的信用風險評等良好或不良。

image8

CRM 客戶分析: 法國一家電信公司的一組匿名資料集,共 50,000 位客戶,以判斷客戶流失、追加銷售及購買新產品的意願。

image

網路入侵偵測: 實驗利用 1999 年知識探索與資料探勘 (KDD) 競賽的資料,偵測哪些網路活動屬於入侵或攻擊。

image

情緒分析: 利用 Amazon 上的產品評論和評分來預測純文字評論的等級。

image

延伸閱讀:

1. Microsoft Azure 機器學習官方學習網站 (含教學影片及文件):

http://azure.microsoft.com/zh-tw/documentation/services/machine-learning/

2. TechDays Taiwan 2014 「微軟新世代雲端大數據戰略剖析與 Machine Learning 實例分享」 (中文)

https://channel9.msdn.com/Events/TechDays/TechDays-Taiwan-2014/DCIM310

3. 台灣大學資訊工程系林軒田老師 Coursera 線上課程 (中文) https://www.coursera.org/course/ntumlone

Azure 「機器學習」初體驗

機器學習 (Machine Learning, (ML)) 是用來解決實務問題的。在本文中,我想嘗試解決的問題是:

「一個腳踏車行,想根據來店客人的基本資料,預測 (predict) 此客人是否會買腳踏車。」

問題定義好之後,就可以開始思考,需要取得哪些可供機器學習的資料,以作為 input 了。我在這使用一份包含了 1 萬個客人的歷史紀錄 (Bike_Buyer_Data_CSV.csv,可在此下載: http://1drv.ms/1FLTSTV)。以下列出前四筆資料:

image

你可以看到在 BikeBuyer 這個欄位,標註了其最後是否有買腳踏車,同時有這個人結婚與否、性別、薪水、教育程度、通勤距離、年紀等資料。

接下來就可以開始使用 Azure 的「機器學習」來規劃預測模型了!

Step 1. 只需要有免費的 Microsoft Account 即可登入使用,無需信用卡:

image

Step 2. 進入 Azure 的「機器學習」頁面: https://studio.azureml.net/Home,或是由你的 Azure management portal 管理畫面選擇「機器學習 (Machine Learning)」服務:

image

Step 3. 匯入資料。

Azure ML 提供了多種資料匯入的方式:

·       Read data from local file.

·       A saved dataset.

·       Azure Blob storage.

·       Read data from Hive.

·       Azure Table.

·       SQL Azure database.

·       HTTP.

在此我僅示範第一種 “Read data from local file”,在畫面左下角選擇「NEW」| 「DATASET」|「FROM LOCAL FILE」:

image

clip_image002

選取本地 CSV 檔案後,以 “Generic CSV File with a header (.csv)” 方式匯入:

image

Step 4. 設計實驗 (Experiment)。

在畫面左下方選擇「NEW」|「EXPERIMENT」,並選擇 Blank Experiment:

image

你可以為這個實驗取一個名字以備日後管理,如「Bike Demo」。然後將剛剛匯入的 “Bike_Buyer_Data_CSV.CSV” 資料,以及以下共 5 種元件,由左側以滑鼠拖拉的方式拉入中間的畫布中:

·       Split

·       Train Model

·       Two-Class Averaged Perceptron

·       Score Model

·       Evaluate Model

[小技巧] 善用左上角的 Search 功能,可直接找到元件!

image

然後大致排列這些元件如以下:

image

接下來就是連連看囉! 一樣透過滑鼠,將各元件間的小圈圈,由上向下連起來,如下圖所示,我們就完成實驗基本的資料流了:

image

各元件的功能、以及各元件的細部參數調整,在此我都不深入解釋,不過各位由字面應可大致了解其功能,其中:

a). 「Split」元件會將資料分成兩部份,左邊那塊是送去「學習」 (Train Model) 的;另外一塊則可用來驗證學習成效 (Score Model)。

b). 我們選擇先以 “Two-Class Averaged Perceptron” 作為學習的方法 (我會在 Step 7. 改變學習方法,讓大家看看不同之處)。

Step 5. 有注意到在「Train Model」元件中的警示標誌嗎? 因為我們還未告訴此實驗是要訓練來預測 (predict) 什麼:

點選「Train Model」|「Launch Column Selector」,然後在 columns names 中選擇 “BikeBuyer”: (因為我們想解決的問題,是預測客人是否會買腳踏車)

image

我們的實驗到此就設計完畢了! 是不是很簡單呢?

Step 6. 測試實驗結果。按下畫面下方的「Run」,即會將此實驗送上 Azure 作計算,你可以即時觀看計算進度,右上角也有總計的花費時間。以這個實驗為例,約 5~8 秒即可跑完:

image

跑完後來看結果吧! 點開「Evaluate Model」下面的小圈圈並選擇「Visualize」:

image

你會看到評估此實驗結果的圖表及數據,包含:

  • ROC

  • Precision/Recall

  • Lift Curve

這些數據及圖表,是用來評估你所設計的實驗模型優劣與否的依據,在此不會討論其細節。我僅以其中的 ROC 曲線為例:其基本原則是,若曲線愈往左上方移動,此模型的準確率愈高 (在此要強調,模型優劣的判定並非單一指標可決定):

image

單純由人眼來判斷當然是不準確的,故我們可以計算 ROC 曲線下方的面積,並以 AUC 來表示 (此例中 AUC = 0.677),原則即是愈大愈好:

image

Step 7. 改變實驗模型。有沒有更好的模型以作更準確的預測呢? 接下來我想要以 ”Two-Class Boosted Decision Tree” 作為另一種學習方式,並比較其成效。

首先將「Train Model」、「Score Model」及「Evaluate Model」選擇後,以Ctrl-C,Ctrl-V 複製貼上。然後再以 Search 來找到 ”Two-Class Boosted Decision Tree” 模組:

image

請大致排列如下圖。並注意,記得刪除由舊模型連至「Train Model」的黃線:

image

最後的完成圖:

image

Step 8. 比較實驗結果。選擇「Run」並等待 Azure 計算完畢後,在 ”Two-Class Boosted Decision Tree” 的「Evaluation Model」中選擇「Visualize」:

image

看到的 ROC 曲線如下:

image

有注意到與之前的學習方式 (Step 6) 的不同之處嗎? 進一步觀察其 AUC = 0.830,亦比此前的值為大:

image

Step 9. 透過 Scoring Model 檢視實驗結果。Step 6 和 8 皆是透過 Evaluation Model 計算機器學習預測理論中的各項評分,作為決策人員判斷模型合適與否的依據。其實您可以透過 Scoring Model –> Visualize 更直觀的看到預測結果。

以下即可看到每一個客人是否會買腳踏車的機率、及其最後預測值 (機率高者預測其會買腳踏車):

image

BikeByer 相對於 Scoring Labels (預測值) 的對照圖,可更直覺的了解到,這個預測模型還有很大的進步空間! Smile

image

Step 10. 發佈為 Web Service。如以下的標準 Data Science Process,最佳模型的建立,總是在反覆不斷的檢討及驗證中所得到的。

image

當驗證完畢之後,就能發佈您的學習成果,讓腳踏車行的應用程式,甚或其他的開發者作使用了。

先點選「Score Model」上方的小圈圈,並選擇 “Set as Publish Input”:

image

再點選「Score Model」下方的小圈圈,並選擇 “Set as Publish Output”:

image

重新再 Run 一次,即可 “PUBLISH WEB SERVICE”:

image

發佈成功之後,會產生 Web Service 的 URL 連結、API Key,同時還有測試頁面供你輸入及測試:

image

image

最貼心的是,還提供 C#, Python 及 R 語言的 sample code!

image

 

延伸閱讀:

1. Microsoft Azure 機器學習官方學習網站 (含教學影片及文件):

http://azure.microsoft.com/zh-tw/documentation/services/machine-learning/

2. TechDays Taiwan 2014 「微軟新世代雲端大數據戰略剖析與 Machine Learning 實例分享」 (中文)

https://channel9.msdn.com/Events/TechDays/TechDays-Taiwan-2014/DCIM310

3. 台灣大學資訊工程系林軒田老師 Coursera 線上課程 (中文) https://www.coursera.org/course/ntumlone

新一代設計 Windows App 獎學金計劃-最大獎10萬台幣!

活動期間:2014年11月~2015年5月,但若180次申請額度用完,即提早結束。

活動簡介:只要開發娛樂(Entertainment)遊戲(Games)類別的 App,並上架到 Windows Store 或 Windows Phone Store,就可以申請獎學金!

獎金規則:同一作品 (App) 上架單平台(Windows Store 或 Windows Phone Store)可得 NT$1,400,上架雙平台(Windows Store 及 Windows Phone Store)可得獎學金 NT$3000;每個帳號最多可獲 NT$18,000 獎學金 (成功上架6個 Apps)!

加值獎勵:每個月前10位申請者,將可額外獲得NT$500元 營養用餐津貼獎勵。

特優大獎:主辦單位將從繳件作品中遴選特優作品,補助開發團隊2015年新一代設計展參展金十萬元。

按此報名:https://aka.ms/UnityWindows

上架問題可到這個 Facebook 社團發問,會有專人解答! https://www.facebook.com/groups/536099893144386/?fref=ts

image

 

一年免費的 prime[31] Unity plug-ins

image

prime[31] 是很受歡迎的 Unity plug-ins 供應商,其中包含適用於 Windows Store 及 Windows Phone App 的元件。即日起至 2015 年 6 月,以下有關於 IAP (應用程式內購買)、Live Tiles (動態磚)、Ads (廣告)以及 Azure Storage 等的 plug-ins 都是免費的:

Functionality provided

Windows Store 8.0 and 8.1

 

Windows Phone 8.0 *

Handling trial and in-app purchases

Store plug-in

Store plug-in

To get Live tiles, toast notifications

Metro Essentials plug-in

Metro Essentials plug-in

To give you access to the Microsoft Ad SDK

Microsoft ads plug-in

Microsoft ads plug-in

For easy access to Azure storage

Microsoft Azure plug-in

Microsoft Azure plug-in

*Note that Windows Phone 8.1 support and corresponding free plug-ins will be coming soon.

所有最新的優惠及免費插件,可上 prime[31]的網站,只要提供您的姓名和電子郵件,prime[31] 會寄給您 license, 讓您在 Unity 的專案中使用。

安裝及其他文件請參考 Plug-in Documentation。 也可以透過 prime[31] YouTube Channel 進一步了解使用方式,若有使用上的問題請利用 prime[31] 的論壇 prime[31] support forums

來源: Free one year prime[31] Unity plug-ins

[免費研習營] 協助學生將 Unity 遊戲上架 Windows- 還有機會得到獎學金!

您在學校教授遊戲開發嗎? 您或您的學生正使用 Unity 開發遊戲嗎? 本課程將由台灣微軟與奇銳科技的專業工程師,與您分享如何上架 Unity 遊戲至 Windows 平台。

立即報名: Unity Apps 上架 Windows 實戰

現場將宣佈「開發Unity遊戲得獎學金」活動,最高獎金10萬元!讓您贏在起跑點,協助優秀 Unity 遊戲在明年新一代設計展及 4C 比賽發光!

現場會提供 hands-on 環境讓各位教師及開發者實際上機測試,並將提供 USB 隨身碟(內建教學資源包),讓您事半功倍!

【參加條件】教授遊戲開發之大專院校教育人員、以及 Unity 程式開發者。主辦單位保留參加資格審核權利。

【提供資源】

1.台灣微軟提供開課教師各 20 組免費 DreamSpark 帳號(可免費取得正版Windows Server、SQL Server、Visual Studio 以及 Windows 市集一年免費上架);一般 Unity 開發者則可取得 Windows 市集上架一年免費帳號,可供上傳 Windows Store Apps 或 Windows Phone Apps。

2.台灣微軟將準備精美小禮物以及官方授權教學資源包給與會教師及 Unity 開發者。

3.教室會提供安裝好 Unity 4.3試用版及 Windows 8.1 及 Windows Phone 8 SDK之開發環境,但仍建議團隊帶自已的筆電與開發環境,所需環境請參考 http://unity3d.com/pages/windows/porting

同時感謝愛迪斯科技將協助各校對後續 Unity 獎學金活動之技術支援,包含 Unity 基礎開發指導、Unity遊戲專案開發指導及 Unity 教學指導。

[參考文件]
1. Unity移轉必讀
2. 如何將遊戲移植到Windows 8.1及Windows Phone 8
3. Windows 8到Windows 8.1

主辦單位:奇銳科技股份有限公司台灣微軟

協辦單位:聯成電腦愛迪斯科技股份有限公司

如果有其他問題,請與執行單位聯絡 twbisv@microsoft.com

 

 

在 Azure VM 中使用 Apache Cordova 開發跨平台 App

微軟在今年 5 月正式將 Apache Cordova (PhoneGap 引擎) 包裝成為一個免費的 Visual Studio 2013「擴充套件」。順利安裝之後,就可以在開新專案時選擇 Hybrid App 的專案範本,讓您使用 HTML, CSS, JavaScript 技術來開發跨平台的 Windows、iOS 及 Android 原生 App。

image

不過…

並非大家都有額外的機器和時間來準備 Windows 8.1 + Visual Studio 2013 + Apache Cordova 的開發測試環境,這時候就需要一個預先配置好的 VM 虛擬機器了!

image

這個 VM 中包含了所有您可在本地開發環境作的事情,如:編譯/偵錯 Windows 及 Android Apps、預設的專案模板、以及 “Getting Start” 文件幫助您創建並測試你的 App。

要了解如何開始使用 VM,請參考 MSDN 的文章: 如何在 Azure 上創建一個 VM

另請注意,Azure VM 是可能有使用成本的! 但如果您是 MSDN 訂戶,可使用 Azure 的免費額度,請見 MSDN 訂戶權益頁有詳細資訊。如果您符合新創公司的資格,則可免費申請 BizSpark 方案,享受每個月約 NT$4,700 元的 Azure 免費使用額度。

延伸閱讀:

Visual Studio Tools for Apache Cordova Azure VM Available

跨行動裝置 App 開發: 使用 Visual Studio 2013 + Apache Cordova (PhoneGap)

由 Web 到 App 之路 (二): 使用 Apache Cordova (PhoneGap)

在 Windows Store App 中使用 WinSock 及 Open Source 開放源碼

自從 8 月的 Visual Studio 2013 Update 3 (下載) 開始,Windows Apps 認證工具 (Windows App Certification Kit (WACK)) 即已允許在您的 Windows Store App 中使用 WinSock APIs 。其實 WinSock 早已被允許在 Windows Phone 中使用,也就是現在 WinSock 已可被應用在 Windows 8.1、 Windows Phone 8.1 以及 Universal Apps 中。

這也表示 Windows Store App 將能開始使用許多相依於 WinSock 的 Open Source 函式庫,以下列出 3 個範例:

1. Libwebsockets 是一個輕量級的 C library,旨在使用最少的 CPU 和記憶體資源下,提供上傳或下載時的快速傳輸量 (throughput)。其 Windows Phone 的 NuGet 套件已可在此下載。MS Open Tech 即將發佈 libwebsockets 在Windows Store App 中的版本。

2. libcURL 也是一個免費的 Open Source 函式庫,可以使用各種市面上最普及的傳輸協定 (FTP, HTTP, SMTP, Gopher, etc.) 從伺服器下載檔案,甚至提供 password 認證及檔案續傳等功能。其 Windows Phone 的 NuGet 套件可在此下載。MS Open Tech 也將發佈 libwebsockets 在Windows Store App 中的版本。

3. OpenSSL 是一個實現安全通訊端層 (SSL v2/v3) 和傳輸層安全 (TLS v1) 協定很受歡迎的工具組,同時包含了許多通用的加密函式庫。OpenSSL 已同時支援 Windows Phone 和 Windows Store App 並可在此下載。當然,雖然 OpenSSL 可以讓你重新使用既有的跨平臺程式,請別忘記您可以使用 Windows 的原生安全和加密 API: Windows.Security.Cryptography*。

Source: WinSock and more Open Source for your Windows Store apps

使用 Unity 和 C# 開發您的第一個遊戲 (Part 2)

微軟資深技術傳道士 Adam Tuiliper 所寫的 Unity 系列第 2 篇文章,這次主要說明如何在 Unity 中建立 2D 遊戲。原文連結;以下則是機器翻譯的中文版,若有不流暢處請見諒。

第 1 篇文章請見: 使用 Unity 和 C# 開發您的第一款遊戲(MSDN文章)

使用 Unity 和 C# 開發您的第一個遊戲 (Part 2)

下載程式碼範例

歡迎回到關於 Unity 的系列教程。在第一篇文章中,我介紹了一些有關 Unity 的基礎知識和體系結構。在這篇文章中,我將在 Unity 中探討 2D,其建立於在 4.3 版本中添加的 2D 支持 Unity 的基礎之上。您可以在 Unity 4.3 之前的 Unity 版本中製作 2D,但是如果沒有協力廠商工具包,那麼這個過程是相當痛苦的。我要做的就是將圖片拖放到我的場景,並通過拖/放介面讓它按照我希望的形式出現和發揮作用。這是 Unity 4.3 帶來的一些功能,在本文中,我將在開發基本的 2D 平臺遊戲的同時,介紹它的更多功能和一些必要的 Unity 概念。

Unity 中的 2D

為了在 Unity 中獲得 2D 支持,當在創建一個新的專案時,請在新建項目對話方塊的下拉清單中選擇 2D。當您選擇了 2D 之後,預設情況下專案會被設置為 2D(在“編輯|專案設置|編輯器”下查看),任何導入到專案中的圖像都顯示為 sprite 類型,而不僅僅是紋理類型。(我將在下一節對其進行介紹。)此外,場景視圖默認設置為 2D 模式。這只是提供了一個説明按鈕,説明您在場景開發過程中固定兩軸,但對實際遊戲沒有影響。您可以在任何時候按一下它,跳進跳出 2D 工作模式。Unity 中的 2D 遊戲也還是一個 3D 環境;您的工作只受限於 X 軸和 Y 軸。圖 1圖 2 顯示了選中和未選中的 2D 模式。我讓照相機突出顯示,以便您可以看到照相機可視區域的輪廓,但要注意,它向外的視角空間為矩形形狀。

2D Mode Selected—Camera Has Focus
圖 1 選擇 2D 模式——照相機保持焦點

2D Mode Not Selected—Camera Has Focus
圖 2 未選擇 2D 模式——照相機保持焦點

突出顯示的照相機被設置為正交照相機,即 Unity 中的兩種相機模式之一。這種照相機的類型,通常在 2D 中使用,不能在所見範圍之內進一步縮放物件;即從照相機的位置看過去,沒有深度。另一個照相機類型是透視圖,呈現的是眼睛看到的有深度的物件。出於各種原因而使用其中一種照相機類型而不用另一種,但在一般情況下,如果需要視覺深度,可以選擇透視相機,除非您想相應地放大您的對象。您只需選擇照相機和改變投影類型就可以輕鬆更改模式。我建議您嘗試上述操作,在您將物體向著 Z 軸方向移動時看看您的照相機的可視區域是如何變化的。您可以在任何時候更改預設的行為模式,這只會對未來將圖像導入到您的項目產生影響。

如果在 Unity 中存在現有項目或者您不清楚是否已經在項目對話方塊中選擇了 2D,則可以前往“編輯|項目設置|編輯器”將您的專案設置為默認 2D;否則,就必須對每個導入的 2D 圖像手動設置紋理類型,如果您的作品很多,這會是一項乏味的工作。

關於 Sprite 的全部內容

當將 3D 選作預設的行為模式時,圖像被識別為“紋理”類型。您不能將紋理拖到場景中;紋理必須應用到物件中。對於創建 2D 遊戲來說,這種方法不是很有趣。我只想拖放圖像,並讓它出現在我的場景中。如果您的預設行為模式是 2D,事情就變得容易多了。當我將圖像拖放到 Unity 中後,它被識別為 Sprite 類型。

這使您可以輕鬆將您的作品拖放到 Unity 中,然後從 Unity 將其拖放到您的場景中,從而構建遊戲。如果您的作品看起來比較小,而且不需要處處重新調整,那麼您只需要將圖元縮小到單位值大小。這種操作方法普遍存在於 Unity 的 2D 和 3D 模式中,通常比通過 transform 的縮放屬性來縮放物件具有更佳的性能。

當釋放物件時,您可能會注意到物件們一個接一個地完成。Unity 在場景後面創建一系列頂點,即便 2D 圖像也是如此,所以繪製順序可以根據圖像的各個部分而有所不同。通常最好的做法是明確指定圖像的 Z 軸的位置。為此,您可以通過三種方法來實現,這些方法按照 Unity 繪製 sprite 的順序列出:

1. 在 Sprite 渲染器中設置“層排序”屬性。

2. 在 Sprite 渲染器上設置“層順序”屬性。

3. 設置 Transform 的 Z 軸位置值。

層排序的優先順序高於一切,其次是層順序,而這反過來又優先於 transform 的 Z 值。

層排序按照定義順序繪製。當您添加其他層時(在“編輯|項目設置|標籤和圖層”中),Unity 首先繪製出它在默認層上找到的所有物件(然後是層順序,再然後是 Transform 的 Z 軸位置值),然後是背景,再然後是平臺,等等。所以,您可以通過將圖像設置到平臺層,並指定您想在第 1 個層順序中放在頂部的圖像,從而輕鬆解決重疊的這些圖像,因此可以在 0 層順序後繼續進行繪製。

常用功能

圖 3 所示的關卡包含了一些通過拖放和設置層排序佈置的平臺和背景圖像。

A Game Level
圖 3 遊戲關卡

就現在而言,它看起來像一個遊戲,卻沒法玩。至少,它需要一些功能才能成為一款功能性的遊戲。我將在下面的章節中討論這些內容。

鍵盤、滑鼠和觸摸移動在 Unity 中,鍵盤、滑鼠、加速計和觸摸都是通過輸入系統來讀取的。您可以在主播放機上使用類似于下方列出的腳本,輕鬆讀取輸入移動和滑鼠點擊或觸摸(我將很快根據此腳本構建。):

void Update()

{

  // Returns -1 to 1

  var horizontal = Input.GetAxis("Horizontal");

  // Returns true or false. A left-click

  // or a touch event on mobile triggers this.

  var firing = Input.GetButtonDown("Fire1");

}

如果您選中“編輯|項目設置|輸入”,就可以看到默認的輸入(Unity 在每個新項目中為您提供一組),或設定新的輸入。圖 4 顯示了讀取水準運動的默認設置。“左”和“右”設置表示左右方向鍵,但還要注意的是“a”和“d”用於水準運動。這些都可以映射到搖桿輸入。您可以添加新的輸入或更改默認輸入。敏感欄位控制 Unity 從 0 移到 1 或 -1 的速度。當按下右方向鍵時,第一幀可能產生一個 .01 的數值,然後很快達到 1,雖然可以調整速度,為您的角色指定暫態水準速度或運動速度。稍後不久,我會向您展示將這些值應用到遊戲物件的程式碼。不存在讀取這些值所需的實際的 GameObject 組件;您只需在您的程式碼中使用輸入關鍵字來訪問可讀取輸入的功能。作為一般規則,應以 Update 函數讀取輸入,而不是 FixedUpdate,以避免丟失輸入事件。

Horizontal Input Defaults
圖 4 水準輸入預設值

直線運動物體需要能夠移動。如果這是一個自上而下的遊戲,重力通常並不重要。如果它是一個平臺遊戲,重力是極為重要的。無論是哪種情況,物件的碰撞檢測是至關重要的。以下是一些基本規則。添加到遊戲物件的 Rigidbody2D 或 RigidBody(用於 3D)元件會自動提供該元件的品質,並使其瞭解重力和受力。根據維琪百科,“在物理學上,剛體是一個忽略了變形的理想化實體。換句話說,剛體上任意給定兩點間的距離在時間上保持不變,與外界施加的外力無關。”同樣的原則也適用於遊戲。添加一個剛體使您可以執行類似圖 5 中所示的調用。

圖 5 添加運動和速度

void FixedUpdate()

{

  // -1 to 1 value for horizontal movement

  float moveHorizontal = Input.GetAxis("Horizontal");

  // A Vector gives you simply a value x,y,z, ex  1,0,0 for

  // max right input, 0,1,0 for max up.

  // Keep the current Y value, which increases

// for each interval because of gravity.

  var movement = new Vector3(moveHorizontal *

_moveSpeed, rigidbody.velocity.y, 0);

  rigidbody.velocity = movement;

  if (Input.GetButtonDown("Fire1"))

  {

    rigidbody.AddForce(0, _jumpForce, 0);

  }

}

作為一般規則,直線運動應通過 Update 發生,加速運動應通過 FixedUpdate 發生。如果您是一個初學者,似乎在何時使用哪一個的問題上感到困惑,事實上,直線運動適用於各種函數。但您要按照這個規則才能獲得更好的視覺效果。

碰撞檢測一個物件可從 RigidBody 元件中獲得其品質,但您還需要告訴 Unity 如何處理與此物件的碰撞。雖然縮放對物件本身物理特性會產生影響,但您的作品或模型的大小和形狀在這裡並不重要。重要的是發生碰撞的元件的大小和形狀,簡單來說是一個您想讓 Unity 檢測另一個物件接觸的在本物件的附近、表面或內部的定義區域。這是實現場景的方法,比如當您進入有僵屍閒逛的區域,或進入從山一側彈跳下來巨石的區域就會執行檢測。

有形狀各異的碰撞體。2D 碰撞體可以是圓形體、邊緣體、多邊體或盒體。盒狀碰撞體適用於形狀像正方形或長方形的物件,或者您只是想檢測發生在正方形區域中的碰撞。想像您能站在上面的平臺 – 這是盒狀碰撞體的一個很好的範例。將這個元件添加到您的遊戲物件,您就能使用物理碰撞了。在圖 6 中,我將一個圓形碰撞體和一個剛體添加到角色中,將一個盒狀碰撞體添加到平臺中。當我在編輯器中按一下播放時,玩家立刻下降到平臺上,然後停止。無需程式碼。

Adding Colliders
圖 6 添加碰撞體

您可以通過更改碰撞體元件的屬性來移動和調整該碰撞體覆蓋的區域大小。預設情況下,含碰撞體的物件不會彼此穿過(觸發器例外,我會在下節中進行介紹)。碰撞需要兩個遊戲物件上都有碰撞體元件,至少其中的一個物件必須有一個 RigidBody 元件,除非它是一個觸發器。

如果我想在第一次發生此碰撞實例時讓 Unity 調用我的程式碼,我只需通過一個腳本元件將以下程式碼添加到遊戲物件(在之前的文章中討論過):

void OnCollisionEnter2D(Collision2D collision)

{

  // If you want to check who you collided with,

  // you should typically use tags, not names.

  if (collision.gameObject.tag == "Platform")

  {

    // Play footsteps or a landing sound.

  }

}

觸發器有時您想要檢測碰撞,但同時不想捲入任何物理特性。想像在遊戲中類似撿寶的場景。您不想在玩家接近時,在其正前方將硬幣踢出去;您想讓硬幣被拾起,同時不影響玩家移動。在這種情況下,您使用一個稱為觸發器的碰撞體,這無非是勾選了 IsTrigger 核取方塊的碰撞體。這將關閉物理特性,當物件 A(包含碰撞體)進入物件 B(也包含碰撞體)的區域內時,Unity 只會調用您的程式碼。在這種情況下,程式碼方法是 OnTriggerEnter2D 而不是 OnCollisionEnter2D:

void OnTriggerEnter2D(Collider2D collider)

{

  // If the player hits the trigger.

  if (collider.gameObject.tag == "Player")

  {

    // More on game controller shortly.

    GameController.Score++;

    // You don’t do: Destroy(this); because ‘this’

    // is a script component on a game object so you use

    // this.gameObject or just gameObject to destroy the object.

    Destroy(gameObject);

  }

}

要記住的一點是,對於觸發器,沒有物理作用,它基本上只是一個通知。觸發器也不需要遊戲物件具備 Rigidbody 元件,或者說,因為不需要進行力計算。

一件經常難倒新開發人員的事就是當您將碰撞體添加到剛體上時,這些剛體的行為。如果我的物件具有一個圓形碰撞體,我將此物件放在一個斜面上(注意其碰撞體的形狀),讓它開始滾動,如圖 7 所示。您在物質世界中看到的此模型是否是被設置在斜面上的一個滾輪。我之所以不將盒狀碰撞體用於我的角色是因為當在其他碰撞體的邊緣移動時,由於盒子的邊有可能被拖住,由此會產生不很流暢的體驗。而圓形碰撞體可以使這更順暢。然而,對於不接受平穩旋轉的情況,您可以使用 Rigidbody 元件的固定角度設置。

Using a Circle Collider for Smooth Movement
圖 7 使用圓形碰撞體做平滑移動

音訊為了聽到聲音,你需要一個音訊偵聽器元件,預設情況下,已經存在於任何照相機上。若要播放聲音,只要將音訊源元件添加到遊戲物件,並設置音訊剪輯即可。Unity 支援大多數主流音訊格式,且可以將較長的剪輯編碼成 MP3。如果您有許多音訊源,它們的剪輯已在 Unity 編輯器中進行了指定,請記住在運行時它們都會被載入。另一方面,您也可以通過位於特定資源檔案夾中的程式碼載入音訊,當完成時,再將它銷毀。

當我將音訊導入到我的專案中時,我將它保存為 WAV 檔,它是未壓縮的音訊。Unity 將重新編碼更長的音訊來優化它,所以始終使用您最優質的音訊。這對短文件尤其如此,比如,Unity 不對聲音效果進行編碼。我還將音訊源元件添加到我的主照相機中,雖然我可能已經把它添加到其他的遊戲物件中。然後,我將 Adventure 音訊剪輯指定到這個音訊源元件中,並勾選了迴圈,因此它可以不斷地迴圈。通過三個簡單的步驟,現在我在玩遊戲時可以播放背景音樂。

GUI/平視顯示在一個遊戲中,GUI 系統由好多東西構成。它可能涉及到功能表系統、運行狀況及得分顯示、武器庫存,等等。通常情況下,GUI 系統是無論照相機在看哪兒(雖然這不是必要的),您都能在螢幕上看到的原地不動的內容。Unity 的 GUI 功能目前正在全面修訂,新的 uGUI 系統將出現在 Unity 4.6 中。因為還沒有發佈,我在這裡將簡單地討論一些基本功能,若要瞭解有關新的 GUI 系統的詳細資訊,可以查閱我的 Channel9 部落格channel9.msdn.com/Blogs/AdamTuliper

為了將簡單的顯示文本添加到螢幕(例如,得分:0),請按一下“遊戲物件|創建其他| GUI文本”。此選項不再出現在 Unity 4.6 中,所以您要觀看我提到過的有關 uGUI 的視頻。在 4.6 版中,您仍然可以通過按一下“添加元件”按鈕將 GUI 文本元件添加到遊戲物件上;它只是從編輯器功能表中消失了而已。通過現有的(舊版)Unity GUI 系統,您無法在場景視圖中看到您的 GUI 物件,只有在遊戲視圖中才能看到,這使得佈局創建有些奇怪。如果您喜歡,您可以用純程式碼來設置您的 GUI,而且 GUILayout 類可以讓您自動跟蹤小部件。但我更喜歡使用 GUI 系統,因為我可以在其中執行按一下和拖動操作,工作起來更輕鬆,這就是我覺得 uGUI 更為優越的原因。(在 uGUI 之前,這一領域中的主導產品是一個叫 NGUI 的相當可靠的協力廠商產品,它實際上被用作 uGUI 的初始程式碼庫。)

更新該顯示文本的最簡單方法就是在編輯器中搜索或指定對 GUI 文本遊戲物件的引用,並把它當作 .NET 中的標籤並更新其文字屬性。這使得更新螢幕 GUI 文本變得非常簡單:

void UpdateScore()

{

  var score = GameObject.Find("Score").GetComponent<GUIText>();

  score.text = "Score: 0";

}

這是一個稍微縮短了的範例。對於性能,在 Start 方法中,我其實是要緩存對 GUIText 元件的引用,以便在調用每個方法時都不對其進行查詢。

得分跟蹤跟蹤得分很容易。您只需要有一個類,能夠顯示公共方法或設定分數的屬性。在遊戲中將充當遊戲組織者的對象稱為“遊戲控制器”很常見。遊戲控制器可以負責觸發遊戲保存、載入、記分等。在這個範例中,我可以有一個類,能夠顯示分數變數,如圖 8 所示。我將這個元件分配給一個空的遊戲物件,以便在場景載入時使用。當更新得分時,GUI 被依次更新。在 Unity 編輯器中,對 _scoreText 變數進行指定。只需將任何 GUIText 遊戲物件拖放到這個顯示欄位上,或使用搜索小部件,其中該腳本元件在編輯器中顯示分數文本變數。

圖 8 創建 _scoreText 變數

public class GameController : MonoBehaviour

{

  private int _score;

  // Drag a GuiText game object in the editor onto

  // this exposed field in the Editor or search for it upon startup

  // as done in Figure 12.

  [SerializeField]

  private GUIText _scoreText;

  void Start()

  {

    if (_scoreText == null)

    {

      Debug.LogError("Missing the GuiText reference. ");

    }

  }

  public int Score

  {

    get { return _score; }

    set

    {

      _score = value;

        // Update the score on the screen

      _scoreText.text = string.Format("Score: {0}", _score);

    }

  }

}

然後,我可以按如下方法簡單地更新(在本例中)蘑菇的觸發器程式碼,以在每次拾取時增加得分:

void OnTriggerEnter2D(Collider2D collider)

{

  if (collider.gameObject.tag == "Player")

  {

    GameController.Score++;

    Destroy(gameObject);

  }

}

動畫正如 XAML 一樣,通過在關鍵幀中執行各種操作來創建動畫。我可以輕鬆地用整篇文章來介紹 Unity 中的動畫,但由於空間有限,我將在此簡要說明。Unity 有兩種動畫系統,舊系統和最新的 Mecanim 系統。舊系統使用動畫 (.ani) 檔,而 Mecanim 使用狀態來控制動畫檔的播放。

在預設情況下,2D 動畫使用 Mecanim。製作動畫的最簡單的方法是將圖片拖放到您的場景中,讓 Unity 為您創建動畫。開始時,我將一些單個 sprite 拖動到 Unity 中,接下來 Unity 為我創建一些東西。首先,它使用用來繪製 sprite 的 sprite 渲染器元件來創建遊戲物件。然後,它會創建一個動畫檔。您可以通過“視窗|動畫”和突出顯示自己的遊戲物件來進行查看。動畫器會顯示分配的動畫檔,就我的情況而言,包含六個關鍵幀,因為我將六幅圖像放進了我的場景中。每個關鍵幀控制元件上一個或多個參數;此處,它更改了 Sprite 渲染器元件的 Sprite 屬性。動畫只不過是以某個使眼睛能夠感知運動的速度顯示的一些單個圖像。

接下來,Unity 在遊戲對象上創建動畫器組件,如圖 9 所示。

The Animator Component Pointing to a Controller
圖 9 指向控制器的動畫器組件

該元件指向一個稱為動畫控制器的簡單狀態機。這是一個由 Unity 創建的檔,它只是顯示了預設狀態;換句話說,它總是處於“空閒”狀態,而這是也是唯一可用的狀態。這種空閒狀態除了指向我的動畫檔之外,沒有其他作用。圖 10 顯示了在時間線上的實際關鍵幀資料。

The Idle Animation Data
圖 10 空閒的動畫數據

只是要播放動畫,但是看上去似乎有很多事情要做。儘管狀態機的功能就是使您可以通過設置簡單的變數來控制它們。但請記住,狀態只會指向動畫檔(雖然在 3D 中,您可以別出心裁地做一些將動畫融合在一起之類的事情)。

然後,我將用更多的圖像來製作跑動的動畫,並將它們拖放到我的 Yeti 遊戲物件上。因為我已經將動畫器元件添加到遊戲物件上,所以 Unity 只創建一個新的動畫檔,並添加一個稱為“跑動”的新狀態。我只要在空閒狀態上按一下滑鼠右鍵,創建一個過渡來跑動。這將在空閒狀態和跑動狀態之間創建一個箭頭。那麼我可以添加一個名為“Running”的新變數,它簡單易用,您只需在狀態之間的箭頭上按一下,並更改使用變數的條件,如圖 11所示。

Changing from the Idle to Run States
圖 11 從“空閒”狀態更改為“跑動”狀態

當“Running”為 true 時,空閒動畫狀態會更改為跑動動畫狀態,這僅僅意味著跑動動畫檔在播放。您可以輕鬆控制程式碼中的這些變數。如果您想在按一下滑鼠按鈕時通過觸發跑動狀態來啟動跑動動畫,您可以添加圖 12中顯示的程式碼。

圖 12 使用程式碼來更改狀態

private Animator _animator;

void Awake()

{

    // Cache a reference to the Animator

// component from this game object

    _animator = GetComponent<Animator>();

}

void Update()

{

  if (Input.GetButtonDown("Fire1"))

  {

    // This will cause the animation controller to

    // transition from idle to run states

    _animator.SetBool("Running", true);

  }

}

在我的範例中,我使用單個 sprite 來創建動畫。雖然,使用 sprite 表(一個單獨的影像檔,裡面含有多個圖像)是很常見的。Unity 支持 sprite 表,所以問題在於告訴 Unity 如何分割您的 sprite,然後將這些片段拖放到場景中。有所不同的幾個步驟分別為在 Sprite 屬性中將 Sprite 模式由單一更改為多個和打開 Sprite 編輯器,這樣可以自動分割 sprite 並應用所做的更改,如圖 13 所示。最後,展開 sprite(點擊專案視圖中的 sprite 圖示上的小箭頭),突出顯示所產生的 sprite,像之前那樣將它們拖放到場景中。

Creating a Sprite Sheet
圖 13 創建 Sprite 表

在您學會這個系統之前,動畫一直都可能是一個很複雜的課題。若要瞭解詳細資訊,請查看我的 Channel9 部落格或 Unity 學習網站上的優秀資源。

關卡末尾當玩家玩到關卡末尾時,您可以簡單將碰撞體設置為觸發器,並允許玩家擊打該區域。當他這樣做時,您只需載入另一關卡或重新載入當前關卡:

void OnTriggerEnter2D(Collider2D collider)

{

  // If the player hits the trigger.

  if (collider.gameObject.tag == "Player")

  {

    // Reload the current level.

    Application.LoadLevel(Application.loadedLevel);

    // Could instead pass in the name of a scene to load:

    // Application.LoadLevel("Level2");

  }

}

遊戲物件及其相應的屬性顯示在圖 14 中。注意,碰撞體的高度要足夠高,以至於玩家不能跳過去,並且要將此碰撞體設置為觸發器。

The Game Object and Its Properties
圖 14 遊戲物件及其屬性

遊戲玩法在像這樣的一個簡單的 2D 遊戲中,流程是非常簡單的。玩家開始。剛體受到的重力會使玩家下落。玩家和平臺上設置了碰撞體,所以玩家會停止。讀取鍵盤、滑鼠和觸摸輸入並移動玩家。玩家通過應用使其能夠跳躍的 rigidbody.AddForce 在平臺之間進行跳躍,通過讀取 Input.GetAxis(“水準”),並將其應用到 rigidbody.velocity 來進行向左移動或向右移動。玩家拾起蘑菇(正是被設置為觸發器的碰撞體)。當玩家碰觸到它們,可以增加得分,同時也會自我毀滅。當玩家終於成功到達最後一個標誌時,會有一個碰撞體/觸發器重新載入當前關卡。此處,另一個待辦事項是在地面下添加一個大型碰撞體來檢測玩家掉落平臺的時刻,然後再重新載入該關卡。

預設在編碼和設計中,重複使用都是很重要的。當您指定一些元件並且自訂您的遊戲物件之後,總是要在相同的場景中,甚至多個場景或遊戲中重複使用它們。您可以在場景中創建某個遊戲物件的另一個實例,但您也可以創建一個並不存在於場景中的預設實例。考慮平臺及其碰撞體。如果您想在整個場景中重複使用它們,目前還不可以。但是,通過創建預設,就能做到。只需將任何遊戲物件從層次結構中拖回到專案檔案夾中,然後創建一個副檔名為 .prefab 的新檔,並且該新檔包括所有子層次結構。現在,您可以將這個檔拖放到您的場景中並重新使用它。原來的遊戲物件會變成藍色,表明它現在已連接到預設。更新 .prefab 檔可以更新場景中的所有實例,您也可以將更改從經過修改的場景預設推送回到 .prefab 文件中。

按一下預設可顯示裡面包含的遊戲物件,如圖 15 所示。如果在此處進行更改,場景中的所有實例都將被更新。

Viewing the Contents of a Prefab
圖 15 查看預設內容

總結

還有一些在整個遊戲中執行的常用操作。在本文中,我介紹了使用碰撞體、剛體、動畫、得分記錄、基本的 GUI 文本以及讀取使用者輸入以使用力來移動玩家的遊戲平臺的基礎知識。這些構建的模組可以在各種遊戲類型中重複使用。請在我的下一篇文章中繼續關注 3D 討論話題!

其他學習

§ 請查看已構建好的此專案:channel9.msdn.com/Events/Build/2014/2-503

§ Microsoft Virtual 學院 – 使用 Windows 的 Unity 開發 2D 和 3D 遊戲:aka.ms/UnityMVA

§ Adam 的 Channel 9 部落格:aka.ms/AdamChannel9

§ Unity 資源:unity3d.com/learn


Adam Tuliper 是生活在陽光明媚的加利福尼亞州南部的一位 Microsoft 資深技術傳教士。他是一位獨立的遊戲開發人員,Orange County Unity Meetup(奧蘭治縣 Unity 聚會)的共同管理者,以及 pluralsight.com 的作者。他和他的妻子即將擁有自己的第三個孩子,所以在他尚有閒暇的時間裡,您可以通過訪問adamt@microsoft.com 或 Twitter twitter.com/AdamTuliper 來聯繫到他。

衷心感謝以下技術專家對本文的審閱:Matt Newman (Subscience Studios)、Tautvydas Žilys (Unity)