放置点击游戏
在实时放置点击和社交游戏中(例如,农场或城市建造游戏),常见的考虑因素包括
- 如何在并非始终运行的游戏中模拟实时活动。
- 如何使模拟在云端进行,以确保所有玩家的游戏都能正确更新,而无论时区或玩家设备上的日期和时间有任何修改。
此示例用例展示了如何在限制调用 Unity 游戏服务(这会导致限制问题或成本增加)的同时解决这两个挑战。
在此示例中,玩家使用资源(水)购买水井,每个水井每秒生产 1 个单位的水。
先决条件
要使用此示例用例,您必须下载并安装 Unity 项目中的 UGS 用例项目。
概述
要查看此用例的实际效果,请打开示例菜单并导航到**放置点击游戏**。要直接打开此场景并与用例进行交互
- 在 Unity 编辑器的**项目**窗口中,选择**资产**>**用例示例**>**放置点击游戏**,然后双击
IdleClickerSample.unity
打开示例场景。 - 按**播放**进入播放模式。
IdleClickerSceneManager.cs
脚本在其 Start
函数中执行以下初始化任务
初始化 Unity 游戏服务。
使用身份验证服务以匿名方式让玩家登录。如果您之前初始化过任何其他示例场景,则身份验证将使用您缓存的玩家 ID,而不是创建新的 ID。
从经济服务中检索并更新玩家的货币余额。
检索或创建当前游戏状态。
**注意**:如果游戏已经在进行中,则此步骤会根据自上次更新游戏状态以来所有水井产生的水量来授予水。
为游戏区域中的可用图块启用按钮点击功能。
功能
放置水井
您可以点击游戏区域中的任何空闲图块,花费 500 水来放置一个水井。云代码会验证您是否尝试将水井放置在空闲图块中。当您点击图块时,会发生以下情况
- 云代码会计算自上次更新以来生成的水量,然后调用经济服务将该金额授予玩家的货币余额(请参阅下面的实时资源更新部分)。
IdleClicker_PlaceWell.js
云代码脚本会检查请求的图块是否被占用。- 如果图块可用,该脚本会尝试通过经济服务进行虚拟购买,这将扣除 500 个硬币,并根据交易结果返回成功或失败。
- 如果虚拟购买成功,云代码会使用新添加的棋子更新游戏状态,并将新状态返回给客户端。
如果虚拟购买失败,云代码会向客户端抛出一个异常,然后客户端会显示一个弹出消息,解释发生了什么。
实时资源更新
在两次移动之间,当玩家正在查看游戏场景但未进行交互时,客户端会模拟水的生产并相应地更新货币 HUD。每个水井每秒生产一个单位的水。由于此示例游戏旨在实时进行,因此每当客户端调用云代码时,它都会检查当前时间并计算自上次生产周期以来每个水井累计生产了多少水。每次游戏加载或玩家尝试放置水井时,都会发生以下情况
- 为了确定经过了多长时间,云存档会存储每个水井上次生产水的时间戳,以及包含障碍物位置、水井位置和上次更新时间的完整游戏状态。
- 在经济服务授予适当数量的水后,每个水井的时间戳都会更新,并且完整更新后的状态会保存回云存档。
**注意**:由于货币 HUD 中显示的水量是由客户端模拟的,并且在重新加载场景或玩家尝试放置水井之前不会与服务器实际同步,因此其服务器端值通常看起来不准确。
虚拟购买
此示例说明了如何通过经济服务进行虚拟购买。在这种情况下,购买一个水井需要花费 500 水,但是与大多数虚拟购买不同,购买本身实际上并没有授予任何东西。相反,虚拟购买会消耗交易成本(500 水)并使用相应图块中的新水井更新游戏状态。云存档存储完整的游戏状态,包括水井和障碍物的位置。
**注意**:该服务仅在确认空间为空后才会尝试交易。
设置
要求
要复制此用例,您需要在项目中使用以下Unity 包
包 | 作用 |
---|---|
身份验证 | 自动将玩家作为匿名用户登录,以在服务器端跟踪他们的数据。 |
云代码 | 通过放置三个随机障碍物并将起始水货币设置为 2000 来设置新游戏的游戏状态。它还会验证移动、根据实时生产授予水,并根据虚拟购买更新游戏状态。 |
云存档 | 存储障碍物和水井的更新后的游戏状态(包括上次生产时间)。云代码会直接检查和更新这些值。 |
部署 | 提供用于部署云服务资产的统一接口。 |
经济 | 在运行时检索玩家的起始和更新后的货币余额。 |
要在您的游戏中使用这些服务,请在Unity 云仪表板中为您的组织和项目激活每项服务。
Unity 云服务配置
要在您自己的 Unity 项目中复制此示例场景的设置,请配置以下项目
- 云代码脚本
- 经济项目
要配置这些项目,您可以使用部署包,或者使用 Unity 云仪表板手动输入。建议的最佳做法是使用部署包,因为它可以大大加快此过程。
使用部署包
要使用部署包部署配置
- 打开部署窗口。
- 签入**通用**和**放置点击游戏**。
- 点击**部署选择**。
这将部署所有必要的项目。
使用 Unity 云仪表板
您可以使用Unity 云仪表板按项目和环境手动配置您的服务。请参阅以下部分来配置此示例。
云代码
在 Unity 云仪表板中发布以下脚本
脚本 | 参数 | 说明 | 位置 |
---|---|---|---|
IdleClicker_GetUpdatedState | 无 | 如有必要,创建一个随机游戏,更新自上次调用以来的游戏状态(包括授予任何必要的水),并将状态返回到云存档。 | Assets/Use Case Samples/Idle Clicker Game/Cloud Code/IdleClicker_GetUpdatedState.js |
IdleClicker_PlaceWell | coord 要添加到游戏区域的新水井的 [x,y] 坐标。 | 更新自上次服务器调用以来的货币余额,验证玩家的操作,使用 Economy 服务虚拟购买来“购买”新的水井,并适当地更新游戏状态(例如,将水井添加到游戏面板中)。 | Assets/Use Case Samples/Idle Clicker Game/Cloud Code/IdleClicker_PlaceWell.js |
注意:Cloud Code
文件夹中包含的 Cloud Code 脚本是本地副本,因为您无法查看示例项目的仪表盘。 对这些脚本的更改不会影响此示例的行为,因为它们不会自动上传到 Cloud Code 服务。
经济
在 Unity Cloud 仪表盘中配置以下资源
资源类型 | 资源名称 | ID | 说明 |
---|---|---|---|
货币 | 水 | WATER | 在新游戏开始时授予,在虚拟购买中消耗以放置新的水井,并且每秒钟为游戏场上每个水井授予。 |
此外,为战斗通行证配置以下虚拟购买
虚拟购买名称 | ID | 本次购买获得 | 本次购买花费 |
---|---|---|---|
放置水井 | IDLE_CLICKER_GAME_WELL | 无 * | 水 (500) |
* 水井本身不是通过虚拟购买获得的;Cloud Code 在交易成功后直接将其添加到游戏状态。