tripo logo
allPosts

Game Hub 0 代码教学 - 中文

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

一、玩家运动逻辑及 UI 生成部分

  1. GameLogic 组件作为游戏的核心逻辑管理组件,所有事件均传入 GameLogic 并由其分发给相应的组件,减少代码耦合
  2. 玩家靠近带有 BoxCollider 的“召唤器”,其 Transponder 组件向 GameLogic 组件传递玩家靠近事件,UIFactory 组件实例化 UI 面板以填写提示词
  3. UI 面板将挂载 InputDialog 组件,监听玩家的键盘输入,当玩家点按回车,激活输入框并接管键盘输入,当玩家输入完成后,再次点按回车,将玩家的输入数据作为事件传入 GameLogic
  4. 当玩家远离“召唤器”,销毁 UI 面板。

二、模型生成及骨骼映射部分(由 TripoSDK 提供)

  1. GameLogic 接收到玩家的提示词后,将提示词传入 TripoClient 组件(需输入 TripoAPIKey)
  2. TripoClient 将调用 TripoAPI 组件,将提示词传入 Tripo 服务端,此时 TripoAPI 会完成请求装配、发送请求、轮询服务器响应,成功响应时,服务器将返回模型的 TaskID。当模型生成完成后,TripoAPI 将模型的 TaskID 再次传入 Tripo 服务器生成骨骼
  3. 当骨骼绑定完成后,TripoAPI 将模型的 url 传入 TripoClient 组件,TripoClient 通过 GLTFfast 插件加载并解析该 GLB 格式的模型。
  4. 随后为模型挂载 RuntimeHumanoidAvatarBuilder 组件,该组件会将 GLB 格式的模型骨骼,映射到 UnityAvator 系统,以实现动画重定向。
  5. 最终,TripoClient 将模型实例化到场景中。此时,开发者可以用已有的人形动画资源驱动模型

三、控制权转换部分

GameLogic 将监听玩家的键盘输入,交换模型和玩家的摄像机优先级和 ThirdPersonController 的响应目标。当玩家按下 F 键后,即可操作模型。再次按下 F,玩家将离开模型。就游戏而言,模型可以极大极小,以便于玩家穿过不同的障碍,当然也可以完成外观的替代,低成本的实现类似的捏脸、皮肤的系统。

整体代码逻辑:


主要 GameObject

具体实现步骤:

  • 版本:unity2022.3.55

  • 源码及场景位于源文件的 Assets-LowPoly Environment Pack-Demo-Demo1

项目搭建与资源导入:

1. 创建新项目


打开 Unity,点击 New Project(新建项目)。


选择 URP 管线(Universal Render Pipeline),命名为 TripoRuntimeTutorial,点击 Create 创建。


2. 导入资源包


打开浏览器,搜索 Unity Asset Store。在 Unity Asset Store 搜索并下载以下资源(均为免费),也可在我们给出的工程中找到对应文件:


Starter Assets - ThirdPerson Unity 官方出品,提供基础的第三人称角色控制(初次导入如果提示需要重启,则跟随提示重启再次导入即可)


Military FREE - Low Poly 3D Models Pack 提供场景道具资源


LowPoly Environment Pack 搭建沙漠场景基础


添加到我的资源,并在后续弹窗这种点击在 Unity 中打开并下载。


下载完成后,点击 Unity 顶部菜单 Assets > Import Package > Custom Package,依次导入上述资源包,全部点击 Import(导入)。


3. 转换为 URP 材质


筛选全部 Material 文件,或者全选场景中粉色的异常模型,在 Editor - Rendering - Materials - Convert to URP Materials,将材质转化为 URP 材质。


4. 下载依赖库 glTFast (用于解析 GLB 模型)


方法一、通过 Git 下载(需要本机有 git 环境)


点击顶部菜单 Window > Package Manager,在弹出窗口点击 + > Add package from git URL。输入 URL:https://github.com/atteneder/glTFast.git 点击 Add(添加),等待导入 glTFast 插件


方案二、在 Tripo 官网下载 Unity 插件,其中包含 glTFast 插件


在官网首页的 recourse 找到 Unity 插件,下载后根据包内的教程视频导入 Unity 即可


5. 打开基础场景


在 Unity 左侧文件列表中,找到路径 Assets > LowPoly Environment Pack > Demo > Demo1,双击打开该场景。从 Assets > ithappy 文件夹中拖拽一些模型(如坦克、石头)到场景中,布置简单环境。

