From 189a23ff7ceeed5aaff7de6597b4f50c95b2bf2a Mon Sep 17 00:00:00 2001 From: min Date: Tue, 9 Jun 2026 21:44:14 +0300 Subject: [PATCH] =?UTF-8?q?fix(g25):=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B0=D1=91=D0=BC=20lookAt-=D1=82=D0=BE=D1=87=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=87=D1=82=D0=BE=D0=B1=D1=8B=20=D0=BA=D0=B0=D0=BC=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=20=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=BB=D0=B0=D1=81=D1=8C?= =?UTF-8?q?=20=D0=BA=20=D1=84=D0=B8=D0=BD=D0=B8=D1=88=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cameraCutscene без lookAt держит угол постоянным (setTarget не зовётся). Добавил 3-й arg в __rbxl_camera_cutscene и 4 lookAt-точки указывающие вдоль пути — камера плавно поворачивается к финишу. --- src/community/docsGamesBuildersLua.js | 11 ++++++++--- src/editor/engine/lua/RobloxShim.js | 22 +++++++++++++--------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/community/docsGamesBuildersLua.js b/src/community/docsGamesBuildersLua.js index ff98dc6..7f14797 100644 --- a/src/community/docsGamesBuildersLua.js +++ b/src/community/docsGamesBuildersLua.js @@ -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 diff --git a/src/editor/engine/lua/RobloxShim.js b/src/editor/engine/lua/RobloxShim.js index 00af0d4..5480426 100644 --- a/src/editor/engine/lua/RobloxShim.js +++ b/src/editor/engine/lua/RobloxShim.js @@ -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 = []; - for (let i = 0; i + 2 < arr.length; i += 3) { - points.push({ x: arr[i], y: arr[i + 1], z: arr[i + 2] }); - } + // 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) { + 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, }); });