Unity强化篇(五) —— Unity 和 Ethereum(二)

版本记录

版本号 时间
V1.0 2019.02.16 星期六

前言

Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows 和Mac OS X下,可发布游戏至WindowsMacWiiiPhoneWebGL(需要HTML5)、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac 所支持。网页游戏 坦克英雄和手机游戏王者荣耀都是基于它的开发。感兴趣的看下面几篇文章。
1. Unity强化篇(一) —— 如何使用Vuforia制作AR游戏(一)
2. Unity强化篇(二) —— 适用于Unity的HTC Vive教程(一)
3. Unity强化篇(三) —— 适用于Unity的HTC Vive教程(二)
4. Unity强化篇(四) —— Unity 和 Ethereum(一)

Getting Some Ether Into Your Ethereum Account

在现实的Ethereum网络上,您通常使用在线交易所购买普通货币以太币。 用真钱测试软件不是一个好主意。 要将一些免费的Ether添加到您的测试帐户中,请按照以下步骤使用faucet

  • 1) 通过单击三重省略号并选择Copy Address to Clipboard,从MetaMask复制您的地址,就像您上面所做的那样。
  • 2) 像这个例子(like in this example.)中一样发送你的地址。 您还可以发布公开的Facebook帖子或公开的Google Plus帖子。
  • 3) 转到Rinkeby faucet site并粘贴您刚刚制作的社交媒体帖子的链接。 使用屏幕右侧的下拉菜单选择您想要接收的Ether数量:

几秒钟后,您会看到一个确认:

  • 4) 等待20秒左右,然后检查余额。 您可以在MetaMask中查看余额;这是左下角的Ether(ETH)量:

Reading An Account Balance

您是测试网络的解决方案! 现在,您将看到Unity如何读取您的余额。 在HighScoreController.cs文件中,在文件顶部添加一些额外的using语句:

using System.Numerics;
using Nethereum.Hex.HexTypes;
using Nethereum.JsonRpc.UnityClient;

用以下代码替换GetAccountBalanceCoroutine的内容:

public IEnumerator GetAccountBalanceCoroutine()
{
   var getBalanceRequest = new EthGetBalanceUnityRequest(networkUrl);           // 1
   // Send balance request with player's account, asking for balance in latest block
   yield return getBalanceRequest.SendRequest(playerEthereumAccount, Nethereum.RPC.Eth.DTOs.BlockParameter.CreateLatest());  // 2

   if (getBalanceRequest.Exception == null)                                     // 3
   {
      var balance = getBalanceRequest.Result.Value;                             // 4
      // Convert the balance from wei to ether and round to 8 decimals for display                                
      uiTextEtherBalance.text =
        Nethereum.Util.UnitConversion.Convert.FromWei(balance, 18).ToString("n8");    // 5
   }
   else
   {
      Debug.Log("RW: Get Account Balance gave an exception: " + getBalanceRequest.Exception.Message);
   }
}

上面代码中的编号注释显示它执行以下步骤:

  • 1) 该脚本创建一个新的Nethereum请求,传递您正在使用的网络。
  • 2) 该脚本异步发送请求,传入识别玩家Ethereum帐户的参数,并说明您想要余额的块号。 你想要最近的,最新的块。
  • 3) 该脚本检查调用中的错误。
  • 4) 该脚本提取余额。
  • 5) Ethereum网络通常在称为Wei的单元中记录Ether值。 组成一个Ether需要10亿亿Wei,因此您需要进行单位转换才能显示以太Ether值。

播放scene。 按Refresh按钮并等待几秒钟。 余额显示在高分表的下方:


Preparing To Interact With The High Score Contract

现在,您将把游戏连接到一个记录前40个高分的 smart contractsmart contract是用Solidity语言编写的。

您的第一步是围绕Solidity契约创建一个C#包装器,以便在C#代码中轻松进行交互。 在代码编辑器中,从Assets \ RW \ Scripts文件夹中打开HighScoreContractWrapper.cs文件。

第一个注释栏是版权声明。 你应该取消注释第二个评论栏。 删除第30行上的/ *和文件末尾的* /。 保存文件。 最终结果将是这样的:

