fix(g25): передаём lookAt-точки чтобы камера вращалась к финишу

cameraCutscene без lookAt держит угол постоянным (setTarget не зовётся).
Добавил 3-й arg в __rbxl_camera_cutscene и 4 lookAt-точки указывающие
вдоль пути — камера плавно поворачивается к финишу.
This commit is contained in:
min 2026-06-09 21:44:14 +03:00
parent d4b84cf73d
commit 189a23ff7c
2 changed files with 21 additions and 12 deletions

View File

@ -2166,9 +2166,14 @@ ${SNIPPET_BROADCAST}
local won = false
-- При старте облёт уровня камерой по точкам
-- (точки x,y,z через запятую; segDuration длительность одного отрезка)
__rbxl_camera_cutscene("0,18,-10, 12,12,8, -12,12,18, 0,10,28", 1.8)
-- При старте облёт уровня камерой по точкам.
-- 1-й arg путь камеры (4 точки x,y,z),
-- 2-й длительность одного отрезка,
-- 3-й куда камера смотрит в каждой точке (тоже 4 точки).
__rbxl_camera_cutscene(
"0,18,-10, 12,12,8, -12,12,18, 0,10,28", 1.8,
"0,2,8, 0,2,14, 0,2,20, 0,2,27"
)
local winSound = Instance.new("Sound", workspace)
winSound.SoundId = "win"; winSound.Volume = 1

View File

@ -1966,16 +1966,20 @@ export function registerRobloxShim(lua, opts) {
send('player.heal', { amount: Number(amount) || 0 });
});
// Камера-облёт — паритет с JS game.camera.cutscene(points, opts).
// pointsFlat: x1,y1,z1,x2,y2,z2,... — потому что массив объектов
// в wasmoon через C-boundary неудобен.
global.set('__rbxl_camera_cutscene', (pointsFlat, segDuration) => {
const arr = String(pointsFlat || '').split(',').map((s) => Number(s) || 0);
const points = [];
// pointsFlat/lookAtFlat: x1,y1,z1,x2,y2,z2,... — потому что массив
// объектов в wasmoon через C-boundary неудобен.
global.set('__rbxl_camera_cutscene', (pointsFlat, segDuration, lookAtFlat) => {
const parse = (s) => {
const out = [];
const arr = String(s || '').split(',').map((v) => Number(v) || 0);
for (let i = 0; i + 2 < arr.length; i += 3) {
points.push({ x: arr[i], y: arr[i + 1], z: arr[i + 2] });
out.push({ x: arr[i], y: arr[i + 1], z: arr[i + 2] });
}
return out;
};
send('camera.cutscene', {
points,
points: parse(pointsFlat),
lookAt: lookAtFlat ? parse(lookAtFlat) : [],
segDuration: Number(segDuration) || 1.5,
});
});