云 AI 迷你游戏

迷你游戏引入了一种有趣的方式来赢得额外奖励或推进游戏进程。本示例演示了如何将云代码与其他 UGS 软件包一起使用,通过在井字棋迷你游戏中实现一个与玩家对战的简单人工智能对手来验证游戏玩法。

先决条件

要使用此示例用例,您必须下载并安装 UGS 用例项目到您的 Unity 项目中。

概览

在本示例中,每个迷你游戏都从一个随机玩家(50% 人类,50% AI)开始,并持续进行,直到一个玩家成功地将 3 个棋子连成一行(获胜)或棋盘已满(平局)。玩家获胜可获得 100 个金币,平局可获得 25 个金币,输了则什么也得不到。

要查看此用例的实际效果,请打开示例菜单并导航到“**云 AI 迷你游戏**”。要直接打开此场景并与用例交互

  1. 在 Unity 编辑器的“**项目**”窗口中,选择“**资源**”>“**用例示例**”>“**云 AI 迷你游戏**”,然后双击 `CloudAIMiniGameSample.unity` 以打开示例场景。
  2. 按“**播放**”进入播放模式。

初始化

`CloudAIMiniGameSceneManager.cs` 脚本在其 `Start` 函数中执行以下初始化任务

  1. 初始化 Unity 游戏服务。
  2. 使用身份验证服务匿名登录玩家。如果您之前初始化过任何其他示例场景,则身份验证将使用您缓存的玩家 ID,而不是创建新的 ID。
  3. 从经济服务中检索并更新玩家的货币余额。
  4. 调用 `CloudAi_GetState.js` 云代码脚本从云存档服务中检索当前游戏状态,并更新当前井字棋游戏的游戏状态或创建一个新的游戏状态。

功能

当您单击“**新游戏**”按钮(或游戏进行中时单击“**认输**”按钮)时,将发生以下情况

  1. 按钮的 `OnClick` 方法调用 `CloudAi_StartNewGame.js` 云代码脚本以检查游戏是否正在进行中(`isGameOver` 变量为 `false`)。
  2. 如果游戏正在进行中,则玩家认输将被判负。
  3. 然后,该脚本会创建一个新游戏,清除棋盘并随机选择玩家或 AI 先走。
  4. 如果选择 AI 先走,则 AI 会在棋盘上的随机位置放置一个棋子。
  5. 新的游戏状态将返回给客户端。

当游戏正在进行中时,您可以单击游戏图块以尝试放置棋子。将发生以下情况

  1. 客户端调用 `CloudAi_ValidatePlayerMoveAndRespond.js` 云代码脚本,将您的点击坐标传递给该脚本。

  2. 根据坐标输入验证移动的有效性。如果游戏结束或图块已被占据,则移动无效。

  3. 如果移动有效,则脚本会更新游戏状态以反映新的棋子放置,然后将棋子放置在客户端游戏板上。

  4. 脚本会检查新移动是否触发游戏结束条件(三子成一线或棋盘已满)。

  5. 如果游戏尚未结束,则脚本会根据以下逻辑放置 AI 棋子

    • 如果 AI 可以获胜,它总是会获胜(例如,如果 AI 在一行中有 2 个棋子,并且有一个空格,它就会进行获胜的走法)。
    • 如果玩家有 2 个棋子连成一行,则 AI 总是会阻止玩家的获胜走法。
    • 如果 a 和 b 都不成立,则随机走法。
  6. 如果游戏结束,则脚本会调用经济服务,根据检测到的获胜条件直接分发奖励。如果玩家获胜,则获得 100 个金币。如果棋盘已满,则获得 25 个金币。

云存档服务使用 `CLOUD_AI_GAME_STATE` 密钥字符串保存完整游戏状态的 JSON 记录。关联的值存储每个玩家的连续移动、整体状态、游戏结束标志、玩家回合、这是新游戏还是移动,以及获胜、失败和平局的持久计数器。

“**重置游戏**”按钮用于演示完整的 juego 周期。在第一局游戏开始时(或手动重置游戏时),云代码会从云存档中删除 `CLOUD_AI_GAME_STATE` 密钥,并调用 `CloudAi_GetState.js` 云代码脚本将金币余额重置为 0,创建一个所有计数器都设置为 0 的新存档状态,生成一个新的游戏棋盘,并选择一个随机的起始玩家。

