72 lines
4.6 KiB
Markdown
72 lines
4.6 KiB
Markdown
# 昏倒结局动画系统(Faint Ending System)技术说明
|
||
|
||
目标:当玩家三维中的某项数值降到最低(例如 0)时,触发“昏倒”演出:逐步加深黑色遮罩、相机向前向下移动并俯仰下压,中途停顿与回弹,最终彻底倒地全黑,然后弹出结算/返回主菜单 UI。
|
||
|
||
## 一、脚本
|
||
- 昏倒演出控制器:[FaintEndingSequenceController.cs](file:///e:/Unity/Unity%20Program/Test_2022/Assets/_Project/Scripts/EndingSystem/FaintEndingSequenceController.cs)
|
||
|
||
## 二、系统行为(对应你的步骤)
|
||
0) 禁用玩家移动/视角:脚本会禁用 `Player.PlayerController`(不切 ActionMap,不强制显示鼠标)
|
||
1) 黑色遮罩 Alpha 上升,同时相机向前向下移动 + 俯仰向下旋转
|
||
2) 到达“半倒”姿态后停止并保持(遮罩停在半透明)
|
||
3) 相机回弹抬高一点并回正一点(遮罩也回透明一点)
|
||
4) 完全倒下(面朝地 + 离地一点点高度),遮罩变全黑
|
||
5) 解锁鼠标并激活结算 UI(Inspector 提供槽位)
|
||
|
||
## 三、场景接入步骤(Inspector,按顺序)
|
||
### 1) 创建/放置控制器物体
|
||
1. 在你的关卡场景中新建空物体:`_FaintEndingSystem`
|
||
2. Add Component:`FaintEndingSequenceController`
|
||
|
||
### 2) 准备黑屏遮罩(CanvasGroup)
|
||
1. 在你的 UI Canvas 下新建一个全屏 Image:`FaintBlackScreen`
|
||
2. Image 颜色:纯黑
|
||
3. 给该物体添加 `CanvasGroup`,并设置:
|
||
- Alpha = 0
|
||
- Interactable = false
|
||
- Blocks Raycasts = false
|
||
4. 把这个 `CanvasGroup` 拖到 `FaintEndingSequenceController.blackScreenCanvasGroup`
|
||
|
||
### 3) 准备结算 UI(你自己制作)
|
||
1. 在 Canvas 下准备你的结算/返回主菜单 UI 根节点(例如 `FaintEndingUIPanel`)
|
||
2. 初始建议 SetActive=false(不设也行,脚本触发时会先隐藏一次)
|
||
3. 把它拖到 `FaintEndingSequenceController.endingUIPanel`
|
||
4. 若该结算 UI 需要“打开即预加载主菜单场景 + 点击返回主菜单 + AI 总结文案 + 结局状态提示词”,可在该 UI 根节点上额外挂载 [EndingUIScreenController.cs](file:///e:/Unity/Unity%20Program/Test_2022/Assets/_Project/Scripts/UI/EndingUIScreenController.cs),并在 Inspector 里把 `Outcome` 设为 `Fainted`,同时绑定 `Summaray Text / Information Text` 两个文本槽位与对应按钮。
|
||
|
||
### 4) 绑定玩家与相机引用
|
||
在 `FaintEndingSequenceController` 上拖引用:
|
||
- Player Controller:拖 Player 根节点上的 `Player.PlayerController`
|
||
- Camera Transform:拖玩家摄像机 Transform(或留空,它会尝试用 `Camera.main`)
|
||
- Camera Pivot:拖摄像机的父物体(用于上下俯仰的 pivot;或留空,它会取 `cameraTransform.parent`)
|
||
|
||
### 5) 调参数(演出姿态)
|
||
所有阶段的“位置与俯仰”都以“触发时刻的相机姿态”为基准:
|
||
- `step1CameraLocalOffset / step3CameraLocalOffset / step4CameraLocalOffset`:相机 localPosition 偏移(向前 Z 为正、向下 Y 为负)
|
||
- `step1Pitch / step3Pitch / step4Pitch`:在触发时刻的俯仰角基础上追加的角度(正数代表向下压)
|
||
- `step1Alpha / step3Alpha / step4Alpha`:遮罩透明度(0~1)
|
||
- `step2HoldDuration`:半倒停顿时间
|
||
|
||
## 四、如何从 Vitals 触发(推荐方式)
|
||
工程内的 `VitalStat` 支持阈值事件(onEnter/onExit),适合做“到 0 触发一次”的演出。
|
||
|
||
### 做法:用 Threshold Rule 绑定事件
|
||
1. 选中 Player(挂了 `PlayerVitalsSystem` 的对象)
|
||
2. 在 `health` / `hunger` / `sanity`(你要监测的那一项)展开 `thresholds`
|
||
3. 添加一条 Rule:
|
||
- `normalizedThreshold` = 0
|
||
- `onEnter`:绑定场景中的 `_FaintEndingSystem` 上的 `FaintEndingSequenceController.StartFaintSequence()`
|
||
|
||
参考:三维系统接入与阈值说明见 [PlayerVitalsSystem_Setup.md](file:///e:/Unity/Unity%20Program/Test_2022/Assets/_Project/Docs/PlayerVitalsSystem_Setup.md)。
|
||
|
||
## 五、常见排错
|
||
- 触发了但镜头不动:
|
||
- 检查 `Camera Transform` 是否绑定正确(或场景里是否有 `MainCamera` Tag)
|
||
- 检查相机是否是 `cameraPivot` 的子物体(否则俯仰不会按预期工作)
|
||
- 黑屏遮罩没效果/一闪而过:
|
||
- 检查 `FaintBlackScreen` 是否被其它系统 `SetActive(false)`(例如开场序列复用同一个遮罩)
|
||
- 检查 `FaintBlackScreen` 上是否挂了 `CanvasGroupAnimator` / `ImageFading` / `Animator` 这类会抢写 alpha 的组件
|
||
- 推荐给 `FaintBlackScreen` 单独放在一个置顶的 Canvas(或确保 SortingOrder 比其它 UI 大)
|
||
- UI 没弹出来:
|
||
- 检查 `endingUIPanel` 是否拖了正确对象
|
||
- 检查 UI 的 Canvas SortingOrder 是否被黑屏遮罩盖住(黑屏 Image 应该在最上层)
|