关于 roblox-camera
Roblox Camera 是用于编写客户端摄像机行为的开发技能,涵盖自定义视角、CFrame 变换和屏幕射线检测。它提供 API 指引、实现模式及常见注意事项。
主要功能
- 01CameraType 与摄像机属性指导
- 02CFrame 定位与旋转
- 03PreRender 摄像机更新循环
- 04屏幕与视口射线检测
- 05自定义摄像机效果示例
适用场景
- 01制作过场动画和第三人称视角
- 02实现自定义摄像机旋转
- 03从屏幕坐标发射射线
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ tabooharmony/ roblox-brain --skill roblox-camera安装后在 Claude Code 中输入/roblox-camera确认已加载。
附带文件references/full.md
详细介绍
Roblox Camera
加载时机
在编写自定义摄像机行为(过场动画、第三人称跟随、自定义旋转)、通过 CFrame 控制位置或旋转、从屏幕进行射线检测,或构建非默认玩家视角时加载。仅限客户端。
快速参考
摄像机:workspace.CurrentCamera:每个客户端一个。将 CameraType = Scriptable 设为禁用默认行为并完全接管控制。否则,默认行为会在每一帧覆盖你的 CFrame。
CameraType:Fixed、Attach/Watch/Track/Follow(跟随主体)、Custom(默认)、Scriptable(无默认行为)、Orbital(固定 Y,绕玩家旋转)。CameraSubject 不能为 nil:设置后会恢复原值。
关键属性:CFrame、CameraSubject、FieldOfView(度)、FieldOfViewMode(Vertical/Diagonal)、NearPlaneZ、ViewportSize、HeadLocked、HeadScale、Focus。
CFrame 基础知识:
| 操作 | Luau |
|---|---|
| 仅设置位置 | CFrame.new(position) |
| 朝向目标 | CFrame.lookAt(position, target, upVector) |
| XYZ 旋转 | CFrame.Angles(rx, ry, rz) |
| 从局部坐标转换为世界坐标 | cf * Vector3.new(0, 0, 10) |
| 插值 | cf:Lerp(goal, alpha) |
| 单位轴 | cf.LookVector、cf.RightVector、cf.UpVector |
自定义摄像机循环:始终使用 PreRender,不要使用 Heartbeat:
camera.CameraType = Enum.CameraType.Scriptable
RunService.PreRender:Connect(function(dt)
local desired = CFrame.lookAt(head.Position - offset, head.Position)
camera.CFrame = camera.CFrame:Lerp(desired, math.min(dt * 10, 1))
end)
从摄像机进行射线检测:camera:ScreenPointToRay(mx, my)(会考虑 GUI inset)与 camera:ViewportPointToRay(mx, my)(原始坐标,不考虑 inset)。ScreenPointToRay 返回单位射线(1 stud);将 Direction 乘以长度以进行实际射线检测。
注意事项:
- 仅限客户端。服务端设置会被静默丢弃。
- 如果不使用
Scriptable,默认行为会在每一帧覆盖你的 CFrame。 - 摄像机应使用
PreRender(视觉同步)。Heartbeat会增加 1 帧延迟。RenderStepped仍可用,但已被PreRender取代。 Camera.CFrame不包含 VR 头部旋转;要获取真实视角,请使用GetRenderCFrame()。SetRoll已过时;应通过对 CFrame 应用CFrame.Angles(0, 0, roll)来实现滚转。CFrame.new(pos, lookAt)是旧版接口(仅为向后兼容);新代码请使用CFrame.lookAt(at, lookAt)。
参见 references/full.md,了解第一人称/第三人称方案、过场动画、屏幕抖动、鼠标视角及完整 API。