进化您的游戏
使用你所熟知和喜爱的工具,以先进的设计、智能增长和更好的货币化来锻造区块链游戏。
进化您的游戏
使用你所熟知和喜爱的工具,以先进的设计、智能增长和更好的货币化来锻造区块链游戏。
谢谢你!请检查您的电子邮件。
错误

技术栈为失落的文物提供动力

从技术上深入了解《Lost Relics》的开发者Cliff Cawley是如何使用Enjin平台和Unity引擎来打造第一款Enjin驱动的ARPG。

以下是一篇客座文章,作者是 Cliff Cawley的创造者。 失落的遗物.

自从我发布了第一个可玩的《Lost Relics》(原名《Forgotten Artifacts》)版本以来,已经有8个月了,这是一款通过Enjin平台在Ethereum Mainnet上运行的黑客地牢爬行游戏。

Lost Relics是第一个被Enjin Spark计划接受的项目。由于忙于其他工作而错过了最初的早期采用者计划,我抓住了加入Spark和Enjin生态系统的机会,并开始了我在区块链游戏领域的冒险。

以下是我的经验,以及如何充分利用Enjin区块链游戏开发平台的最佳实践和建议。

初次发布

2019年5月第一款游戏发布后,很快就有了"暴走"活动,我用这个活动来看看我打造的系统在压力下的表现,以及是否有什么需要进一步打造和维护的地方。

我原本打算在Stampede活动结束后关闭服务器,以便花一些时间进行整顿、规划和改进。然而,参与者们非常喜欢,他们要求我继续运行服务器,让他们继续玩下去。

只需极少的停机更新时间,游戏已经上线8个月了!

第二场活动 "堕落之桌 "于7月1日开始,测试玩家之间通过区块链资产来完成一个目标。

作为奖励,玩家们在激活并传出三块灵石之一后,就有机会在秘宝室内寻找高阶战利品。

我使用PlayFab为我的后端服务推出,这让我能够快速部署关键系统,如玩家账户、库存管理和服务器端脚本等。

PlayFab是一个神奇、简单、易用的服务,如果你刚刚起步的话。他们为你处理了很多系统,并有一些奇妙的功能,如玩家管理、玩家库存、物品数据库、分析仪表板和排行榜等。

我强烈推荐PlayFab,但你的里程数可能会根据你的尝试而有所不同。

我在使用PlayFab的过程中遇到了一些问题,下面我会详细介绍其中的一些问题。在我第一次使用PlayFab的几个月里,他们做了一些重大的升级和改变,所以我遇到的一些问题现在可能已经解决了。

Enjin集成

3月29日,我公开宣布了Enjin整合,从登录到获取物品的全用户路径。

虽然使用Enjin公司的区块链SDK for Unity的区块链SDK来完成这个过程是非常快的,但你不会想通过使用SDK来进行写操作(例如,创建、发送和铸币项目)来释放你的游戏。

客户端SDK GUI

SDK包括两个主要组件:一个用于管理项目的编辑GUI,一个用于查询和突变的API。GUI使创建、编辑、修改、铸币和熔化你的项目变得非常简单。

刚开始的时候,这是我的救命恩人。

它让我可以直观地看到可用的东西和我可以做的事情,而不用直接查询GraphQL,我还不知道如何使用。

我可以在一个地方看到和编辑我的物品。

最终,你会想把这个过程转移到自动化的东西,尽管如此。虽然这是一个很好的介绍,但如果你要创建很多项目,这不是你应该长期使用的东西。

最近,Enjin更新了他们的网络控制台,加入了上述的编辑工具,所以你现在也可以直接从他们的网络面板上进行同样的操作了,这真是太棒了。

客户端SDK API

API代码是GraphQL调用的封装器,包括连接到推送器服务进行更新的代码(例如,当钱包余额更新时)。

这个API应该只在有权限限制的身份下使用。任何赋予修改能力的权限都应该被删除。

你唯一需要的视图权限是viewBalances

然后,您可以将您的登录信息输入到SDK中,它将保存这些信息,以便从您的客户端使用。

请注意,这些信息都是以纯文本形式存储在你的游戏二进制中。如果你这样做了,你会让下载你的游戏的人完全进入Enjin账户,所以要确保它被锁定。