示例云存档游戏状态

AI 先走的新的 CLOUD_AI_GAME_STATE

{
  "winCount":1,
  "lossCount":1,
  "tieCount":0,
  "playerPieces":[],
  "aiPieces":[{"x":0,"y":1}],
  "isNewGame":true,
  "isNewMove":true,
  "isPlayerTurn":true,
  "isGameOver":false,
  "status":"playing"
}

玩家赢得游戏的 CLOUD_AI_GAME_STATE

{
  "winCount":2,
  "lossCount":1,
  "tieCount":0,
  "playerPieces":[{"x":0,"y":0},{"x":0,"y":2},{"x":2,"y":2},{"x":1,"y":1}],
  "aiPieces":[{"x":0,"y":1},{"x":2,"y":0},{"x":1,"y":2}],
  "isNewGame":false,
  "isNewMove":false,
  "isPlayerTurn":false,
  "isGameOver":true,
  "status":"playerWon"
}

设置

要求

要复制此用例,您需要在项目中使用以下Unity 软件包

软件包作用
身份验证自动将玩家作为匿名用户登录,以跟踪其服务器端数据。
云代码生成随机游戏、验证游戏逻辑、执行 AI 回合,并根据游戏结果授予经济奖励。
云存档存储活动游戏状态。
部署提供用于部署云服务资产的统一界面。
经济在运行时检索起始和更新的货币余额。

要在您的游戏中使用这些服务,请在Unity 云仪表板中为您的组织和项目激活每个服务。

Unity 云服务配置

要在您自己的 Unity 项目中复制此示例场景的设置,请配置以下项目

  • 云代码脚本
  • 经济项目

要配置这些项目,您可以使用部署软件包,或者使用 Unity 云仪表板手动输入它们。建议的最佳做法是使用部署软件包,因为它可以大大加快此过程。

使用部署软件包

要使用部署软件包部署配置

  1. 打开部署窗口
  2. 签入“**通用**”和“**云 AI 迷你游戏**”。
  3. 单击“**部署选择**”。

这将部署所有必需的项目。

使用 Unity 云仪表板

您可以使用Unity 云仪表板按项目和环境手动配置您的服务。请参阅以下部分以配置此示例。

云代码

在 Unity 云仪表板中发布以下脚本

脚本参数说明项目中的位置
CloudAi_GetState如果游戏未在进行中,则创建并保存一个随机游戏。如果这是玩家的第一局游戏(或他们在单击“**重置游戏**”按钮后的第一局游戏),它还会将金币数量重置为 0,然后返回当前游戏状态。Assets/Use Case Samples/Cloud AI Mini Game/Cloud Code/CloudAi_GetState.js
CloudAi_ValidatePlayerMoveAndRespondcoord

要添加的玩家棋子的 [x,y] 坐标。
验证玩家请求的移动,并根据鼠标单击的坐标将其添加到游戏状态中。更新游戏状态后,它会检查游戏结束条件。如果游戏尚未结束,它会放置一个 AI 棋子,然后再次检查游戏结束条件,并将最终更新后的状态返回给客户端。如果玩家获胜或平局,它会使用经济服务直接奖励金币。Assets/Use Case Samples/Cloud AI Mini Game/Cloud Code/CloudAi_ValidatePlayerMoveAndRespond.js
CloudAi_StartNewGame单击“**新游戏**”或“**认输**”按钮时调用,以在认输的情况下为玩家分配失败,并生成一个随机起始玩家的新随机游戏。Assets/Use Case Samples/Cloud AI Mini Game/Cloud Code/CloudAi_StartNewGame.js

注意Cloud Code 文件夹中包含的 Cloud Code 脚本是本地副本,因为您无法查看示例项目的仪表板。 对这些脚本的更改不会影响此示例的行为,因为它们不会自动上传到 Cloud Code 服务。

经济

在 Unity 云面板中配置以下资源

资源类型资源名称ID说明
货币硬币硬币(大写)赢得比赛和平局获得的货币。