2小时内学会制作AI驱动的3D游戏——无需编程。

代码片段的整体流程(可作为生成代码的提示词):

1. 玩家移动逻辑和UI生成

  1. GameLogic 代表游戏的核心管理组件。它接收所有游戏内事件,并将其分发到适当的子系统,有效减少代码耦合。
  2. 当玩家靠近一个包含BoxCollider的框架时,其附带的Transponder组件会自动检测到交互,并将玩家靠近事件传递给GameLogic组件。作为响应,UIFactory会实例化一个用于用户输入的UI面板。
  3. 此UI面板包含InputDialog组件,它监听玩家的键盘输入。当玩家第一次按下回车键时,输入框被激活并捕获键盘焦点。当玩家输入完毕并再次按下回车键时,输入作为事件提交给GameLogic
  4. 当玩家离开包含BoxCollider的框架时,UI面板会立即销毁。

2. 模型生成和骨骼映射(由TripoSDK提供)

  1. GameLogic组件接收到玩家的提示词输入后,它会将提示词传递给TripoClient组件(注意:必须事先提供有效的TripoAPIKey)。
  2. TripoClient调用TripoAPI组件将提示词发送到Tripo服务器。在此过程中,TripoAPI组装请求,发送请求,并开始定期轮询服务器以检查更新。一旦成功,玩家会从Tripo服务器收到一个用于生成模型的TaskID。然后,此TaskID用于请求骨骼生成。
  3. 绑定(Rigging)过程完成后,TripoAPI将模型的下载URL返回给TripoClientTripoClient随后通过glTFfast插件加载并解析GLB格式模型。
  4. 接下来,RuntimeHumanoidAvatarBuilder组件被挂载到模型上。此组件将GLB模型的骨骼映射到Unity的Humanoid Avatar系统,从而实现动画重定向。
  5. 最后,TripoClient在场景中实例化模型。此时,开发者可以使用现有的人形动画资源来驱动新生成的模型。

3. 控制权转移

  1. GameLogic组件监听玩家的键盘输入,以在玩家和生成的模型之间动态切换控制。具体来说,它会调整摄像机优先级并重新分配ThirdPersonController的控制目标。
  2. 当玩家按下F键时,控制权从玩家角色转移到模型,允许玩家操作模型。再次按下F键会将控制权返回给玩家。
  3. 根据生成的模型,其大小可能有所不同;从极大到极小——这使得独特的游戏互动成为可能,并允许玩家穿过不同的障碍物。
  4. 此外,模型的出现可以轻松互换,有效支持游戏中低成本的角色自定义和皮肤系统。

整体代码逻辑:

主要游戏对象(GameObject)

具体实现步骤:

Unity 版本:2022.3.55

源代码和场景路径: Assets-LowPoly Environment Pack - Demo - Demo1

1. 项目设置和资源导入:

  1. 创建新项目

    1. 打开Unity,点击“New Project”。
    2. 选择URP(Universal Render Pipeline)模板。
    3. 将项目命名为TripoRuntimeTutorial,然后点击“Create”。
  2. 导入所需资源包

请打开浏览器并访问 Unity Asset Store。搜索并下载以下免费包(也包含在提供的项目文件中):

添加到“My Resources”,并在后续弹出的窗口中点击“Open in Unity”并下载。

下载每个包后,前往 Unity > Assets(位于 Unity 菜单顶部)> Import Package > Custom Package,然后逐个导入。在每个提示中点击“Import”。

  1. 将材质转换为URP

一些导入的材质可能显示为粉红色(表示着色器问题)。要进行转换:

  • 过滤或选择场景中所有显示为粉红色的模型。
  • 然后导航到 Editor > Rendering > Materials,并将它们转换为UPR兼容的材质。
  1. 安装glTFast依赖项(用于加载GLB模型)

选项1:通过Git安装(需要本地Git环境)

选项2:从Tripo官网下载,其中也包含glTFast插件。

  • 访问Tripo主页并进入“Resources”部分。
  • 下载Unity插件,其中已包含glTFast依赖项。
  • 按照包中包含的教程视频进行安装说明。
  1. 打开演示场景
  • 在Unity项目窗口中,导航到:Assets > LowPoly Environment Pack > Demo > Demo1
  • 双击Demo1将其打开。

设置自定义环境:

  • 将Assets > ithappy文件夹中的坦克、岩石或树木等资源拖入场景。
  • 现在您可以在环境中自由移动玩家。
  1. 添加玩家相关预制体(prefab)

导航到:Assets > StarterAsset > ThirdPersonController > Prefabs

