游戏机器学习课程文档

让我们构建我们的智能机器人 NPC 演示 🤖

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

让我们构建我们的智能机器人 NPC 演示 🤖

步骤 0:获取项目文件

您可以在 👉 此处 找到完整的 Unity 项目

步骤 1:安装 Unity Sentis

Sentis 文档 👉 https://docs.unity3d.org.cn/Packages/com.unity.sentis@latest

  1. 打开 Jammo 项目

  2. 点击 Sentis 预发布包 或转到窗口 > 包管理器,点击 + 图标,选择“按名称添加包…”,然后输入“com.unity.sentis”

Sentis

将版本设置为 1.3.0

  1. 按下添加按钮以安装包。
Sentis

步骤 2:安装 Sharp Transformers 💪

Sharp Transformers 是一个 Unity 插件,用于**在 Unity 游戏中运行 Transformer 🤗 模型**。

我们需要为标记化步骤执行此操作。

转到“窗口” > “包管理器”以打开包管理器。

点击左上角的“+”,然后选择“从 git URL 添加包”。

输入此存储库的 URL 并点击“添加”:https://github.com/huggingface/sharp-transformers.git

步骤 3:构建推理过程 🧠

Sentis 文档 中所述,要使用 Sentis 在 Unity 中运行神经网络,我们需要按照以下步骤操作。

  1. 使用 Unity.Sentis 命名空间。

  2. **加载神经网络**模型文件。

  3. **为模型创建输入**。

  4. **创建推理引擎**(一个工作器)。

  5. **使用输入运行模型**以推断结果。

  6. 获取结果.

在我们的例子中,我们将在**SentenceSimilarity.cs**文件中执行所有这些操作,该文件将附加到我们的机器人上。

在唤醒时,我们

  1. 加载我们的神经网络。

  2. 创建一个**推理引擎**(一个工作器)。

  3. **创建一个运算符**,它将允许我们对张量执行运算。

Sentis Similarity

我们有三个函数

  1. 编码:获取我们的玩家输入(文本),**将其标记化并嵌入**。
Sentis Similarity
  1. 句子相似度得分:**计算输入嵌入(用户输入的内容)与比较嵌入(机器人动作列表)之间的相似度得分**
Sentis Similarity
  1. 排名相似度得分:给定玩家输入,获取**最相似的动作**及其索引
Sentis Similarity

步骤 4:构建机器人行为 🤖

我们需要定义**机器人的行为**。

我们的想法是,我们的机器人有不同的可能动作,并且动作的选择**将取决于最相似的动作**。

我们首先需要定义有限状态机,这是一种简单的**经典 AI 技术,其中每个状态定义特定的行为**。

然后,我们将创建效用函数**,它将选择状态,从而选择要执行的一系列动作**。

状态机 🧠🤖

在状态机中,**每个状态都表示一种行为**,例如,移动到一列、打招呼等。根据代理所在的**状态,它将执行一系列动作**。

在我们的例子中,我们有 7 个状态

Jammo State Machine

我们需要做的第一件事是创建一个名为 State 的枚举,其中包含每个可能的 State

Jammo State Machine

因为我们需要不断检查状态,所以我们使用 switch 语句系统将状态机定义到 Update() 方法中,其中每个 case 都是一个状态

Jammo State Machine

对于每个状态 case,我们定义代理的行为,例如在我们的 Hello 状态下,机器人必须向玩家移动,正确地面对他,然后启动其 Hello 动画,然后返回到空闲状态

Jammo State Machine

我们现在已经定义了每个不同状态的行为。这里的魔法将来自这样一个事实,即语言模型将定义哪个状态最接近玩家的输入。在效用函数中,我们调用此状态。

让我们定义效用函数 📈

我们的动作列表如下所示

Utility
  • 句子将嵌入 AI 模型中。

  • 动词是状态

  • 名词(如果有)是要交互的对象(柱子、立方体等)。

此效用函数将选择与玩家输入文本具有最高相似度得分的句子关联的动词和名词。

但首先,为了消除许多奇怪的输入文本,我们需要一个相似度得分阈值

例如,如果我说“看看所有的兔子”,我们没有任何可能的动作是相关的。因此,我们不会选择得分最高的动作,而是会调用 Puzzled 状态,这将使机器人的动画表现出困惑的表情。

Jammo rabbits

如果得分更高,那么我们将获取对应于状态的动词以及(如果有)名词(目标对象)

我们设置与动词对应的状态。这将激活与之对应的行为。

Utility

就是这样,现在我们准备与我们的机器人互动了!

步骤 5:让我们与我们的机器人互动 🤖

在此步骤中,您只需要点击编辑器中的播放按钮。然后您可以发出一些指令并查看结果

这很好!但最好的学习方法是尝试事物,破坏事物并修改演示。

(可选)改进游戏:让我们添加一个新动作

添加新动作非常容易。让我们举个例子

  • 复制 YellowPillar 游戏对象并移动它

  • 将名称更改为 GreenPillar

  • 创建一个新材质并将其设置为绿色

  • 将材质放置在 GreenPillar 上

现在我们已经放置了新的游戏对象,我们需要将此可能性添加到句子中,并点击 Jammo_Player。

在动作列表中,点击加号按钮并填写此新的动作项

Utility
  • 将 Go 添加到绿色列
  • GoTo
  • GreenColumn

就是这样!您可以轻松迭代并向您的游戏添加更多动作

再次提醒,不要忘记测试相似度阈值,以查看您是否需要增加或降低它

< > 在 GitHub 上更新