移动/游戏
在 Roblox 客户端脚本中实现自定义相机…
适用于 Roblox 客户端中自定义相机行为、CFrame 放置/旋转、屏幕射线检测或非默认玩家视角。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 Roblox 客户端脚本中实现自定义特定
解决思路
- 使用 `workspace.CurrentCamera` 操作相机;每个客户端各有一个相机实例,且相机脚本只在客户端有效。
- 要完全接管相机,设置 `camera.CameraType = Enum.CameraType.Scriptable`,禁用默认相机行为;否则默认逻辑会每帧覆盖你的 `CFrame`。
- 按需求选择 `CameraType`:`Fixed`、`Attach`/`Watch`/`Track`/`Follow`(跟随目标)、`Custom`(默认)、`Scriptable`(无默认行为)、`Orbital`(Y 轴固定、围绕玩家旋转)。
- 设置 `CameraSubject` 时不要设为 `nil`;设为 `nil` 会回退到之前的值。
- 操作关键相机属性:`CFrame`、`CameraSubject`、`FieldOfView`(度)、`FieldOfViewMode`(`Vertical`/`Diagonal`)、`NearPlaneZ`、`ViewportSize`、`HeadLocked`、`HeadScale`、`Focus`。
- 仅设置位置时使用 `CFrame.new(position)`。
- 让相机看向目标时使用 `CFrame.lookAt(position, target, upVector)`。
- 设置 XYZ 旋转时使用 `CFrame.Angles(rx, ry, rz)`。
- 将局部坐标转换到世界坐标时使用 `cf * Vector3.new(0, 0, 10)`。
- 在 `CFrame` 之间插值时使用 `cf:Lerp(goal, alpha)`。
- 获取单位轴时使用 `cf.LookVector`、`cf.RightVector`、`cf.UpVector`。
- 自定义相机循环必须使用 `RunService.PreRender`,不要用 `Heartbeat`。
- 在 `PreRender` 连接中:先把 `camera.CameraType` 设为 `Enum.CameraType.Scriptable`,再用 `CFrame.lookAt(head.Position - offset, head.Position)` 计算目标 `CFrame`,然后执行 `camera.CFrame = camera.CFrame:Lerp(desired, math.min(dt * 10, 1))` 平滑更新。
- 从屏幕点射线检测时用 `camera:ScreenPointToRay(mx, my)`(会计入 GUI inset);需要原始视口坐标时用 `camera:ViewportPointToRay(mx, my)`(不包含 inset)。
- `ScreenPointToRay` 返回单位 `Ray`(长度 1 stud);实际射线检测前把 `Direction` 乘以所需长度。
- 相机设置仅在客户端生效;在服务器设置会被静默丢弃。
- 未设置 `Scriptable` 时,默认相机会每帧覆盖你的 `CFrame`,所以自定义前先设为 `Scriptable`。
- 相机视觉同步使用 `PreRender`;`Heartbeat` 会引入 1 帧延迟;`RenderStepped` 仍可用,但已被 `PreRender` 取代。
- VR 中 `Camera.CFrame` 不包含头部旋转;需要真实视角时使用 `GetRenderCFrame()`。
- 不要用已过时的 `SetRoll`;如需 roll,在 `CFrame` 上通过 `CFrame.Angles(0, 0, roll)` 应用。
- 不要将 `CameraSubject` 设为 `nil`(会回退到之前的值);需要明确跟随目标时设置有效对象。
- 不要在新代码中使用旧式 `CFrame.new(pos, lookAt)`(仅为向后兼容);使用 `CFrame.lookAt(at, lookAt)`。
- 区分 `ScreenPointToRay` 与 `ViewportPointToRay`(GUI inset);鼠标输入优先用 `ScreenPointToRay`。
- 需要第一/第三人称配方、过场动画、屏幕震动、鼠标视角和完整 API 时,查看 `references/full.md`。
适用边界 · 注意事项
- 不适用于服务器脚本;相机设置仅在客户端生效,服务器设置会被静默丢弃。
- 不适用于非 Roblox 引擎或不操作 Roblox 相机/CFrame/屏幕射线的场景。
- 如果只需要 Roblox 默认相机行为,不需要加载此技能。