利用NEO与Unity制作游戏(第2部分)"
往事随风760
发表于 2022-12-5 17:35:42
154
0
0
- Q: Q9 M$ w0 |9 S
NEOLux提供了一些方便的方法,可以用于将你的游戏连接到官方的测试网或者是主网。
* \8 t% K' q$ Y5 l8 f1 n
但在本教程中,我们会搭建自己的私有网络。这个过车是非常简单的,一旦你克服了最初的障碍(我会引导你),你会发现这比使用测试网络更加简单。例如,尽管填写用于测试的GAS或者Tokens的申请表格可能不是世界上最困难的任务,但我发现就这样一点点小摩擦,往往会扼杀我继续的热情和动力。6 K9 p+ M5 W0 g! J$ k$ O
! ~6 T+ z* ^- U; p+ E
你也可以在本地运行你自己的私有网络,不过在本教程中,我们将设置自己的服务器。这会使得团队工作或者构建工作这类事情更加简单直接。我将使用DigitalOcean。因为根据我的经验,他们具有良好的性价比。
1 H, q. A, W5 B0 h& [. C
免责声明:我不是一个后端/服务器开发者,我猜“中等”水平的人应该会喜欢使用命令行工具。对于那些知道自己在做什么的人来说,这些内容应该很容易。如果你了解Linux和Docker的话,可以直接从DockerHub安装NEOPrivateNet并使用DockerCompose运行NEOSCAN。对于其他那些或多或少是我这种水平的人来说,接下来的内容应该还是相当简单直接的。
5 K2 q8 L2 G! e- ?2 g
如果你还没有DigitalOcean账户的话,就去创建一个。然后使用以下选项创建一个Droplet。7 G4 U. R3 R7 q& t
; y) U7 Q3 D, m* y5 {2 u
使用16.X或者18.X版本的Ubuntu
5 f7 _4 F @6 [
使用中配应该就足够了–你可以在配置中自行尝试,并在评论中告诉我你的试验的结果
) l) o! [2 c) I& a7 o- \0 G! E. N
SSH登入到你新建的Droplet并安装docker。如果你按照DigitalOcean提供的指南进行操作的话,这个过程将非常简单:https://www.digitalocean.com/com ... ker-on-ubuntu-18-04
* g3 l; l$ {( B6 x
注意:在执行最开始的一步,向系统添加官方Docker库的GPG键这步操作时,我遇到了点小问题。我只是简单地跑了两次命令,然后一切都很顺利。& b, g$ d' }" P. U0 Z
3 n" I# K! x5 k; S. J2 m/ X
然后安装docker组件。同样地,安装说明非常的简单。只需要确保你看的是针对Linux系统的说明就行。8 e. t) t' |; R% o/ E8 O. T
# g. s2 e, O1 S, s _
安装私有网络和NEOSCAN
运行和安装我们自己的私有网络,这是最为困难的一步,好在CityofZion的人帮我们很好的做到了这一点。你可以点击这个链接查看他们的全部说明指导。同样地,SSH登录到你的Droplet,基本上我们只需要输入几个命令就行:9 [/ n3 \( X) j- O+ w
+ P O, h* H3 f! s+ c& S
首先,从hub上下载docker镜像: g! h; P1 r( {! e
' o/ u8 c' A- h! k8 H
dockerpullcityofzion/neo-privatenet
! ^, f+ U* U- \5 j
…下载NEOSCAN…' J+ I$ L# ~6 o4 \+ ]# P
wgethttps://raw.githubusercontent.co ... /docker-compose.yml2 v7 Q& E' e$ z! B/ u5 G
…并运行privnet…
$ X) E; d, Q' Z6 J g4 C4 O
docker-compose-fdocker-compose-neoscan.ymlup9 A6 E% s1 ?! y$ z8 {9 z, L
( C1 \4 i2 p5 [% ]
让它运行起来,然后转到http:your-droplet-ip-address:4000查看NEOSCAN的运行情况:0 H8 W3 F6 w5 _( G2 `
q+ I) y+ L0 z2 \
回到Unity* }% u. f1 Z1 S) K, }: v7 j0 P) O0 F
我不想在本教程中深入探讨自己的开发风格,不过我要做的一件事就是将UniRx插件导入Unity中。UniRx是对.NETReactiveExtensions的重新实现,它针对Unity做了优化处理,而且能很好地兼容iOSIL2CPP。不必过于复杂的实现,它可以简化一些管理NEO和UI的代码。
在资产(Assets)–>脚本(Scripts)下创建另一个名为NEOManager的脚本,并复制+粘贴以下代码:& q. v- H# G& X# [7 `4 s
5 `7 q3 C- J# [; O
usingSystem.Collections;8 T k0 }% t' Z7 L
' r% c8 w3 Y4 |+ r
usingUnityEngine;1 Y+ [, N0 c6 A
usingSystem;
1 P# F. m2 \' z5 }) R
usingUniRx;
usingNeo.Lux.Core;
' x# {2 h, c W% y8 \3 o) D' B5 u
usingNeo.Lux.Cryptography;
usingUnityEngine.UI;8 |! s; I# C1 [
" p9 j' W3 R I
publicclassNEOManager:MonoBehaviour% e; j% T# b: x# h
7 T: Y" G; x( y. q" L
{. P% o- b7 I8 a% S* K X+ C
publicNeoAPIAPI;
[SerializeField]privatestringRpcIP;
publicconststringAssetSymbol="GAS";/ Q: O9 b; E6 F- i, U- S0 G0 Q7 N: z. D
[HideInInspector]
* l+ Q8 p7 q) A4 u
publicKeyPairReactivePropertyPlayerKeyPair=newKeyPairReactiveProperty();
2 e* W; X. X2 h2 ~
[SerializeField]privateTextaddressText;% Q: k+ \& Z5 D: Q7 {1 o
% R8 D; `, r) ? [' [5 m& A- c
[SerializeField]privateTextbalanceText;
publicDecimalGASBalance;2 `: H5 ~9 I0 O% |: M* y
3 o4 D( I( A$ N& M2 D6 R
privatevoidOnEnable()
# K# I) r- z; Y* W$ Q5 B
{
6 L6 w2 ~4 H% O2 q# _
PlayerKeyPair.Value=KeyPair.FromWIF("KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr");
#ifUNITY_EDITOR
//this.API=newLocalRPCNode(30333,"http://localhost");
this.API=newCustomRPC(30333,4000,"http://"+RpcIP);6 \ l3 A+ K8 r" x. o
#else
( p$ _+ V) @' ` A. c. @" q9 p
//this.API=NeoRPC.ForTestNet();- B) k) A% M/ s% T: P
# g( k* ^8 K4 r# `% h3 q& z
this.API=newCustomRPC(30333,4000,"http://"+RpcIP); h( D' X/ Z9 h
# y! C9 P9 _' z$ u' c
#endif
! [ |+ i; e- e& I
this.PlayerKeyPair.DistinctUntilChanged().Where(kp=>kp!=null).Subscribe(keyPair=>8 {" ` A5 {5 I9 Y$ w
8 H3 ^1 p0 |, V' B! i2 j
{) U% c/ a# y& f1 ?8 Q
this.addressText.text="Address:"+keyPair.address;% K- V' U i' J
this.balanceText.text="Balance:Pleasewait,syncingbalance...";
' I# z# c* d( L5 r; |
StartCoroutine(SyncBalance());0 D9 B: } }. q5 {1 z6 l# H0 Q
; M9 w/ E1 n; @0 Y5 ]
}).AddTo(this);7 m4 S. E# D" Q5 n# O
}3 c& i( G/ _+ m0 C( z; V! f
privateIEnumeratorSyncBalance(), F3 V) o$ T- Y9 n
! W- I' z' w+ K/ I( `% |
{
+ ?' @6 U2 V5 G( ~7 A
yieldreturnnull;% f/ D* H$ n0 D3 S. V$ }9 S4 V" E9 ~
varbalances=this.API.GetAssetBalancesOf(this.PlayerKeyPair.Value);8 i9 E; o5 g0 ^- @: E+ a4 @
/ Z1 _% Q) G" p
this.GASBalance=balances.ContainsKey(AssetSymbol)?balances[AssetSymbol]:0;
this.balanceText.text="Balance:"+GASBalance.Value.ToString()+""+AssetSymbol;% {1 T! T! {7 ? ]8 L
0 n) }7 m7 Q, e. Z" N
}! K7 ^0 R; U! b
}
[Serializable]
publicclassKeyPairReactiveProperty:ReactiveProperty1 W! u5 n T# w- }: u
{# z+ L: Z. j4 r9 E' J9 X4 {' N& ^- U
# q6 T! Y) @6 m" l4 i+ o J3 [
publicKeyPairReactiveProperty(){}. W( N% {) _ p' q
publicKeyPairReactiveProperty(KeyPairinitialValue):base(initialValue){}! Q/ n3 p: }) v% _/ [5 t, m+ G
) W. u) o- {5 u2 C6 u$ H
}
保存脚本然后返回主场景。创建一个空的游戏对象(GameObject),将其命名为NEO,然后创建一个该NEO对象的空的游戏子对象(childGameObject),并将其命名为NEOManager,并将NEOManager脚本添加到这个NEO对象中。在检查器(inspector)中的RpcIP字段旁边输入你的Droplet的IP地址。9 D& i; V6 U7 q9 D
0 l" t$ _% U, R1 P; U
接下来,我们将创建一些UI元素并将它们连接到检查器中,这样在连接到主网的时候,我们就可以看到余额的更新。" \3 Y; K, [5 Z0 @+ m. Z
创建UI画布并向其中添加两个子文本元素,然后单击并将它们的引用拖动到NEOManager的“(AddressText)”和“(BalanceText)”字段。" K+ @! K% n4 _2 t$ z4 q U* p
单击播放(Play)按钮然后查看地址和余额的更新情况。5 P! R% { O0 x# _; c$ t( W: e
W5 ]1 _, z4 o, h2 R8 u5 P, U2 P" q
我们当前使用的是在安装私有网络时自动生成的测试账号。在下一部分中,我们会进行一些设置,以便我们的玩家可以输入他们自己的私钥然后开始与NEO区块链进行交互。
成为第一个吐槽的人