玩家移动控制实现:让玩家能在场景中移动

1. 添加玩家相关预制体


在 Unity 左侧文件列表中,找到路径 Assets > StarterAsset > ThirdPersonController > Prefabs。拖拽以下三个预制体到场景中:


MainCamera(主相机)


PlayerFollowCamera(玩家跟随相机)


PlayerArmature(玩家角色模型)


2. 设置相机参数


选中场景中的 PlayerFollowCamera,在右侧属性面板(Inspector)找到 CinemachineVirtualCamera 组件。将 Follow 和 Look At 字段均设置为 PlayerArmature 下的 PlayerCameraRoot(可在 PlayerArmature 的子物体中找到)。


以上为 Unity 官方提供的第三人称控制脚本。此时,点击 Unity 工具栏的 Play(播放)按钮,使用 WASD 键 移动角色,角色和相机应当能正常跟随移动。

提示词面板生成:当玩家靠近特定物体时显示输入面板,离开时隐藏

1. 创建触发区域


在 Assets-ithappy-Military FREE-perfab 中选择一个模型(如坦克),右键点击该模型 > Create Empty Child(创建空子代),命名为 Trigger。


选中 Trigger,在右侧属性面板点击 Add Component > Box Collider,添加碰撞体。


勾选 Is Trigger(触发)选项,点击 Edit Collider,在场景中拖拽碰撞体的手柄,使其尺寸为模型的 2 倍(覆盖模型周围区域)。


2. 编写触发事件脚本


右键点击 Unity 左侧文件列表的 Assets > Create > C# Script,命名为 Transponder,用 Cursor 打开脚本。我们希望实现的效果是,当玩家进出碰撞体时,将消息传递给我们的 GameLogic 组件。在 Cursor 选取模型,输入我们的参考提示词:

请生成一个 Unity C#脚本,实现玩家进入/离开碰撞体时触发事件。

要求:组件名为 Transponder,当 Tag 为 Player 的 GameObject 进入碰撞体时,触发事件 OnPlayerEnter,当玩家离开时,触发事件 OnPlayerExit。

保存脚本后,将 Transponder 脚本拖拽到 Trigger 物体上。


3. 创建游戏逻辑管理器


在场景中右键点击 > Create Empty,命名为 GameLogicManager,作为逻辑组件的容器。


在 GameLogicManager 下创建一个空子物体,命名为 GameManager。


再创建第二个脚本,命名为 GameManager,处理游戏中的主要逻辑。


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

请生成一个 Unity C#脚本,组件名为 GameManager。

要求:监听 Transponder 的 OnPlayerEnter 和 OnPlayerExit 事件,当 OnPlayerEnter 时,调用 UIFactory 脚本,实例化提示词 UI 预制体。当 OnPlayerExit 时,销毁这个 UI 预制体。

保存脚本后,将 GameManager 脚本拖拽到 GameManager 物体上并把 Tranponder 组件拖入 Tranponder 字段。以上就完成了玩家进出事件的监听。


4. 创建 UI 面板预制体


右键点击 Hierarchy 面板(场景物体列表)> UI > Panel,创建一个 UI 面板。


在面板下创建两个子物体:Text(提示文本)和 InputField(输入框),调整它们的位置和大小(可在 Game 窗口预览)。


选中整个面板,拖拽到 Unity 左侧文件列表的 Assets 目录下,生成预制体(命名为 InputDialogPrefab)。


注意:若采用 Unity TextMeshPro,则需要生成支持中文的字体资产,否则中文字体将显示为方块,也可以直接使用我们提供的 NotoSansSC SDF 资产,在 Text 组件中更换字体为 NotoSansSC SDF 即可。


5. 编写 InputDialog 脚本:UI 面板的初始化及玩家的键盘输入监听


创建 InputDialog 脚本,在 Cursor 中输入参考提示词:

请生成一个 Unity C#脚本,组件名为 InputDialog。

要求:创建带 TMP 输入框的对话框系统,包含 TMP_Text 显示提示语和 TMP_InputField 接收输入

通过回车键切换两种模式:

