Files
VFSUnity/Doc/04_美术资源对接与场景配置指南.md
yangbear 84a9d820cd docs: 新增美术资源对接与场景配置指南
- 完整美术资源清单(场景/角色/道具/动画/视频/音频/UI)
- Unity 场景搭建步骤(Collider+Tag 对照表)
- UI Canvas 层级结构
- Inspector 连线清单
- 交付前检查清单 40+ 项
- 常见问题 FAQ
2026-06-24 02:13:50 +08:00

15 KiB
Raw Permalink Blame History

VFS 美术资源对接与场景配置指南

给你的美术和场景搭建同学看这份文档,他们就知道要做什么、怎么做、命名规则是什么。 你作为项目负责人,拿到美术交付物后,按本文逐项检查即可。


一、你需要交付的美术资源清单

1.1 场景模型

资源 格式 要求
室内田径馆 FBX/GLB 包含跑道、看台、跳高架、跳高垫。比例正确(真人 1.7m 对应 Unity 1.7 单位)。Pivot 在地面中心。
跳高架 FBX/GLB 可独立放置,带横杆
跳高垫 FBX/GLB 软材质效果,1m × 3m × 0.5m

1.2 角色模型

资源 格式 骨骼 备注
伤者(男性、运动装) FBX + 骨骼绑定 Humanoid65 根骨骼以内 Mixamo 自动绑骨亦可,必须带 Humanoid Avatar
施救者(女性、急救员装束) FBX + 骨骼绑定 Humanoid65 根骨骼以内 同上

1.3 道具模型

资源 格式 数量 备注
急救箱(带红十字) FBX/GLB 1 可放场景角落,静态物件
绷带/绑带(蓝色) FBX/GLB 4 条 分段模型,每条独立,绑定到腿时可缩放/旋转
三角巾 FBX/GLB 1
夹板(木板) FBX/GLB 2 块 内侧夹板 80cm,外侧夹板 120cm
衬垫(白色软垫) FBX/GLB 2 块 放关节和骨突处用
左鞋(运动鞋) FBX/GLB 1 独立于角色,可被脱掉/隐藏
右鞋(运动鞋) FBX/GLB 1 同上
8 字绑带(脚踝用) FBX/GLB 1

1.4 动画(如果做)

资源 时长 循环 备注
伤者_跑步 1s
伤者_跳高起跳 1.5s
伤者_空中姿态 0.8s
伤者_落地摔倒 2s 落地→倒地→静止
伤者_躺地(受伤) 2s 最终 Idle
施救者_站立 1s
施救者_蹲下 1s
施救者_检查伤情 2s 手部触摸伤腿
施救者_脱鞋 2s 手伸向鞋子
施救者_包扎(手部特写) 3s

没有动捕可以用 Mixamo 下载基础动画拼接。

1.5 视频

资源 分辨率 时长 文件名
真人演示·放置衬带 1080p 30s bandage_demo.mp4
真人演示·夹板固定 1080p 30s splint_demo.mp4

放到 StreamingAssets/Videos/ 下。

1.6 音频(可选)

资源 格式 文件名示例
背景音乐 MP3 320kbps bgm_experiment.mp3
语音_环境安全 WAV 16bit voice_01_safe.wav
语音_伤情检查 WAV 16bit voice_02_injury.wav
... ... ...

放到 StreamingAssets/Voice/ 下。

1.7 UI 素材

资源 尺寸 格式 备注
图标_心肺复苏 128×128 PNG 透明
图标_骨折固定 128×128 PNG 透明
图标_扭伤包扎 128×128 PNG 透明
图标_出血包扎 128×128 PNG 透明
图标_伤员搬运 128×128 PNG 透明
按钮_全屏 64×64 PNG/SVG
按钮_上一步 64×64 PNG/SVG
按钮_下一步 64×64 PNG/SVG
按钮_返回 64×64 PNG/SVG
按钮_确定 200×60 PNG 含文字
面板_半透明底 可拉伸 9-slice PNG
提示框背景 可拉伸 9-slice PNG

二、Unity 场景搭建步骤

