// 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 ? `平面図 Unity で動かすと
` : "";
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) => `${pic}${name} ${sub} `).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();
};
}