你可以在你的游戏二进制中加密这些细节,但实际上,从游戏中还原这些细节并从游戏中恢复它们要比你意识到的要容易得多。

就我个人而言,我会警告不要这样做,因为你可能会在开发时不小心添加了你的管理员信息,忘记删除它们,并在构建中释放完全的访问权限。

你也要对Enjin进行更多的查询,因为你的服务器仍然需要查询同样的信息来验证操作,然后客户端需要再次查询。如果Enjin实现了API调用的配额,那么你可能需要在以后找到创造性的方法来减少你的客户端调用。

如果一切都在服务器上,你可以在那里添加缓存,然后返回一个快照给客户端。如果你把那个缓存存储在服务器上,而Enjin或Ethereum宕机了(在我上线的8个月里已经发生了两次),你的玩家仍然可以使用他们的物品。

我不建议使用Enjin的Unity SDK(或任何其他客户端引擎SDK)来做任何重要的事情,比如为你的游戏创建或铸币(例如,如果你为完成一个关卡向玩家发送一个物品,那么你就会发送一个物品给玩家)。

你想让你完全控制的服务器成为权威代理,也是唯一的实体来进行这些操作。

在我的案例中,我对一个玩家有两个库存:虚拟的(任何不基于区块链的物品,或者说是基于区块链的物品,坐在队列中等待发送的物品)和区块链 .

服务器查询二者,将二者结合起来,进行缓存,然后将现金发送至客户端。缓存每隔一段时间就会刷新一次,但客户端也会监控推送通道的变化。客户端在下次更新时告诉服务器;如果有变化,服务器也会对该用户的缓存进行冲洗。

GraphQL

最核心的是,Unity SDK调用Enjin的GraphQL服务。

我用Enjin的Unity SDK作为学习资源。我早期的大部分知识都来自于阅读SDK的源代码。

如果你还在等待其他的SDK,比如Unreal,我建议你直接从服务器上直接调用GraphQL开始,因为这是你最终需要做的事情。

Enjin平台。最佳实践

使用服务器

确保你的所有区块链突变操作只在安全的服务器上进行。

你永远不希望你的客户端(无论是原生的Windows、Mac、Android、iOS、Web)直接执行GraphQL调用,因为它允许任何有足够知识的人在你的客户端/游戏之外自己完成这些调用。

队列和批量发送项目

当初我在推出 "星际争霸 "活动的时候,只要玩家成功退出地下城,我就会把物品发给玩家。

这样做的效果很好,我很快就发送了数千件物品,直到Ethereum网络拥堵。

我发现你的账户上可以有大约16个待处理的交易(等待被挖矿),然后才会开始返回错误的Enjin的任何区块链相关调用。如果你没有追踪到你试图操纵的是哪些项目,你现在就没有记录可依。

据了解,失落的遗迹中这段时间丢失的物品都是在地下城的岩浆中丢失的。

每笔交易也要花钱加油,而你支付的加油量也会随着数据量的增加而增加。