拿到所有资源后,按以下顺序操作。

2.1 导入资产

  1. 将模型 FBX 拖入 Assets/Models/ 文件夹
  2. 将贴图拖入 Assets/Textures/(如有)
  3. 将视频拖入 StreamingAssets/Videos/
  4. 将音频拖入 StreamingAssets/Voice/
  5. 将 UI 图片拖入 Assets/UI/Sprites/
  6. 将动画 FBX 拖入 Assets/Animations/

2.2 创建 Experiment 场景

File → New Scene → 命名为 Experiment → 保存到 Assets/Scenes/

2.3 设置光照

  • Directional Light:模拟室内顶灯,Intensity 0.8Color 暖白 (#FFF5E6)
  • 可选:Light Probe Group 放在场景四角和中心

2.4 放置场景

  1. 把田径馆模型拖入 Hierarchy → Position (0, 0, 0)
  2. 把跳高架放在跑道区域 → Position 根据模型调整
  3. 把跳高垫放在跳高架落地区

2.5 放置角色

  1. 伤者 → Hierarchy → Position:躺在跑道上(大致 X:2, Y:0, Z:5
    • 初始姿态:仰卧位,身体平放,头朝跑道方向
    • CharacterAnimController.cs → Role 选 Patient
    • Animator 组件,配置好动画状态机
  2. 施救者 → Position:站在伤者右侧(X:3, Y:0, Z:5
    • CharacterAnimController.cs → Role 选 Rescuer
    • Animator 组件

2.6 放置道具

道具 位置 说明
急救箱 伤者身旁地面 (X:3.5, Y:0, Z:4.5) 静态,无交互
左鞋 伤者左脚位置 初始穿在脚上,可被隐藏/移动
右鞋 伤者右脚位置 同上
绑带 ×4 急救箱旁 之后拖到腿上
衬垫 ×2 急救箱旁
夹板 ×2 急救箱旁 夹板固定模式用
8 字绑带 急救箱旁 踝关节固定用

2.7 最关键:给物体加 Collider 和 Tag

这是代码能找到物体的唯一方式,必须做对。

GameObject Collider 类型 Tag 名称 说明
伤者左大腿 Box Collider(包裹股骨区域) InjuryLeg 初始伤情检查点击区域
伤者左大腿·视觉检查区 Box Collider InjuryVisual 伤情检查子项 1:肿胀变形
伤者左大腿·肿胀触摸区 Box Collider InjurySwelling 伤情检查子项 2:肿胀畸形
伤者胸口 Box Collider InjuryPain 伤情检查子项 3:疼痛评估(模拟听诊/询问)
伤者手腕 Box Collider InjuryVitalSigns 伤情检查子项 4:生命体征(模拟测脉搏)
伤者头部 Box Collider InjuryNeuro 伤情检查子项 5:神经评估
左鞋 Box Collider Shoe 脱鞋步骤
右鞋 Box Collider Shoe 同上
绑带位置 1(近心端·大腿上部) Box Collider BandagePos1 绑带固定位置
绑带位置 2(远心端·大腿下部) Box Collider BandagePos2
绑带位置 3(膝关节下) Box Collider BandagePos3
衬垫位置(两腿间) Box Collider PaddingPos 拖拽衬垫吸附目标
踝关节 Sphere Collider Ankle 8 字固定
夹板左侧位置 Box Collider SplintLeft 夹板拖拽吸附
夹板右侧位置 Box Collider SplintRight 夹板拖拽吸附
场景地面 Box Collider(大面积) Ground ClickAnywhere 用

Tag 名称必须完全一致,包括大小写。代码用 tag == "InjuryLeg" 匹配。

2.8 给可交互物体加脚本组件

GameObject 挂载脚本 关键设置
绑带物件 ×4 DraggableObject.cs SnapTarget 拖入对应的 BandagePos 空物体
衬垫 DraggableObject.cs SnapTarget 拖入 PaddingPos
夹板 ×2 DraggableObject.cs SnapTarget 拖入对应夹板位置
伤者左大腿 HighlightEffect.cs 考核模式可设 AlwaysHighlighted = true
所有带 Collider 的交互物体 HighlightEffect.cs(可选) 悬停时会变色,方便用户找到

2.9 创建管理器空物体

Hierarchy → Create Empty → 命名为 [Managers]

[Managers] 上依次 Add Component

  1. GameManager.cs — 无需配置,Awake 时自动挂载
  2. StepManager.cs — 后续在 Inspector 拖入 Config
  3. ExperimentFlowCoordinator.cs — 后续拖入各子系统引用
  4. AudioManager.cs — 拖入 BGMClip

2.10 配置相机

  1. 主相机(Main Camera)→ 挂在 [Managers] 下或独立
    • Position:面对伤者,俯角 30°,距离约 3 米
    • 挂载 InteractionSystem.cs
    • Interactable Mask 选包含所有交互物体的 Layer
  2. 特写相机(可选):用于包扎特写,放在 ExperimentFlowCoordinator 里管理

2.11 搭建 UI Canvas

Hierarchy → UI → Canvas(命名为 UICanvas

内部结构(父子关系):

UICanvas
├── [挂 UIManager.cs]
│
├── TipPanel(顶部提示栏)
│   └── TipTextTMP_Text
│
├── DetailPanel(详细操作说明面板 · 学习模式)
│   └── DetailTextTMP_Text,多行可滚动)
│
├── DialogueBubble(对话气泡)
│   └── DialogueTextTMP_Text
│
├── VideoPanel(画中画视频)
│   ├── RawImage(挂 VideoController.cs
│   └── VideoPlayer(子物体或被 VideoController 引用)
│
├── RightButtons(右侧功能按钮栏)
│   ├── BtnFullScreenButton
│   ├── BtnPreviousButton
│   ├── BtnNextButton
│   ├── BtnSwitchModeButton + TMP_Text 标签)
│   └── BtnReturnButton
│
├── ProgressBar(底部进度条)
│   ├── Slider
│   └── ProgressTextTMP_Text 显示 "3/8"
│
├── ExamPopup(考核弹窗 · 挂 ExamPopup.cs
│   ├── QuestionTextTMP_Text
│   ├── OptionTogglesToggle × 4
│   ├── OptionLabelsTMP_Text × 4
│   ├── FeedbackTextTMP_Text 红色)
│   ├── OperationPanel(操作题提示)
│   │   └── OperationHintTMP_Text
│   └── ConfirmButtonButton
│
├── ScoreDisplay(成绩面板 · 挂 ScoreDisplay.cs
│   ├── ExamResultRoot
│   │   ├── ScoreTitleTMP_Text
│   │   ├── ScoreValueTMP_Text
│   │   └── AnalysisListParentScroll View → Content
│   │       └── AnalysisItemPrefab(预制体:TMP_Text
│   ├── NotesRoot(注意事项面板)
│   │   └── NotesTextTMP_Text
│   └── ConfirmButton
│
└── BottomIcons(底部图标栏)
    ├── BtnCPR
    ├── BtnFracture
    ├── BtnSprain
    ├── BtnBleeding
    └── BtnTransport

2.12 Inspector 连线

打开 [Managers]ExperimentFlowCoordinator,拖入:

字段 拖入对象
Step Manager [Managers](自身的 StepManager
Interaction System Main Camera(自身的 InteractionSystem
UI Manager UICanvas(自身的 UIManager
Step Animation Handler StepAnimationHandler 所在物体
Audio Manager [Managers](自身的 AudioManager

打开 UICanvasUIManager,拖入所有子面板引用。


三、创建 MainMenu 场景

File → New Scene → 命名为 MainMenu → 保存。

3.1 结构

UICanvas
├── [挂 MainMenu.cs]
├── TitleTextTMP_Text"运动伤害现场急救处理虚拟仿真实验")
├── TipTextTMP_Text"Tip:请选择实验模式"
├── ExperimentButtons
│   ├── BtnCPRButton + 图标)
│   ├── BtnFractureButton + 图标)
│   ├── BtnSprainButton + 图标)
│   ├── BtnBleedingButton + 图标)
│   └── BtnTransportButton + 图标)
├── ModePanel
│   ├── BtnLearnModeButton
│   ├── BtnExamModeButton
│   └── SelectedModeLabelTMP_Text
├── FixationPanel(骨折固定专属)
│   ├── BtnLimbFixationButton
│   ├── BtnSplintFixationButton
│   └── SelectedFixationLabelTMP_Text
└── BtnStartButton "开始实验"

3.2 空物体

Create Empty → 命名 [GameManager] → 挂 GameManager.cs

3.3 连线

MainMenu.cs 的 Inspector 中拖入对应的 Button 和 TMP_Text 引用。


四、检查清单(交付前逐项打勾)

模型

  • 田径馆模型比例正确
  • 伤者 Humanoid Avatar 配置完成(Inspector → Rig → Animation Type = Humanoid
  • 施救者 Humanoid Avatar 配置完成
  • 所有道具 FBX 正确导入,材质不丢失

Collider & Tag

  • 伤者左大腿 Collider 覆盖正确区域,Tag = InjuryLeg
  • 5 个伤情检查子项 Collider 各覆盖正确部位,Tag 正确
  • 鞋子 Collider + Tag = Shoe
  • 绑带位置 1 2 3 空物体有 Collider + Tag = BandagePos1/2/3
  • 衬垫位置空物体 Collider + Tag = PaddingPos
  • 踝关节 Collider + Tag = Ankle
  • 夹板位置 Collider + Tag = SplintLeft / SplintRight
  • 场景地面 Collider + Tag = Ground
  • 所有交互物体的 Layer 在 InteractionSystem.InteractableMask 范围内

脚本挂载

  • [Managers] 挂 GameManager + StepManager + ExperimentFlowCoordinator + AudioManager
  • Main Camera 挂 InteractionSystem
  • UICanvas 挂 UIManager
  • ExamPopup 面板挂 ExamPopup.cs
  • ScoreDisplay 面板挂 ScoreDisplay.cs
  • VideoPanel 挂 VideoController.cs
  • 绑带/衬垫/夹板挂 DraggableObject.csSnapTarget 已拖入

连线

  • ExperimentFlowCoordinator 所有字段已拖入
  • UIManager 所有字段已拖入
  • MainMenu 所有字段已拖入

ScriptableObject

  • Create → VFS → Step Data 创建了 8 个步骤(肢体固定)或更多
  • 每个 StepData 的 ScoreWeight 已按评分标准填入(5, 20, 10, 10, 10, 20, 15, 10
  • 每个 StepData 的 DetailedContent 已填入(至少 CheckInjury 步骤)
  • Create → VFS → Experiment Config 创建了配置
  • LearnStepsLimb / LearnStepsSplint / ExamStepsLimb / ExamStepsSplint 四个数组已填入
  • StepManager.Config 已拖入 ExperimentConfig

验证

  • Play 进入 Experiment 场景,UIManager 能显示第一步 Tip 文案
  • 点击伤者大腿 → InteractionSystem 输出 Debug.Log 包含 Tag=InjuryLeg
  • 考核模式下弹窗正常弹出
  • 答题后 ScoreDisplay 正常显示

五、常见问题

QFBX 导入后材质是紫色的? A:材质丢失。在 FBX 的 Import Settings → Materials → Extract Textures 重新提取。

Q:骨骼动画播放时角色扭曲? AAvatar 未正确配置。Inspector → Rig → Configure Avatar,检查骨骼映射是否正确。

Q:点击 3D 物体没反应? A:检查 (1) Collider 是否勾选了 Is Trigger(不要勾),(2) Layer 是否在主相机的 Culling Mask 和 InteractionSystem 的 InteractableMask 范围内,(3) Tag 是否正确。

QCanvas 上的 UI 遮挡了 3D 点击? AInteractionSystem 已内置 IsPointerOverGameObject() 检测,不会同时触发。确保 Canvas 的 Graphic Raycaster 正常工作。

Q:成绩显示 0 分? A:检查 StepData 的 ScoreWeight 是否已填入非 0 值,考核模式下 RecordExamResult 的 proportion 参数是否传了 1f。