4.6 KiB
4.6 KiB
昏倒结局动画系统(Faint Ending System)技术说明
目标:当玩家三维中的某项数值降到最低(例如 0)时,触发“昏倒”演出:逐步加深黑色遮罩、相机向前向下移动并俯仰下压,中途停顿与回弹,最终彻底倒地全黑,然后弹出结算/返回主菜单 UI。
一、脚本
- 昏倒演出控制器:FaintEndingSequenceController.cs
二、系统行为(对应你的步骤)
- 禁用玩家移动/视角:脚本会禁用
Player.PlayerController(不切 ActionMap,不强制显示鼠标) - 黑色遮罩 Alpha 上升,同时相机向前向下移动 + 俯仰向下旋转
- 到达“半倒”姿态后停止并保持(遮罩停在半透明)
- 相机回弹抬高一点并回正一点(遮罩也回透明一点)
- 完全倒下(面朝地 + 离地一点点高度),遮罩变全黑
- 解锁鼠标并激活结算 UI(Inspector 提供槽位)
三、场景接入步骤(Inspector,按顺序)
1) 创建/放置控制器物体
- 在你的关卡场景中新建空物体:
_FaintEndingSystem - Add Component:
FaintEndingSequenceController
2) 准备黑屏遮罩(CanvasGroup)
- 在你的 UI Canvas 下新建一个全屏 Image:
FaintBlackScreen - Image 颜色:纯黑
- 给该物体添加
CanvasGroup,并设置:- Alpha = 0
- Interactable = false
- Blocks Raycasts = false
- 把这个
CanvasGroup拖到FaintEndingSequenceController.blackScreenCanvasGroup
3) 准备结算 UI(你自己制作)
- 在 Canvas 下准备你的结算/返回主菜单 UI 根节点(例如
FaintEndingUIPanel) - 初始建议 SetActive=false(不设也行,脚本触发时会先隐藏一次)
- 把它拖到
FaintEndingSequenceController.endingUIPanel - 若该结算 UI 需要“打开即预加载主菜单场景 + 点击返回主菜单 + AI 总结文案 + 结局状态提示词”,可在该 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 绑定事件
- 选中 Player(挂了
PlayerVitalsSystem的对象) - 在
health/hunger/sanity(你要监测的那一项)展开thresholds - 添加一条 Rule:
normalizedThreshold= 0onEnter:绑定场景中的_FaintEndingSystem上的FaintEndingSequenceController.StartFaintSequence()
参考:三维系统接入与阈值说明见 PlayerVitalsSystem_Setup.md。
五、常见排错
- 触发了但镜头不动:
- 检查
Camera Transform是否绑定正确(或场景里是否有MainCameraTag) - 检查相机是否是
cameraPivot的子物体(否则俯仰不会按预期工作)
- 检查
- 黑屏遮罩没效果/一闪而过:
- 检查
FaintBlackScreen是否被其它系统SetActive(false)(例如开场序列复用同一个遮罩) - 检查
FaintBlackScreen上是否挂了CanvasGroupAnimator/ImageFading/Animator这类会抢写 alpha 的组件 - 推荐给
FaintBlackScreen单独放在一个置顶的 Canvas(或确保 SortingOrder 比其它 UI 大)
- 检查
- UI 没弹出来:
- 检查
endingUIPanel是否拖了正确对象 - 检查 UI 的 Canvas SortingOrder 是否被黑屏遮罩盖住(黑屏 Image 应该在最上层)
- 检查