将以下三个预制体拖到Hierarchy面板中:

  • MainCamera
  • PlayerFollowCamera
  • PlayerArmature
  1. 设置摄像机参数
  • 选择场景中的PlayerFollowCamera
  • 在属性面板(Inspector)中,找到CinemachineVirtualCamera组件。
  • FollowLook At都设置为PlayerCameraRoot(注意:可在PlayerArmature的子组件中找到)。

上述设置使用Unity提供的第三人称控制器脚本。此时,点击Unity工具栏中的播放按钮,您可以使用WASD键控制角色的移动。角色和摄像机现在应该会相应地移动和调整!

玩家靠近时显示提示面板

当玩家靠近特定对象时,应出现一个UI输入面板。当玩家离开时,面板应消失。

  1. 创建触发区域
  • 在 Assets > ithappy > Military FREE > Perfab 目录中,选择一个模型(例如,一辆坦克)。
  • 右键单击模型,选择 Create Empty Child,然后将其重命名为 Trigger。
  • 选择 Trigger 对象,进入 Inspector,点击 Add Component,并添加一个 Box Collider。
  • 勾选 Is Trigger 选项。
  • 点击 Edit Collider,并在 Scene 视图中调整其手柄,将碰撞器缩放到模型大小的两倍,覆盖其周围区域。
  1. 创建触发事件脚本
  • 在 Project 面板中,右键单击 Assets 文件夹 > Create > C# Script,将其命名为 Transponder,并用 Cursor 打开脚本。
  • 此脚本应检测玩家何时进入或退出碰撞器,并将消息发送到我们的 GameLogic 组件。在 Cursor 中选择模型并输入我们的参考提示词:

请生成一个名为 Transponder 的 Unity C# 脚本,当带有“player”标签的 GameObject 进入碰撞器时触发 OnPlayerEnter,当玩家退出时触发 OnPlayerExit。

  • 保存脚本并将 Transponder 组件拖到场景中的 Trigger 对象上。
  1. 游戏逻辑管理

在场景中右键单击 > Create Empty,将其重命名为 GameLogicManager(作为逻辑容器)。

  • 在 GameLogicManager 下,再创建一个空子对象并将其命名为 GameManager。
  • 创建一个名为 GameManager 的新脚本,它将处理场景的核心逻辑。

我们引用 Transponder 组件,然后监听玩家进入或退出时的事件。参考提示词如下:

请生成一个名为 GameManager 的 Unity C# 脚本,监听 Transponder 实例的 OnPlayerEnter 和 OnPlayerExit 事件。在 OnPlayerEnter 时,使用 UIFactory 脚本实例化一个 UI 提示预制体。在 OnPlayerExit 时,销毁此 UI 预制体。

保存脚本后,将 GameManager 脚本拖到 GameManager 对象上,并将 Transponder 组件拖到 Transponder 字段中。这样就完成了对玩家进入和退出事件的监听。

  1. 创建UI面板预制体(Prefab)

在 Hierarchy 中,右键单击 > UI > Panel,创建一个新面板。

  • 在面板下添加2个子组件:

    • Text(用于显示提示说明)
    • InputField(用于接收玩家输入)
  • 使用 Game 视图作为预览,调整布局和定位。

  • 完成后,将整个 Panel 对象拖到 Assets 文件夹中以创建预制体。

    • 将其命名为 InputDialogPrefab。

注意:如果您使用的是 TextMeshPro,请确保分配一个兼容中文的字体,例如 NotoSansSC SDF,以避免文本中出现方块字符。

  1. 创建InputDialog脚本:处理输入逻辑
  • 创建一个名为 InputDialog 的 Unity C# 脚本。

参考提示词:

  • 请生成一个名为 InputDialog 的 Unity C# 脚本,用于管理基于 TMP 的 UI 对话框。
  • 它应该包含一个用于提示的 TMP_Text 和一个用于输入的 TMP_InputField。
  • 第一次按下 Enter 键时:激活输入框并禁用玩家的移动控制器(例如,ThirdPersonController)。
  • 第二次按下 Enter 键时:提交输入,重新启用移动,并销毁对话框。
  • 保持输入焦点直到输入有效。

将 InputDialog 组件挂载到 InputDialogPrefab。将相应的 Text 和 InputField 对象拖到组件的相应字段中(Dependencies)。

  1. 创建 UIFactory 脚本:实例化 UI 面板

创建一个名为 UIFactory 的新 C# 脚本

参考提示词:

  • 请生成一个名为 UIFactory 的 Unity C# 脚本,它遵循工厂模式来实例化 UI 对话框。
  • 给定一个 UI 预制体、一个位置和一个旋转,在给定的变换处实例化预制体并返回其 InputDialog 组件。