/*
 * Copyright (c) 2018 Razeware LLC
...
*/
...
using Nethereum.ABI.Encoders;
using Nethereum.ABI.FunctionEncoding.Attributes;
...
   [Parameter("int256", "score", 2)]
   public BigInteger Score { get; set; }
}

要了解合同(contract)的工作原理,您可以浏览contract source code。 您可以看到它存储了一个高分的公共数组,并公开了一个函数来接收名为setTopScore的新高分值。 C#包装器HighScoreContractWrapper.cs为您提供了一个C#方法CreateSetTopScoreTransactionInput,您可以使用该方法向 smart contract发送新的高分。

注意:了解C#包装器脚本和 smart contract背后的细节超出了本教程的范围。

返回再次编辑HighScoreController.cs。 在靠近文件顶部的全局数据部分中,添加两个新的私有变量:

private HighScoreContractWrapper scoreContractService;
private HexBigInteger gasLimit = new HexBigInteger(4712388);

第一个是对C#包装器的引用;第二个代表您想要在交易上花费的最多。 本教程不涉及gas的概念,但您可以将其视为Ether

Start结束时,添加以下行:

// Service for interaction with high score contract
scoreContractService = new HighScoreContractWrapper();

Ethereum使用256位整数,这需要Unity中不具备的数据类型作为标准。 找到PrettifyScore方法,并更改其签名以接收BigInteger而不是int

private string PrettifyScore(BigInteger score) ...

保存所有内容,切换到Unity并确保项目编译。

接下来,您将阅读高分contract


Retrieve High Scores From Ethereum

切换回代码编辑器。 找到方法GetHighScoresCoroutine,并将其替换为:

public IEnumerator GetHighScoresCoroutine()
{
   var topScoreRequest = new EthCallUnityRequest(networkUrl);                         // 1
   // Use the service to create a call input
   var countTopScoresCallInput = scoreContractService.CreateCountTopScoresCallInput();
   // Call request sends and yield for response  
   yield return topScoreRequest.SendRequest(countTopScoresCallInput, 
     Nethereum.RPC.Eth.DTOs.BlockParameter.CreateLatest());                           // 2

   // Decode the top score using the service
   var scores = new List<HighScoreDataTypeDefinition>();
   var count = scoreContractService.DecodeTopScoreCount(topScoreRequest.Result);      // 3
   Debug.Log("RW: High Score count: " + count);
   for (int i = 0; i < count; i++)
   {
      topScoreRequest = new EthCallUnityRequest(networkUrl);                          // 4
      var topScoreCallInput = scoreContractService.CreateTopScoresCallInput(i);
      yield return topScoreRequest.SendRequest(topScoreCallInput, 
        Nethereum.RPC.Eth.DTOs.BlockParameter.CreateLatest());
      scores.Add(scoreContractService.DecodeTopScoreDTO(topScoreRequest.Result));
   }

   var orderedScores = scores.OrderByDescending(x => x.Score).ToList();               // 5
   var topScores = "";
   foreach (var score in orderedScores)                                                       
   {
      string playerAddress = PrettifyAddress(score.Addr);
      string playerSCore = PrettifyScore(score.Score);
      topScores = topScores + playerSCore + " : " + playerAddress + Environment.NewLine;
   }
   uiTextHighScores.text = topScores;
}

代码执行以下步骤:

  • 1) 该脚本创建一个新的Nethereum请求。
  • 2) 该脚本异步发送请求,传入标识我们要调用的smart contract方法的参数。
  • 3) 该脚本会检查有多少最高分。
  • 4) 该脚本一次提取每个最高分的详细信息。
  • 5) 该脚本对分数进行排序,并使每个高分条目成为一种在屏幕上显示的漂亮格式。

播放scene,按刷新,等待几秒钟,出现高分列表:


Write High Score to Ethereum

返回到您的代码编辑器,找到方法SubmitHighScoreCoroutine,并将其替换为:

