歡迎來到使用Unity遊戲引擎製做的NEO區塊鏈遊戲的’A-Z’多系列講解教程的第3部分。在第2部分中,咱們設置了本身的私有網絡並將其鏈接到咱們的Unity場景中。 在第3部分中,咱們會進行一些設置,以便咱們的玩家能夠輸入他們本身的私鑰而後開始與NEO區塊鏈進行交互。安全
咱們將保證每一個系列內容的簡潔清晰,從而對總體的工做流程作出全面地演示說明。某些內容咱們會作出快速的討論,有任何不清楚的地方,隨時歡迎你發表評論,我很樂意爲你解答。網絡
至此,咱們將開始添加更多自定義的邏輯並與NEO區塊鏈進行交互。 對於任何熟悉這個領域的人來講,這些是不言自明的,可是這個應用程序僅用於教學目的。一款遊戲在不少方面來講就像一個錢包,做爲用戶和開發者,在最終將應用鏈接到主網或者將應用程序交付給用戶時,都必須很是的謹慎。在這個領域中,大多數面向用戶的項目都通過了完全的測試和審覈,以便發現代碼漏洞和惡意代碼。我建議你多花時間與社區合做而後作這些工做。本教程只介紹一些基本知識,爲簡單起見,咱們會直接將私鑰等內容保存在本地存儲中,這是不安全的。不要在生產環境中這麼作。學習
下一部分會更多地涉及到Unity特定的工做流的內容,因此我會給你提供一個預置和腳本文件,你能夠直接導入到你的項目中,這樣能夠節省一些時間。你能夠直接在這裏下載。這個腳本會管理你的NEO錢包的實例,若是你尚未這個實例的話,它會幫你新建一個。我提供這個腳本的緣由是爲了證實擁有良好入門體驗的重要性。許多的加密貨幣項目(以及一些遊戲)都會要求用戶進行大量的學習從而學會如何使用這個應用程序。長遠上來講,咱們須要更好地瞭解如何引入新用戶,同時在這麼作的時候儘量地減小摩擦。用戶已經投入時間下載遊戲了,當開始要求佔用他們更多時間的時候,若是能在開始玩遊戲的時候,有着越少的必要的點擊操做和學習要求,他們就越不可能立馬刪除遊戲。不要讓用戶去思考。區塊鏈
理想狀況下,我是但願能徹底移除第一個界面,只需將用戶直接放入遊戲中便可。但持有資產的問題是很明顯的,你必須很是清楚什麼時候以及如何處理這些資產。當用戶忘記或者丟失他們的密鑰時,你沒法直接進入後臺幫助用戶重置和檢索他們的數據。一個好的中間解決方案是遊戲的開始部分不用涉及到任何錢包內容,只有用戶想要更好地嘗試你的錢包功能時,纔會提示用戶輸入這些錢包信息。但願大家能自行嘗試探索本身的解決方案。測試
在後面的教程中,咱們將更深刻地研究智能合約,可是如今咱們只想快速與NEO區塊鏈進行交互。當玩家得分超過某個閾值時,咱們會給他們代幣做爲獎勵。GAS在某種程度上是NEO區塊鏈中的實際代幣,因此咱們會使用它來做爲獎勵。this
在建立一個真正的遊戲時,你將不得不與攻擊做鬥爭,而鬥爭的同時又要保持遊戲的趣味性和經濟的流動性並非一件容易的事情。出於演示的目的,咱們在這裏會進行簡化。在真正的在線遊戲中,你須要多種反做弊機制,但最終在遊戲中,咱們知道咱們永遠都沒法避免全部的攻擊。某個地方的某我的會下定決心去破壞你的遊戲。不然的話你會遺漏一個關鍵的代碼漏洞。咱們試圖經過防止最爲常見的攻擊和睡眠不足來找到平衡,咱們常常以這樣一種方式分割經濟,以便其餘玩家的遊戲體驗不會在這個過程當中受到損害。加密
建立一個名爲NEORewardManager的遊戲對象GameObject,將它做爲其餘NEO管理器的子對象。建立一個名爲NEORewardManager的腳本並複製粘貼如下代碼:翻譯
using System; using System.Collections; using UniRx; using UnityEngine; public class NEORewardManager : MonoBehaviour { [SerializeField] private NEOManager neoManager; [SerializeField] private CompleteProject.PlayerHealth playerHealth; [SerializeField] private int rewardThreshold = 50; private bool isGameOver; private void Update() { if(playerHealth.currentHealth <= 0 && !isGameOver) { StartCoroutine(OnGameOver()); isGameOver = true; } else if(playerHealth.currentHealth > 0 && isGameOver) { isGameOver = false; } } private IEnumerator OnGameOver() { yield return new WaitForSeconds(1); Time.timeScale = 0; if(CompleteProject.ScoreManager.score >= rewardThreshold) { StartCoroutine(TrySendGAS(1)); } else { Time.timeScale = 1; } } private IEnumerator TrySendGAS(int amount) { yield return null; try { var tx = neoManager.API.SendAsset(neoManager.MasterKeyPair, neoManager.PlayerKeyPair.Value.address, NEOManager.AssetSymbol, (decimal)amount); if (tx == null) { Debug.LogError("Null Transaction returned"); Time.timeScale = 1; } else { Debug.Log("TX received, checking sync..."); Observable.FromCoroutine(SyncBalance).Subscribe().AddTo(this); } } catch (NullReferenceException exception) { Debug.LogError("There was a problem..."); Time.timeScale = 1; } catch (Exception exception) { Debug.LogError("There was a problem..."); Time.timeScale = 1; } } private IEnumerator SyncBalance() { yield return null; try { //var balances = neoManager.API.GetAssetBalancesOf(neoManager.PlayerKeyPair.Value); //neoManager.GASBalance.Value = balances.ContainsKey(NEOManager.AssetSymbol) ? balances[NEOManager.AssetSymbol] : 0; //if (Mathf.Approximately((float)NEOManager.GASBalance.Value, GameDataSystem.Coins.Value)) //{ // Debug.Log("GAS transferred successfully"); //} //else //{ // Debug.LogWarning("Something's not right." + // //"\nCoins: " + GameDataSystem.Coins.Value + // "\nGAS: " + NEOManager.GASBalance.Value); //} Debug.Log("Balance synced!"); Time.timeScale = 1; } catch (NullReferenceException exception) { Debug.LogWarning("Something's not right." + //"\nCoins: " + GameDataSystem.Coins.Value + "\nGAS: " + neoManager.GASBalance.Value); Time.timeScale = 1; } } }
系統會等待遊戲結束狀態,遊戲結束後若是玩家得分超過某個特定的閾值,系統就會從主帳戶中轉帳GAS到本地玩家帳戶中。 經過拖放場景中的引用來鏈接NEOManager和PlayerHealth。 你還能夠將獎勵閾值設置爲你想要的任何值; 玩玩看看。 在隨後的回放中,你能夠看到數量的更新,這能夠反映出GAS已經轉帳正常了。恭喜,咱們如今已經能夠與NEO區塊鏈進行一些基本的交互了,耶。code
在接下來的教程中,咱們將更深刻地探討智能合約,並探索系統可以提供的其餘功能。對象
NEOFANS:neofans.org
NEOFANS 微博:https://www.weibo.com/neofans...
NEOFANS telegram羣:https://t.me/NEOfansCN