此组件作为中间件,将 UI 创建逻辑与游戏事件处理解耦。

  1. 相关组件依赖

仔细检查所有组件依赖是否已正确分配。

  • 场景中的 PlayerArmature 对象的 Tag 应设置为“Player”。

在 GameManager 对象中,分配:

  • Transponder 字段,使用 Trigger 对象的 Transponder 脚本。
  • UIFactory 字段,使用 GameLogicManager 对象上的 UIFactory 组件。

测试:点击 Unity 中的“Play”。

  • 靠近带有触发器的对象——输入面板应该出现。
  • 当您离开时,面板应该自动消失。

注意:我们的源文件为面板的生成位置设置了固定值。根据您选择的 Trigger 的 Transform 属性修改此值。或者,您可以将 UI 预制体的 Canvas > RenderMode 设置为 ScreenSpace - Overlay,这样 UI 将在屏幕空间数据中渲染,而不会进入世界空间。

将提示词提交到 TripoAPI

目前,我们还无法实时向 Tripo 服务器提交提示。但是,用于提示提交、网络请求、模型生成、骨骼绑定、映射、适配器和动画重定向的必要代码已经准备就绪。这些脚本将在未来的更新中完全集成到 Tripo for Unity 插件中。(注意:请确保您的场景中存在 UIEvent 系统,否则 UI 将不会响应!)

  1. 导入 Tripo 插件脚本

在 Unity 项目面板(通常在左侧)中,从您的下载文件夹中找到源文件 TripoClient.csTripoAPI.csRuntimeHumanoidAvatarBuilder.cs

  • 将它们拖到 Assets/Scripts 文件夹中。

以下是每个脚本的功能:

  • TripoClient.cs 和 TripoAPI.cs:处理提示提交和与 Tripo 服务器的网络通信。
  • RuntimeHumanoidAvatarBuilder.cs:使用 GLTFast 插件将模型的骨骼映射到 Unity 的人形骨骼。

TripoClient.cs 和 TripoAPI.csTripo For Unity 插件的精简版本,但具有绑定功能。我们将在未来的版本中继续更新和简化此过程。

  1. 创建 Tripo Client 组件
  • 在 GameLogicManager 下创建一个空子组件,并将其命名为 TripoClient。
  • TripoClient.csTripoAPI.cs 拖到此新对象上以附加脚本。
  • 在 Inspector 中,找到 TripoClient 组件中的 API Key 字段。粘贴您的 Tripo API Key(您可以在 Tripo 官网注册账号并每月获得 600 免费点数)。
  1. 提示输入和回调逻辑

由于我们已经升级了玩家输入系统,我们需要更新 GameManager 中的提示传输逻辑。默认情况下,GameManager 脚本应该已经监听了 OnPlayerEnter 和 OnPlayerExit 事件。如果您正在使用 AI 生成的代码或跨多个组件链式调用逻辑,将之前生成的代码粘贴作为上下文会很有帮助。

我们提供的脚本已经定义了 GameManager 向 UIFactory 发出实例调用时的回调函数。当然,还有其他解决方案,但在本例中,可用于完成这部分逻辑的提示词如下所示。

更新的行为:在 GameManager 脚本中

  • 当触发 OnPlayerEnter 时,UIFactory 实例化一个输入对话框(InputDialog 预制体)。
  • 当触发 OnPlayerExit 时,输入对话框被销毁。

一旦玩家完成提示词输入,它将通过 tripoClient.TextToModel(prompt, pos); 这样的调用示例传递给 TripoClient 脚本。修改相关脚本。

修改 GameManager.cs:

  • 打开 GameManager.cs 脚本
  • 找到 OnPromptConfirmed 方法(此方法处理提示词输入确认)
  • 补全内部代码,并确保 tripoClient 字段已在 GameManager 组件中正确分配。
  1. 创建模型容器
  • 在场景层级中,创建一个空子组件,并将其命名为 ModelContainer。
  • 将其用作所有动态生成模型的父节点。

测试您的设置

  1. 点击 Unity 中的播放按钮。
  2. 在面板中输入提示词。
  3. 您应该会看到提示词成功上传到 Tripo 服务器。
  4. 生成进度将显示在 Unity Console 和 Tripo API 组件的“Input/Progress”字段中。

现在您已准备好在 Unity 中生成自己的 AI 模型。祝您构建愉快!

动画重定向

模型生成后,下一步是将现有动画资源映射到模型的骨骼上。确保 RuntimeHumanoidAvatarBuilder 脚本已添加到您的项目中。此脚本处理从人形 GLB 骨骼到 Unity Avatar 的映射,并且 TripoClient 脚本将自动将其挂载到生成的模型上。