public IEnumerator SubmitHighScoreCoroutine()
{
   // Create the transaction input with encoded values for the function      
   var transactionInput = scoreContractService.CreateSetTopScoreTransactionInput(playerEthereumAccount, contractOwnerAddress, contractOwnerPK, aliveTimeMilliSeconds, gasLimit);

   // Create Unity Request with the private key, url and user address       
   var transactionSignedRequest = new TransactionSignedUnityRequest(networkUrl, playerEthereumAccountPK, playerEthereumAccount); // 1

   // Send request and wait
   yield return transactionSignedRequest.SignAndSendTransaction(transactionInput);

   if (transactionSignedRequest.Exception == null)
   {
      // Get transaction receipt
      Debug.Log("RW: Top score submitted tx: " + transactionSignedRequest.Result);
   }
   else
   {
      Debug.Log("RW: Error submitted tx: " + transactionSignedRequest.Exception.Message);
   }
}

上面的代码与您之前看到的类似。 它准备请求,发送请求并解释结果。 注释// 1显示了使用玩家私钥和地址授权发送事务的显着区别。 这花费了一些玩家的以太来支付矿工。

保存并播放场景。 按space开始播放并尝试获得好分数 - 至少足以让你进入前40名。当你的elephant死亡时,等待几秒钟。 然后,按下刷新按钮再等几秒钟。 如果您的高分进入前40名,它应该出现在列表中:

您还会注意到您的以太币余额会随着提交高分的交易成本略有下降。


Examining Ethereum High Score Transactions

您可以使用block explorer查看事务的状态。 当游戏提交高分时,控制台会显示一条开始RW的消息:RW: Top score submitted tx:,后跟一个交易号:

您可以使用以下模式创建URL:
https://rinkeby.etherscan.io/tx/[transaction ID here]

然后在浏览器中输入它以查看事务状态,如下like this

这是一次非常棒的旅行!你现在已经完成了实际的部分。接下来的部分将结束本教程,首先介绍以太坊(Ethereum)在当今游戏中面临的挑战。


Challenges Facing Ethereum in Games

Apple的创始人之一Steve Wozniak最近表示said recently,从长远来看,以太坊可能会像Apple一样具有影响力。记住这项技术刚刚开始!

以太坊与游戏开发相关的主要挑战包括下面列出的那些。

  • Resistance。您将了解当前存储您的游戏玩法数据的玩家可能不愿意看到其他服务参与其中。
  • Scaling。以太坊每秒可以处理大约10笔交易。这需要更高,以便广泛采用。 Casper旨在为以太坊网络引入proof-of-stake。这可以使分片变为现实,有助于解决缩放问题。
  • Fees。在撰写本文时,费用约为几美分。这对某些用途来说太贵了。
  • Public Bugs。在公共区块链上使用smart contracts意味着所有人都可以看到错误,但您无法快速修复它们。

注意:请记住,没有人充当以太坊网络的警察。以太坊本身是安全的,但人类的错误会发生。如果您错误地在实时网络上发送真正的以太网,它就会永远消失。


补充

1. Learn More About Ethereum and Solidity

一旦你完成了演示项目,你可能想深入探索以太坊。

开始学习以太坊和Solidity的好地方是它的官方网站official site。 我推荐的作家和演说家是Andreas Antonopoulos,他在2018年晚些时候出版了一本关于以太坊的书

2. Learn More About Nethereum

Nethereum项目是开源(open source)的。 感谢Juan Blanco的建议和演示代码激发了这里的示例。 您可以加入他们的Gitter并与他人聊聊该项目。

3. Get Inspired

看看其他人已经在游戏和以太坊上做了些什么来获得更多灵感:

Games

  • CryptoKitties就像一个卡片交易游戏,你可以收集和繁殖数字猫。 这个游戏收到了很多压力,因为它曾经如此受欢迎,它影响了整个以太坊网络的性能。
  • CryptoCuddles是一款基于CryptoKitties游戏构建的卡牌游戏。 你可以和你在CryptoKitties中培育的小猫一起战斗。 这是因为CryptoKitties smart contracts对任何其他开发人员开放使用。 很酷!
  • ChainMonsters非常有趣,它有点像以太坊上的Pokémon,智能合约公开可见。

Services

  • uPort是一个管理人们以太坊身份的项目。 uPort可以更轻松地使用网络,而无需输入长私钥。
  • GamerToken希望成为任何游戏都可以使用的常见游戏内货币。
  • Ownage希望成为游戏内物品交易平台。

后记

本篇主要讲述了Unity 和 Ethereum,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容