版本记录
版本号 | 时间 |
---|---|
V1.0 | 2019.02.16 星期六 |
前言
Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone、WebGL(需要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 contract
。 smart 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();
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,感兴趣的给个赞或者关注~~~