首次回车:激活输入框并禁用玩家移动控制器(如 ThirdPersonController

二次回车:提交输入内容并销毁对话框

输入为空时保持聚焦状态

将 InputDialog 组件挂载到 UI 面板预制体下,并将 Text 和 InputField 拖入面板依赖中。


6. 编写 UIFactory 脚本:生成 UI 面板


新建一个 C# 脚本,命名为 UIFactory,目的提供生成 UI 预制体的接口,作为中间层避免代码间耦合。参考提示词如下:

在创建一个名为 UIFactory 的 C#脚本,实现 UI 对话框的工厂模式生成功能。具体要求如下:已有 UI 预制体,函数传入生成 UI 的位置和旋转,实例化 UI 到指定位置并返回实例化后 UI 的 InputDialog 组件。

7. 关联组件依赖


再次检查是否正确关联组件依赖。确认 PlayerArmature 的 Inspector 面板 Tag 设置为 Player。


选中 GameManager 物体,在右侧属性面板中,将 Transponder 字段拖拽赋值为场景中的 Trigger 物体上的 Transponder 组件。


将 UIFactory 字段拖拽赋值为 GameLogicManager 物体上的 UIFactory 组件。


开始游戏后,走近你设置 Trigger 的物体,即可看到 UI 面板,离开后,UI 面板则自动销毁。注意,我们的源文件定死了面板生成的位置,请根据你选定的 Trigger 的 Transform 属性修改这个值。或者将 UI 预制体的 Canvas 组件下 RenderMode 设置为 ScreenSpace-Overlay,这样,UI 将作为屏幕空间的数据,而不会进入世界空间。

提交提示词到 Tripo API

到这一步,我们尚且不能将提示词提交到 Tripo 服务器。但开发者需要编写的代码基本结束,后续的网络请求、模型生成、骨骼绑定、映射与适配、动画重定向,我们已经编写好了脚本,并将在未来融入 Tripo For Unity 插件。


务必首先在场景中创建一个 UIEvent,否则 UI 将不会响应!

1. 导入 Tripo 插件脚本


在 Unity 左侧文件列表中,找到下载好的源文件中的 TripoClient.cs、TripoAPI.cs 和 RuntimeHumanoidAvatarBuilder.cs 脚本,拖拽到 Assets/Scripts 文件夹中。


以上代码 TripoClient、TripoAPI 处理网络请求的收发,RuntimeHumanoidAvatarBuilder 将模型的骨骼映射到 Unity 的骨骼系统。TripoClient 和 TripoAPI,是 Tripo For Unity 插件的精简版,并补全了骨骼绑定的功能,这个版本我们也即将更新,届时会有更便捷的流程。


2. 创建 Tripo 客户端物体


在 GameLogicManager 下创建一个空子物体,命名为 TripoClient。


将 TripoClient.cs 和 TripoAPI.cs 脚本拖拽到该物体上。


在右侧属性面板中,找到 TripoClient 组件的 API Key 字段,输入你的 Tripo API 密钥(需提前在 Tripo 官网注册账号,用户每月有 600 点免费积分)。


3. 关联提示词传递逻辑


由于新增了玩家输入事件,我们需要为 GameManager 新增监听逻辑,此时 GameManager 代码应该已经监听了 OnPlayerEnter 和 OnPlayerExit 事件。


给出的代码示例在 GameManager 向 UIFactory 发出实例化调用时,就已经定义好了回调函数。当然还有其他解决方案,但本例中,补全这部分逻辑的提示词示例如下,注意,如果组件间有依赖关系,最好将之前生成的代码作为上下文提供给 AI:


GameManager 脚本中,新增逻辑当 OnPlayerEnter 触发时,调用 UIFactory 实例化先前的 InputDialog 预制体。OnPlayerExit 触发时,销毁生成的预制体。当玩家确认输入后,将提示词玩家的提示词传入已有的 TripoClient 脚本,调用示例为 tripoClient.TextToModel(prompt, pos);。修改相关联的脚本。


打开 GameManager.cs 脚本,找到 OnPromptConfirmed 方法(处理输入确认的函数),补全内部代码,注意:确保 tripoClient 字段已在 GameManager 组件中赋值为 TripoClient 物体。


4. 创建模型容器


在场景中创建一个空子物体,命名为 ModelContainer,作为生成模型的父节点。


此时运行游戏,在面板中输入提示词,会发现提示词已经成功上传到 Tripo 服务器,在 Unity 底部的 Debug 栏和 TripoAPI 的“输入/进度”中,可以看到生成的进度。尝试生成你的模型吧!

动画重定向

模型生成后的下一步,就是将已有的动画资源映射到模型的骨骼上。确保 RuntimeHumanoidAvatarBuilder 脚本已经拷贝入你的项目,它完成了人形 GLB 骨骼到 UnityAvator 的映射,TripoClient 脚本将把他自动挂载到生成的模型上。


我们来整理一下项目的结构与依赖。此时,除环境物体外,我们自己创建的 GameObject 在游戏开始前状态应当如下。展开各个脚本,观察是否全部赋值,如果发生意外,请对照我们的源文件,观察是否是组件赋值有误。此外,由于案例中,模型是战斗机甲,他的 Scale 属性均扩大十倍,他的 Controller 相关属性同理。

1. 添加模型控制组件


选中 ModelContainer 物体,依次添加以下组件(均来自 Starter Assets 资源包):


Character Controller(角色控制器)


Player Input(玩家输入)


Third Person Controller(第三人称控制器)


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


2. 设置模型相机


创建一个空子物体,命名为 ModelCamera,添加 CinemachineFreeLook 组件(需导入 Cinemachine 插件,Starter Assets 资源包已包含)。


在 ModelContainer 下创建子物体 CameraRoot,调整其 Y 坐标 为 5(模型腰高度)。


将 ModelCamera 的 Follow 和 LookAt 字段均设置为 CameraRoot。此时相机将跟随模型运动。

运动能力补充:

此时,生成的模型应当开始播放 idle 动画,但尚且无法控制。


以上组件,CharacterController、PlayerInput、ThirdPersonController、BasicRigidBody、StarterAssetsInputs 均为 Unity StarterAssets 中提供,用于处理玩家的输入。Animator 组件用于动画的控制,RuntimeHumanoidAvatarBuilder 组件生成的 Avator 也将自动赋值到它的 avator 字段。


作为测试,当你禁用 PlayerArmature 组件及其相机后,拖入一个 Tripo 生成并绑定骨骼的 GLB 模型,作为 ModelContainer 的子物体,并添加 RuntimeHumanoidAvatarBuilder 组件。游戏运行中就将控制生成的模型。最后一步就是处理控制权切换的逻辑。


在 GameLogic 的 Update 函数更新下图逻辑,其中 isLoad 表示模型是否生成,若没有生成,自然没有处理的必要。isInModel 表示玩家此时在控制模型,还是控制本体。


当玩家由本体进入模型,则禁用玩家和玩家的摄像机,此时 Cinemachine 插件将自动切换相机到我们新建的 ModelCamera。并通过重置 ModelContainer,让运动脚本对模型生效。


当玩家由模型返回本体时,我们希望模型在原地不动,而玩家本体在当前位置显示。同时将摄像机和控制器切换到玩家本体。


补全以上代码后,当模型存在时按下 F,玩家将进入并控制模型,再次按 F,玩家本地将在模型位置显示,而模型则停留在原地。

此时已经完成了 Demo 的主体,如果希望更精致的表现,可以新增一些细节逻辑。例如当玩家靠近模型时,弹出 UI 面板提示“按 F 控制模型”;例如生成多个模型,玩家可以选择其一控制等等等等。


好了,做到这一步,应当已经实现了 Demo 的全部内容,你可以根据自己的心意,随意生成并操作人形模型。


我们也将在 TripoV3.0 的大版本的更新中,提供包括四足动物、鸟类等等全新生物的骨骼绑定并优化现有的绑定算法。


如果遇到任何问题或建议,请向联系我们反馈!

Tips:

  1. 当前 Demo 目的为展示 TripoAPI 在实时运行游戏的应用场景,并预先解决开发者们可能遇见的问题,游戏细节设计仅供参考。
  2. 由于需要绑定骨骼,当前 demo 仅支持生成人形模型。此外,由于 AI 生成模型的骨骼权重不稳定,如果动画出现异常,可以用 Avator Mask 屏蔽掉一部分异常部位的动画,源文件已经屏蔽了手部动画,在 NoArmPerson Controller 中修改。
  3. 如果希望快速生成,可以采用 TripoV2/TripoV1Turbo 模型,仅需在 TripoAPI 脚本中,替换 model_version = "v2.5-20250123"字段的版本号为 v2.0-20240919/Turbo-v1.0-20250506 即可。
  4. FBX 格式的模型和 GLB 模型的正方向不同,在 Unity 运行中导入的依赖也不同,如果必须要使用 FBX 导入,可以使用 TriLib 等插件加载模型并处理对应的适配逻辑。