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

2019-02-16  本文已影响28人  刀客传奇

版本记录

版本号 时间
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

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


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);
   }
}

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

播放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;
}

代码执行以下步骤:

播放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一样具有影响力。记住这项技术刚刚开始!

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

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


补充

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

Services

后记

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

上一篇 下一篇

猜你喜欢

热点阅读