無音の瞬間を作ると、ゲームはどう変わるか
遊びをつくる執筆にClaudeを使用しています。

ボス戦の直前、鳴り続けていたBGMがふっと消える場面を考えてみます。プレイヤーは「何か来る」と身構えるかもしれません。あるいは単に「音が壊れた」と受け取るかもしれません。同じ演出でも、無音の長さや入れる位置で、緊張にも違和感にもなりえます。 この記事は、その違いを自分で確かめるための実験の設計書です。BGMを続ける版と、重要な瞬間の直前でBGMを止める版を用意し、同じ場面で比べます。結果は書きません。準備するもの、手順、記録の取り方、結果の読み方、起こりやすい誤りを順に示します。
問いを絞る:何を「無音」と呼ぶか
「無音にする」には、少なくとも3通りあります。
- 完全無音:BGMも効果音も環境音もすべて止めます。
- BGMだけ停止:効果音や足音は鳴らし続けます。
- 環境音だけ残す:風や水の音を残し、メロディだけ止めます。
条件を混ぜると原因が分からなくなります。この実験では「BGMだけを、重要な瞬間の直前に短く止める」に絞ります。重要な瞬間は、大きな効果音と画面の変化が同時に起きる一点とします。
仮説は、確かめられる形で立てます。たとえば次のようなものです。
- 無音を入れると、その瞬間の「重要さ」の評価が上がる。
- 無音を入れると、瞬間への反応が速くなる。身構えが生まれるためです。
- 無音が長すぎると、評価は上がらず違和感だけが増える。
三つ目のように「効かなくなる境目」を問いに入れておくと、無音の長さを条件として振る理由がはっきりします。
準備するものと最小の実験ページ
用意するものは次のとおりです。
- 実験用のHTMLファイル1つ(下のコードをそのまま使えます)
- 同じヘッドホンまたは同じスピーカー(機器が変わると音量と遅延が変わります)
- 記録用の紙か表計算
- 試してくれる人(数人でも構いません。人数が少ないほど、結果は傾向としてだけ読みます)
変える要素は「直前にBGMを止めるかどうか」の1つだけです。止める以外の音量、効果音、待ち時間はすべて揃えます。
下のコードは、BGM代わりの低い持続音を鳴らします。開始4秒後に低い打撃音を鳴らし、同時に画面を光らせます。B条件では、打撃音の直前に指定した秒数だけBGMを無音にします。光ったらスペースキーを押し、反応時間を記録します。
<!doctype html>
<meta charset="utf-8">
<button id="a">A:音を続ける</button>
<button id="b">B:無音を入れる</button>
<label>無音の長さ(秒)<input id="len" type="number" value="1.5" step="0.5" min="0.5" max="3"></label>
<pre id="log"></pre>
<script>
let ctx, g, t0 = 0, cond = '', len = 0;
const log = s => document.getElementById('log').textContent += s + '\n';
function init() {
if (ctx) return;
ctx = new AudioContext();
const o = ctx.createOscillator();
g = ctx.createGain();
o.type = 'triangle'; o.frequency.value = 220;
o.connect(g).connect(ctx.destination); o.start();
}
function hit(when) {
const o = ctx.createOscillator(), h = ctx.createGain();
o.frequency.value = 110;
h.gain.setValueAtTime(0.5, when);
h.gain.exponentialRampToValueAtTime(0.001, when + 0.4);
o.connect(h).connect(ctx.destination);
o.start(when); o.stop(when + 0.5);
}
function run(c) {
document.activeElement.blur();
init(); cond = c; t0 = 0;
len = +document.getElementById('len').value;
const now = ctx.currentTime, T = now + 4;
g.gain.cancelScheduledValues(0);
g.gain.setValueAtTime(0.1, now);
if (c === 'B') {
g.gain.setValueAtTime(0.1, T - len - 0.1);
g.gain.linearRampToValueAtTime(0, T - len);
g.gain.setValueAtTime(0, T);
g.gain.linearRampToValueAtTime(0.1, T + 1);
}
hit(T);
setTimeout(() => {
document.body.style.background = '#fc6';
t0 = performance.now();
setTimeout(() => document.body.style.background = '', 600);
}, 4000);
}
document.getElementById('a').onclick = () => run('A');
document.getElementById('b').onclick = () => run('B');
addEventListener('keydown', e => {
if (e.code !== 'Space' || !cond) return;
if (!t0) return log(cond + ',' + len + ',フライング');
log(cond + ',' + len + ',' + Math.round(performance.now() - t0) + 'ms');
t0 = 0; cond = '';
});
</script>ブラウザは、画面を操作する前の自動再生を制限しています。そのためBGMは、最初のボタンを押した時点で始まります。
記録の取り方
次の表のとおりに、同じ形式で全員分を記録します。
- 条件、単位:A/B+無音の長さ、取り方:画面のログに出ます
- 反応時間、単位:ミリ秒、取り方:画面のログに出ます
- フライング、単位:回数、取り方:光る前にスペースを押した回
- 重要さの評価、単位:1〜5、取り方:1回の試行ごとに口頭で聞く
- 驚きの評価、単位:1〜5、取り方:同上
- 一言感想、単位:自由記述、取り方:全試行の後に1回
進め方は次のとおりです。
- B条件の無音の長さを、0.5秒、1.5秒、3秒の3種類に決めます。
- 条件ごとに1人あたり5回ずつ行います。A条件も5回です。合計20回なので、長くても10分ほどで終わります。
- 順序は固定せず、人ごとに入れ替えます。「A→B」の人と「B→A」の人を半々にします。
- 評価の質問文は一字一句決めておきます。たとえば「今の瞬間は、どれくらい重要に感じましたか。1から5で答えてください」とし、「緊張しましたか」のような誘導は避けます。
- 無音の長さは、試す人に伝えません。
反応時間は、この簡易ページでは数十ミリ秒の誤差を含みます。絶対値としては信用せず、同じ人のA条件とB条件の差だけを見ます。
結果の読み方
数字が集まったら、まず個人内でAとBを比べます。人ごとに平均を出し、Bのほうが速いか遅いかを見ます。次に、その向きが何人で揃っているかを見ます。ここでは、揃っていれば傾向、バラバラなら「この設定では差が見えなかった」と読みます。
読み方の例を挙げます。
- 反応が速くなり、重要さの評価も上がる:無音が身構えを作った可能性があります。長さを変えて、効く範囲を探します。
- 反応は速いが、評価は変わらない:予告として働いただけで、印象は変わっていない可能性があります。
- 評価は上がるが、反応は変わらない:印象には効いても、操作には影響が出ていない可能性があります。
- 長い無音(3秒)で評価が下がる、またはフライングが増える:待たされた感覚が強まったと考えられます。長さの上限の目安になります。
- 一言感想に「壊れた」「止まった」が目立つ:数字に差がなくても、演出としては失敗している可能性があります。
反応が速くなることは、いつも良いこととは限りません。驚かせたい場面なら、予告が働く無音は狙いに反します。溜めたい場面なら、予告が働くことが成功です。数字を見る前に、自分のゲームがどちらを狙うのかを決めておくと判断がぶれません。
起こりやすい誤り
- 待ち時間が固定のまま: 毎回4秒後に光るので、慣れて予測できるようになります。慣れの影響を減らすには、待ち時間を乱数にし、無音を入れる位置だけを揃えます。待ち時間も変数になるので、最初の実験が済んでから行います。
- BGMがきれいすぎる: 持続音だけのBGMは、止まっても気づきにくいです。実際のゲームに近づけるには、メロディのあるBGMに差し替えます。
- 無音の前後が急すぎる: 音量を一瞬で0にすると「プツッ」というノイズが乗ります。コードでは0.1秒のフェードを入れています。
- スピーカーの遠さや部屋の騒音: 部屋の環境音が大きいと、無音は無音になりません。条件を揃えたうえで、同じ部屋で行います。
- 無線ヘッドホンの遅延: 音が遅れて届くと、光と打撃音のずれが条件間で同じでも、感じ方が変わります。有線で揃えるのが安全です。
- 試す人が目的を知っている: 「無音の効果を見ています」と伝えると、評価が引きずられます。説明は終わってからにします。
- 音が出せない人を忘れる: 無音の演出は、音が聞こえることを前提にしています。アソバースの公式作品「こだまの森」は、音なしでも遊べます。音に頼る演出を入れるときは、暗転や静止などの代替が必要かを考えます。ただし、画面を揺らす演出は「動きを抑える」設定とぶつかる場合があります。「こだまの森」がどう扱っているかは、作品を開いて確かめてください。
次の行動
まず上のコードを保存し、自分とほかの1人で、A条件とB条件を5回ずつ試してください。次に、自作ゲームの一番重要な場面にフェード処理を移します。それから、無音の長さを2種類にして、試す人に遊んでもらってください。ゲームが単独のHTMLで動くなら、アソバースへ直接アップロードして、遊び手の反応を見ることもできます。



