教你使用Unity3D製作Dapp Part2(適用以太坊Solidity)
-BlackJack 21點開發 部屬在TAN柑橘網路-
本教學的合約部屬在Tangerine Network
https://tangerine.garden
Ethereum以太坊Solidity架構適用

對Dapp遊戲開發有興趣的朋友們,這篇是Unity3D Dapp教學第二篇,這篇文章會讓你很輕鬆的獲得開發Dapp全端的基礎能力,只要一步一步攻略,無須伺服器主機,30分鐘就可以發行自己的Dapp。
這個影片是開發完成的Dapp影片,所有的程式代碼(智能合約、C# Script及Unity3D專案檔)都開源,教學所附的視覺UI因授權問題會有所更改,但內容完全一樣,若您要使用在商業用途,專案裡面的視覺圖檔以及音效檔請替換成有付費授權或是自己設計的檔案以免侵權。
0.使用軟體及語言
>>下載BlackJack21點SDK
https://github.com/TigerZen/Unity3D-BlackJack-Dapp
>>下載 Android Apk
Apk Link
>>Tangerine Wallet(類似MetaMask)
請參考 Part 1(0.使用軟體及語言)
>>Solidity IDE Remix線上編譯器
網址:https://remix.dxn.ninja
>>Unity 3D遊戲編輯引擎(免費)
請參考 Part 1(0.使用軟體及語言)
1.介紹柑橘網路

Tangerine Network是台灣團隊Byzantine-Lab,基於Dexon開源項目升級開發的高性能公鏈,採用POS共識機制,由台灣數十個技術團隊所組成的社區共同治理,並將節點分散到Tangerine社區夥伴來運營,出塊速度趨近於每秒一個區塊,對於極度追求性能的遊戲Dapp開發者而言,Tangerine Network柑橘網路是目前市面上最佳公鏈環境,沒有之一(個人使用評比觀點)。
2.介紹21點-智能合約:
本教學使用的智能合約放在SDK裡的BlackJack.sol檔,下面是合約裡面幾個重要函數的說明:
==============命令類==============
function startGame(); //開始遊戲
function Player_Hit(); //玩家補牌
function Player_Stand(); //執行不補牌
function Banker_ShowCard(); //莊家開牌,並執行莊家補牌
function EndGame(); //遊戲結束結算
function withdraw_allETH(); //提領合約全部餘額
==============查詢類==============
function inquireBankerCard1(address _address); //查看莊家第一張牌
function inquireBankerCard2(address _address); //查看莊家第二張牌
function inquirePlayer(address _address); //查詢玩家手中牌
function inquireBanker(address _address); //查詢莊家手中牌
function inquireETH(); //查詢合約餘額
當玩家執行startGame()發送籌碼下注時,合約會紀錄Event Logs,第三條Event Logs會記錄這局開牌是否有人拿到21點,如果:
result = 0代表都沒有21點,
result = 1代表都有21點平手,
result = 2代表只有玩家21點(玩家可取回3倍籌碼),
result = 3代表只有莊家21點。
確認四種結果後,合約會判斷是否讓玩家可以執行Player_Hit()來補牌,如果開局result = 0,玩家就可以依照牌面點數補牌,如果點數足夠了,玩家就要選擇執行Player_Stand()停止補牌,並執行Banker_ShowCard()讓莊家開牌看結果,萬一玩家補牌後點數超過21點,則玩家Bust就要選擇執行EndGame()清算並清空數據。
若玩家補牌後未大於21點,並執行Player_Stand()和Banker_ShowCard()跟莊家比大小,不管誰大誰小,或是平手,玩家都必須執行EndGame()來清算,玩家贏了就拿回2倍下注籌碼,玩家輸了就失去下注籌碼,如果雙方平手,玩家就拿回下注籌碼。
3.可驗證隨機數Rand()
本遊戲裡的智能合約需要產生隨機數來取得雙方的牌點,而我們用的隨機數是Tangerine Network從底層架構產生的函數,因為是使用包含從底層節點產生的值所組成,這個函數就無法被預測,可以避免常見的預言攻擊,並大大降低該發者取得公正隨機數的成本。
函數的公式如下:
rand = Keccak( Randomness . Caller . Nonce . RandCallIndex )
介紹連結:
https://tangerine-network.github.io/wiki/#/On-Chain-Random-Oracle
4.合約部屬
部屬合約方法請參考 Part 1(5.合約部屬)。
唯一要注意的是部屬合約時要做一些小變動(下圖),部屬合約時就必須把莊家籌碼一起打進合約裡。

5.合約導入Unity3D
Unity3D是使用C#語言來開發遊戲的(也可以使用Javascript),而要讓Unity3D可以調用查詢智能合約必須使用Nethereum SDK(出處在:https://nethereum.com),Nethereum的功能可以直接產生私鑰或導入私鑰到專案裡,編譯後玩家無須使用第三方錢包來簽屬Dapp,在使用得宜之下,玩家可以跨越區塊鏈的高門檻,讓完全不懂區塊鏈及加密貨幣的圈外玩家暢玩Dapp遊戲,並享受區塊鏈帶來的革命及便利。
A1.用Unity3D打開BlackJack專案,在Assets/Script/資料夾裡會發現一個BlackJack.cs檔。

A2.雙擊點選Slot.cs後會用Visual Studio打開檔案,並看到被收起的大綱項目,點選智能合約大綱旁的+號展開代碼。
A3.把剛剛部屬好的合約地址貼在地77行的ContractAddressBJ21後面。

A4.點選Maximize On Play後,再點選中間上面的箭頭Play>,便可進入遊戲。

A5.可以直接把Tangerine Wallet裡面的私鑰導入,或是點選Create產生新的私鑰,創造新的私鑰後會複製在剪貼簿,可以另外貼到記事本裡存下來方便下次使用,而創造出來新的私鑰及地址,需要再去代幣水龍頭取得TAN測試幣。

A6.進入遊戲後可以點選地址處複製地址到剪貼簿,下方有不同投注倍數的按鈕可以點選投注,上方左右各有重讀玩家地址和合約地址餘額按鈕,以及離開遊戲按鈕。

6.其他注意事項
B1.如果TAN測試不好取得足夠數量,可以將合約地址換成我已經部屬好的地址0x4233808F20dbA600cA97Dd2f1F99E504c95E245C。
B2.您在本篇教學產生的私鑰請只拿來開發測試遊戲使用,不要用在任何主網(ETH/TAN)的資產儲存轉移。
B3.本篇教學裡的Unity3D輸出編譯以Android為主,若要輸出成Windows版應用程式,需要把解析度做調整,要輸出IOS版請善用Google大神查詢。
B4.若要轉出APK需要安裝JDK和Android SDK。
B5.後面還會陸續推出更多使用Unity3D 開發的Dapp教學,下一篇預計介紹水果盤(小瑪利)機台的開發,請持續關注。
B6.本篇的教學內容一樣可以部屬在以太坊Solidity架構的區塊鏈網路上,只需要把Slot.cs第74行裡的_urlMain宣告成你部屬的節點,如:https://mainnet.infura.io/(Infura服務下的ETH主網節點),以及BlackJack.sol裡隨機數生成的方法改成以太坊Solidity架構常規的生成方式即可(但要小心預言攻擊防範)。
7.教學內容版權聲明
智能合約Solidity撰寫:陳奕丞(Arina團隊)
Unity3D專案製作:虎哥(Arina團隊)
Slot C#撰寫:虎哥(Arina團隊)
視覺UI製作:Arina團隊美術小姐姐
8.Arin團隊其他Dapp介紹
Arina地產大亨:https://www.arinatycoon.com
Arina Hunters:https://www.arinahunters.com
Arina官網:https://www.arinamillion.com
詢問Line ID:tiggerzeeen