让我们首先整理项目的结构和依赖关系。游戏开始前,除了环境对象,自定义 GameObject 应处于以下状态。展开每个脚本组件并确保所有字段都已正确分配。如果您遇到任何问题,请与源文件进行比较,以检查组件分配是否不正确。

否则,在我们的演示中,模型是一个战斗机甲,所以它的 Transform > Scale 属性放大了十倍。这也适用于其 Controller 相关的属性。

  1. 添加模型控制组件

选择 ModelContainer 组件,并依次添加以下组件(均由 Starter Assets 包提供):

  • Character Controller
  • Player Input
  • Third Person Controller

在 Third Person Controller 组件中,将 Camera 字段设置为场景中的 MainCamera。

  1. 设置模型移动的摄像机

创建一个空的子组件,命名为 ModelCamera,并为其添加一个 CinemachineFreeLook 组件(您需要导入 Cinemachine 插件,该插件包含在 Starter Assets 包中)。

然后在 ModelContainer 下创建一个子组件,命名为 CameraRoot,并将其 Y 坐标调整为 5(模型腰部高度)。将 ModelCamera 的 Follow 和 LookAt 字段都分配给 CameraRoot。现在摄像机将跟随模型的移动。

  1. 启用角色移动:

此时,变形金刚应该播放其待机动画,但还无法控制。

这些组件:CharacterController、PlayerInput、ThirdPersonController、BasicRigidBody 和 StarterAssetsInputs,由 Unity 的 StarterAssets 提供并处理玩家输入。Animator 组件控制动画,RuntimeHumanoidAvatarBuilder 生成的 Avatar 也会自动分配给 Animator 的 Avatar 字段。

测试方法:

  • 禁用 PlayerArmature 组件及其摄像机。
  • 将 Tripo 生成的 GLB 模型(带有绑定)拖入场景作为 ModelContainer 的子组件。
  • 将 RuntimeHumanoidAvatarBuilder 组件添加到新模型。

现在在运行时,变形金刚可以被控制。然后最后一步是实现控制切换逻辑。

  1. 实现控制切换

更新 GameLogic 脚本的 Update 函数中的以下逻辑:

  • isLoad 表示模型是否已生成。如果为 false,则跳过该过程。
  • isInModel 表示玩家当前正在控制变形金刚还是玩家角色。

进入变形金刚时:

  • 禁用玩家和玩家的摄像机。
  • Cinemachine 插件将自动将摄像机视图切换到我们新创建的 ModelCamera。
  • 重置 ModelContainer 以使移动逻辑对变形金刚生效。

退出变形金刚时:

  • 将变形金刚留在原地。
  • 在变形金刚当前位置显示玩家角色。
  • 同时,将控制权和摄像机切换回玩家。

一旦上述逻辑完成,按下 F 键即可让玩家进入并控制变形金刚。再次按下 F 键可将控制权切换回玩家,同时变形金刚留在原地,但玩家精确地重新出现在变形金刚的位置。

最终调整

至此,演示功能已全部完成。如果您想优化体验,可以:

  • 当玩家靠近变形金刚时,显示一个 UI 提示(例如,“按 F 键控制模型”)。
  • 支持在生成多个变形金刚时选择其中一个。

恭喜!

感谢您的辛勤工作!您现在已经完成了整个演示。您可以利用自己的想法和资产自由生成和控制变形金刚模型。

需要帮助?

如果您在使用 TripoGame 时遇到任何困难或有任何反馈,请随时通过我们的官方邮箱联系我们!tripogame@vastai3d.com。我们很乐意倾听您的意见!

提示:

  1. 本教程旨在演示如何在实时游戏中利用 Tripo API。游戏设计本身仅供参考。希望能够主动解决开发者可能遇到的潜在问题。

  2. 目前,由于绑定要求,演示仅支持生成人形模型。如果由于 AI 生成的骨骼权重不稳定导致动画出现异常,请使用 Avatar Mask 遮挡有问题身体部位的动画。例如,源文件已在 NoArmPerson Controller 中禁用了手部动画。

  3. 为了加快生成速度,您可以使用 TripoV2/TripoV1Turbo。只需将 TripoAPI 脚本中的 model_version 数字“v2.5-20250123”替换为

    • v2.0-20240919
    • Turbo-v1.0-20250506。
  4. FBX 和 GLB 模型具有不同的方向,这可能导致导入时出现依赖问题。如果需要导入 FBX,请使用 TriLib 等插件加载模型并相应地处理适配。

Advancing 3D generation to new heights

moving at the speed of creativity, achieving the depths of imagination.