那时,我是用标准的发送(光是送出物品就花了很多ETH?

相反,我建议你使用高级发送来实现所有的发送目的。您可以在一次交易中向多个地址发送多个项目。

有限制,因为交易本身的大小是有限制的,但粗略的指导是转账数组不超过100个条目。需要注意的是,如果你发送的是fungible token(FT),那么条目的数量就不重要了,但非fungible token(NFT)每个条目只能是一个。

存储退回的交易ID

几乎每一次对Enjin的GraphQL的突变调用都会返回一个transactionId。存储它很重要,因为你可以用它来查询刚才的状态。不要只把它存储在日志中,而是要把它和数据一起存储,以便以后可以用它来查询状态。

例如,如果你发出一个发送,你可以使用这个交易ID来确定发送成功,在区块链上待定,还是失败。

我在调查事务时常用的一个GraphQL查询是。

query {
 EnjinTransactions(
   id: TRANSACTION_ID_HERE,
 ) {
   id
   transactionId
   type
   state    
   error
   nonce
   token {
     id
     name
   }
   retryState
 }
}

这个查询在一次调用中返回足够多的信息,以确定错误的原因或没有错误的状态。我的大多数服务器进程都使用这个查询来确定状态。

例如,为了确定是否有人成功地完成了一个任务,我用这个查询来确定我发给玩家的任务要求的交易ID是否成功地发送到了游戏钱包。

高级发送

高级发送是真棒。你可以用它来向多人发送物品,或者向他们请求物品。我用它来实现你在Lost Relics中看到的任务。

在下面的例子中,我在一次交易中向两个不同的钱包发送2万FT的TOKENID1和1万FT的TOKENID2。

mutation advancedSend {
 CreateEnjinRequest(identity_id: SENDER_ID, type: ADVANCED_SEND, advanced_send_token_data: {
 transfers: [
 {from_id: SENDER_ID, to: "0xTARGETWALLETADDRESS1", token_id: "TOKENID1", value: "20000"},
{from_id: SENDER_ID, to: "0xTARGETWALLETADDRESS2", token_id: "TOKENID2", value: "10000"}
 ]})
{
   id
   encoded_data
 }
}

你可以将更多的项目添加到传送阵中,一次性传送更多的项目;只要确保添加的项目不要超过100个左右即可。

要申请项目,只需使用你要申请的用户的identity_id 。请注意,用户的identity_id是特定于你的平台的,他们必须已经链接了他们的钱包和批准的ENJ消费。

允许拥挤

当你在Kovan上测试时,交易发生的速度非常快。大多数时候,在Mainnet上也是这样,但有时也会出现问题。

我遇到的一些常见问题是。

  • Ethereum拥堵,气价上涨,你或你的玩家所签的交易已经不再被矿工们捡漏(因为他们签的是低气费)。
  • Enjin的系统中的错误导致他们的GraphQL系统中的交易无法更新,即使他们已经成功地处理了以下问题

要么设计你的区块链交互,使其不至于在当下发生,要么确保你有办法在处理时间超过可接受的时间时手动覆盖处理。

你肯定会想确保任何区块链交互都可以被中断,并在气价造成延迟的情况下稍后恢复。

例如,如果你允许玩家制作一件物品,那么在制作过程中应该提供足够的进度信息,如果玩家认为自己等待的时间太长,可以中断制作过程,稍后再恢复。

在失落的遗迹中,你可以通过完成任务或打开储物箱来了解这一点。

此外,设计你的服务器逻辑,允许你覆盖区块链交易的状态检查。在我的管理面板中,我提供了一个按钮,允许我强迫区块链状态检查成功。在过去的几个月里,当区块链交易被正确处理,但没有被Enjin看到时,我经常使用这个按钮。

只要确保你没有批准没有成功处理过的交易,你可以通过检查EnjinX上的交易哈希值来做。

提供这个回退让我可以手动验证交易成功,然后将任务推送到 "准备领取奖励 "状态,这样我的玩家就可以继续进行。

后台 v1: PlayFab

我最初发布的时候是用PlayFab的后台驱动的,并且相当广泛地使用了物品目录和下拉表功能。在一个传统的游戏中,有无限的项目,这个系统的效果非常好。

限量供应项目

如果你在管理有限的供应品,你可能会遇到一些和我一样的问题。

由于大部分物品的供应量有限,我需要准确地确保我送出的物品不会超过我钱包里的实际库存。如果让玩家看到他们刚刚赢得了超稀有的屠神者,却因为我的库存用完了而无法送出,那就太差劲了。

PlayFab有一个"限量版"功能,你可以为每个项目启用。这似乎正是我所需要使用的,然而他们有一个任意的限制,即100 总项目。我相信现在可能已经提高到了1000个,但如果你有任何数量的物品超过这个值,这个数字还是不够的。

这是我遇到的第一个障碍,所以我必须围绕着这个问题想出一个创造性的解决方案。为了做到这一点,我跟踪了单独的自定义数据与项目。这个自定义数据跟踪了总的和剩余的供应量。

每次我给玩家一个物品,我都会检查这个值是否降到25,如果降到了,我就会把它顶到100(如果有足够的剩余供应)。这很麻烦,但很有效,让我可以继续使用他们的系统工作。

服务器脚本

我个人比较喜欢C#。我在高中时就开始学习QBasic和后来的Visual Basic,然后当我开始在游戏行业工作的时候,我转到了C和C++。一路走来,我还学习了很多其他语言,包括那些用于网络的语言(PHP、Javascript等)。

PlayFab的服务器端脚本使用的是Javascript,虽然我知道如何用Javascript编码,但我更喜欢C#。从Unity到我的自定义工具,我的整个栈的其他部分都是C#,所以这对我来说是个缺点,但我可以忍受。

PlayFab已经在允许你执行C#方面取得了进展,我相信他们很快就会发布这个东西(目前还在私人预览阶段)。

第一个用Javascript编写的服务器端代码

PlayFab的服务器脚本的一个限制是你的脚本执行时间不能超过10秒。如果它执行了,它就会被终止----我的经验是在9.3秒之后。

虽然大多数用例永远不会接近这个极限,但我在大约一个月内就开始冲击这个极限,因为我在增加越来越多的Enjin API调用时,我开始冲击这个极限。

Enjin的GraphQL调用来自PlayFab服务器的GraphQL调用有时会根据我查询的数据量(例如,玩家的钱包里有多少物品),或者他们的服务器上是否做了新的发布,执行起来需要一秒钟的时间。把几个Enjin调用和PlayFab调用混合在一起,很快就会加起来。

如果有额外的网络打嗝,一个恩施的电话可能需要几秒钟甚至更长的时间。

当我增加了对更多的Multiverse项目的支持和更多的Enjin调用时,我发现在PlayFab的服务器脚本中编写的函数只能部分执行。

当时我不知道这个功能运行了多少,发现要想增加执行时间,唯一的办法就是升级到企业级。在几周前,我已经从免费版升级到Indie,再升级到专业版,以获得一定程度的支持,而我并不准备仅仅为了这一个功能而升级到最高层。

后台v1.5:临时包扎剂

没有办法绕过执行时间的限制,只好赶紧想办法解决。

我决定将所有的服务器逻辑和其他代码从PlayFab服务器脚本(Javascript)转换为C#代码,并将其作为网络服务在Microsoft Azure上运行。这让我可以完全控制脚本的运行时间,并意味着我仍然可以从服务器上使用PlayFab的服务。

我花了大约一个星期的时间将所有代码转换过来。我现在在自己的Azure网络服务上运行我的代码,并依靠PlayFab来处理所有的用户账户、项目、库存、排行榜等。

Backend v1.5 Sunset:再见PlayFab

在我使用PlayFab平台的过程中,我遇到了几个bug,其中包括一个影响到我正在使用的有限供应功能的关键bug。我对遇到的每一个问题都无法控制,只能等待PlayFab的支持团队的回复。

免费版和独立版只提供论坛帮助,回复时间一般需要24-36小时。对于我遇到的一些比较关键的问题,我最终升级到了专业版,因为它提供了专门的支持。不幸的是,专门的支持几乎和论坛一样,需要很长时间才能得到回复,而且他们似乎更热衷于关闭问题而不是解决问题。

我还遇到了一个长期以来的问题,即一旦某个账号上有超过2000个项目日志事件,玩家账号就不再加载。为了解决这个问题,我建议他们可以简单地增加分页支持,但这个问题一直没有得到解决,PlayFab的支持人员认为这是一个 "未来的功能请求",需要进行投票表决。

随着越来越多的玩家从他们的账户中添加和删除物品,更多的账户不再加载。加上支持问题,这对我来说是最后一根稻草。

是时候用我自己的定制方案重新开始了。

后台 v2:定制解决方案

这些年来,我写过很多后端服务,所以我知道自己有能力承担起这个庞大的任务,重现大部分的PlayFab服务。

现在是8月中旬左右的某个时候,我开始着手消除对PlayFab的依赖。我一次一个一个地重新创建了各种系统,当我很高兴它们能与PlayFab的产品相似时,我就把它们带到了网上。

我最终继续使用了Microsoft Azure,因为我在过去几年里对它的经验最多,而且他们原生支持我已经在使用的C# .Net Core堆栈。我创建了一个由Azure Sql驱动的数据库,我使用了他们的CDN、服务总线、Blob存储和应用洞察。

首先,我创建了我自己的用户认证系统,它依赖于无密码的电子邮件认证(类似于 "忘记密码 "机制的工作方式)。一旦这个系统透明地处理了认证端,我就开始了重新创建项目数据库的工作。

管理后台预览

在物品数据库顺利运行后,我又增加了玩家库存支持、玩家账号管理、冒险追踪、排行榜、商店和管理后台等小服务。

9月17日,我成功地推出了新的后台,并对网站进行了全面刷新。经过一些小的修复后,它的运行情况一直很好,我在此基础上继续完善。

行政小组

有些开发者会简单地设置直接访问数据库,运行SQL查询来读取和写入数据,管理账户,这就足够了。但我,更喜欢减少人为错误的成分,创建任何人都可以使用的接口。

我创建了一个简单的管理面板,以方便这一点,并给我一个控制面板来管理和管理丢失的文物。

我使用管理面板来创建我的游戏项目(包括区块链项目),设置新的事件、冒险和任务,所有这些都不需要执行手工制作的SQL命令,并确保在输入数据时遵循特定的规则。

编辑项目

项目待定区块链创建

如果系统检测到某个项目是区块链项目,但还没有创建,我可以直接在我的管理面板上创建。

当我点击 "Create Blockchain Item "按钮时,该项目被添加到队列中进行处理。它被一个服务器的Web Job接收到,它将向Enjin发出调用,用输入的值创建令牌,设置元数据,并对所有的实例进行铸币。

我强烈建议你为自己的项目设置这样的自动化系统,因为它可以消除人为错误的成分。

区块链发送队列

在Stampede活动之后,我意识到我需要一个队列,以便在以后的时间处理我的交易。队列的好处是能够在你发送物品前检查几个前提条件。

我在发送物品前会检查以下内容:

  1. 是否启用了发送队列?如果没有,请延迟发送。
  2. 我们上次发送的交易,是否成功完成了?如果没有,请延迟发送。
  3. 油价是否合理?如果不是,就推迟发送。
  4. 是否至少有100个以上的唯一性的物品要送出(即整批送出),或者最老的添加物品是否大于12小时?如果不是,则延迟发送。

如果上述前提条件全部满足,那么我就会把一批批的东西送出去。

我将结果的transactionId存储起来,并定期检查它是否成功。

第4步重复进行,直到不再有满额的批次,或者是30分钟左右后,交易状态没有变化。

整个过程作为Azure上的Web Job每隔几分钟就会运行一次。

用Unity制造

我以前在游戏行业工作的时候,每家公司都有自己的内部游戏引擎。

每台发动机都有其自身的优点和缺点,通常受制于各自公司员工的知识和专业知识。

如果你换了公司,你所拥有的大部分发动机知识现在都是无用的,因为下一家公司的发动机与你之前使用的发动机大相径庭。这段时间,整个行业内普遍没有执行标准,每个公司都是各自为政。

Unity已经改变了这一点,并增加了急需的竞争和精细度--这也拉低了虚幻等引擎的价格。

那时,我工作的公司从来不会授权给其他引擎,因为授权费用几乎会消耗游戏预算的三分之一。现在,这是一个完全不同(更实惠)的故事。

资产商店

我的职业是一名程序员,但我也喜欢艺术、音频和设计。

Unity引擎的易用性,加上他们的Asset Store,让我能够从头开始快速创建Lost Relics--全部由自己完成。

这种易用性和威力在10年前是闻所未闻的。

我从Unity资产商店中策划了很多艺术资产,然后对它们进行定制,以适应Lost Relics宇宙。这对独立开发者来说是一个常见的过程,因为它提供了如此强大的生产力提升。

编辑部

我依靠着团结,将《失落的遗迹》的世界带入了现实。

如果你曾经写过引擎,你就会知道Unity要为你处理多少事情(提示:很多)。我设计关卡,创建游戏的代码,并在Unity编辑器中预览这一切。

Unity做了很多繁重的工作,这样我就不用再去做了,我可以专注于游戏,为大家创造引人入胜、有趣的游戏体验。

如果你已经走到这一步,谢谢你的阅读。

如果你也是一个正在踏上类似旅程的开发者,欢迎加入到这个运动中来!

如果你是失落的遗迹玩家,感谢你能参与到这个旅程中来。

进化您的游戏

使用你所熟知和喜爱的工具,以先进的设计、智能增长和更好的货币化来锻造区块链游戏。

开始

进化您的游戏

使用你所熟知和喜爱的工具,以先进的设计、智能增长和更好的货币化来锻造区块链游戏。

谢谢你!请检查您的电子邮件。
错误

您可能还喜欢