ML 游戏开发课程文档

让我们构建我们的智能机器人 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 预发布包 或转到 Window > Package Manager,点击 + 图标,选择“Add package by name…”,然后输入 “com.unity.sentis”

Sentis

将版本设置为 1.3.0

  1. 按下 Add 按钮安装包。
Sentis

步骤 2:安装 Sharp Transformers 💪

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

我们需要这样做来进行分词步骤。

转到 “Window” > “Package Manager” 打开 Package Manager。

点击左上角的 “+” 并选择 “Add package from git URL”。

输入此仓库的 URL 并点击 “Add”:https://github.com/huggingface/sharp-transformers.git

步骤 3:构建推理过程 🧠

正如 Sentis 文档 中所述,要使用 Sentis 在 Unity 中运行神经网络,我们需要遵循以下步骤。

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

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

  3. 为模型创建输入

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

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

  6. 获取结果.

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

在 awake 中,我们

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

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

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

Sentis Similarity

我们有三个函数

  1. Encode:接受玩家输入(文本),对其进行分词并嵌入
Sentis Similarity
  1. SentenceSimilarityScores计算输入嵌入(用户输入的内容)与比较嵌入(机器人动作列表)之间的相似度得分
Sentis Similarity
  1. RankSimilarityScores:根据玩家输入,获取最相似的动作及其索引
Sentis Similarity

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

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

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

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

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

状态机 🧠🤖

在状态机中,每个状态代表一种行为,例如,移动到一根柱子,说你好等等。根据智能体所处的状态,它将执行一系列动作

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

Jammo State Machine

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

Jammo State Machine

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

Jammo State Machine

对于每个状态 case,我们定义了智能体的行为,例如,在我们的 Hello 状态中,机器人必须向玩家移动,正确地面对他,然后启动其 Hello 动画,然后返回到 Idle 状态

Jammo State Machine

我们现在已经定义了每个不同状态的行为。这里的神奇之处在于,语言模型将定义哪个状态最接近玩家输入。在效用函数中,我们调用此状态。

让我们定义效用函数 📈

我们的动作列表如下所示

Utility
  • 句子是将在 AI 模型中嵌入的内容。

  • 动词是状态

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

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

但首先,为了去除大量奇怪的输入文本,我们需要有一个相似度得分阈值

例如,如果我说 “Look at all the rabbits”,我们没有一个可能的动作是相关的。因此,我们不会选择得分最高的动作,而是调用 Puzzled 状态,它将使用困惑的动画来动画机器人。

Jammo rabbits

如果分数较高,那么我们将获得对应于状态的动词和名词 (goalObject)(如果有)

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

Utility

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

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

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

这很棒!但最好的学习方式是尝试事物、破坏事物和修改演示。

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

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

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

  • 将名称更改为 GreenPillar

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

  • 将材质放置在 GreenPillar 上

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

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

Utility
  • 添加 去绿色柱子
  • GoTo
  • GreenColumn

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

再次,不要忘记测试相似度阈值,看看您是否需要增加或减少它

< > 在 GitHub 上更新