// Unity で動かした様子(2026-11-03)。図面のある店ごとに、引き→問題の場所→寄りの動画を1本。 // 条件は Unity の録画の回のもの(試算で選んでいる人数・台数とは別)。動画と表紙の画像は R2(/media/) const UNITY = { fam_p0: { video: "/media/series8_unity_fam_p0_v1.mp4", poster: "/media/series8_unity_fam_p0_v1.jpg", staff: 2, note: "引きで店全体を見たあと、ロボットが長く止まった場所に3か所寄ります(約70秒)" }, fam_p1: { video: "/media/series8_unity_fam_p1_v1.mp4", poster: "/media/series8_unity_fam_p1_v1.jpg", staff: 4, note: "引きで店全体を見たあと、ロボットが長く止まった場所に3か所寄ります(約70秒)" }, fam_p2: { video: "/media/series8_unity_fam_p2_v1.mp4", poster: "/media/series8_unity_fam_p2_v1.jpg", staff: 2, note: "引きで店全体を見たあと、ロボットが長く止まった場所に3か所寄ります(約70秒)" }, fam_p3: { video: "/media/series8_unity_fam_p3_v1.mp4", poster: "/media/series8_unity_fam_p3_v1.jpg", staff: 4, note: "引きで店全体を見たあと、ロボットが長く止まった場所に3か所寄ります(約55秒)" }, fam_p4: { video: "/media/series8_unity_fam_p4_v1.mp4", poster: "/media/series8_unity_fam_p4_v1.jpg", staff: 3, note: "ロボットが30秒以上止まった場所がなかったので、引きだけです(8秒)" }, fam_p5: { video: "/media/series8_unity_fam_p5_v1.mp4", poster: "/media/series8_unity_fam_p5_v1.jpg", staff: 4, note: "引きで店全体を見たあと、ロボットが長く止まった場所に3か所寄ります(約70秒)" } }; let planView = "plan"; function unityPane(k) { const u = UNITY[k]; if (!u) return ""; return `
` + `` + `

${u.note}。動画の条件はふつうの混み具合・スタッフ${u.staff}人・ロボット2台で、上で選んでいる条件とは別です。Unity の中で起きたことで、実際のロボットや人が同じ動きをするとは限りません。

`; } function bigPlan(k) { const s = STORES[k], p = PLANS[k]; if (!p) return ""; const seats = p.tables.reduce((n, a) => n + a[4], 0); const u = UNITY[k], v = u ? planView : "plan"; const sw = u ? `
` : ""; return `
${s.short}${s.tables}卓・${seats}席・外形 ${p.w}m×${p.d}m・厨房(受け渡し口)から卓まで ${s.dist_m[0]}〜${s.dist_m[1]}m(平均${s.dist_mean}m)${sw}
` + `
` + bigPlanSvg(p) + `

白い四角が卓(数字は席数)、黒い帯が料理の受け渡し口、点線がロボットの待機場所、灰色の線が壁・仕切りです。寸法はすべて仮の値です。

` + unityPane(k) + `
`; } function buildLayouts() { const el = document.getElementById("layouts"); const base = baseOf(state.store); const on = LAYOUT_BASES.includes(base); el.hidden = !on; if (!on) return; const fam = STORES[base]; const items = [[base, base === "family" ? "① 図面なし" : "図面なし", `${fam.tables}卓・${fam.dist_m[0]}〜${fam.dist_m[1]}m`, `
距離の幅だけで試算
`]] .concat(LAYOUT_KEYS.filter(k => baseOf(k) === base).map(k => { const s = STORES[k]; return [k, s.short, `${s.tables}卓・${s.dist_m[0]}〜${s.dist_m[1]}m`, PLANS[k] ? planSvg(PLANS[k]) : ""]; })); el.innerHTML = `

店の形を選ぶ(${fam.label})。平面図から、卓の数と厨房から卓までの距離を取ります

` + `
` + items.map(([k, name, sub, pic], i) => ``).join("") + `
` + (isLayout(state.store) ? bigPlan(state.store) : ""); // 動画を見ている状態で店を替えたら、替えた先の店の動画をそのまま読み込んで流す(2026-11-03) const vid = planView === "unity" && el.querySelector(".pv-unity:not([hidden]) video"); if (vid) { vid.src = vid.dataset.src; vid.play().catch(() => {}); } el.onchange = e => { state.store = e.target.value; state.staff = S().staff[1]; state.cbase = S().staff[1]; state.reg = S().registers; buildStores(); buildLayouts(); buildControls(); render(); }; // 平面図と動画の切り替え。動画は押したときに初めて読み込み、そのまま再生する el.onclick = e => { const b = e.target.closest("[data-pv]"); if (!b) return; planView = b.dataset.pv; const box = b.closest(".plan-big"); box.querySelectorAll("[data-pv]").forEach(x => x.setAttribute("aria-selected", String(x === b))); box.querySelector(".pv-plan").hidden = planView !== "plan"; const pane = box.querySelector(".pv-unity"); pane.hidden = planView !== "unity"; const vid = pane.querySelector("video"); if (planView === "unity") { if (!vid.src) vid.src = vid.dataset.src; vid.play().catch(() => {}); } else vid.pause(); }; }