マガジン

無音の瞬間を作ると、ゲームはどう変わるか

遊びをつくる

執筆にClaudeを使用しています。

成功、失敗、選択に応じた三種類の音を、異なる形の響きで表したイラスト。
記事のテーマをもとに制作したAI生成イラスト。

ボス戦の直前、鳴り続けていたBGMがふっと消える場面を考えてみます。プレイヤーは「何か来る」と身構えるかもしれません。あるいは単に「音が壊れた」と受け取るかもしれません。同じ演出でも、無音の長さや入れる位置で、緊張にも違和感にもなりえます。 この記事は、その違いを自分で確かめるための実験の設計書です。BGMを続ける版と、重要な瞬間の直前でBGMを止める版を用意し、同じ場面で比べます。結果は書きません。準備するもの、手順、記録の取り方、結果の読み方、起こりやすい誤りを順に示します。

この記事の目次
  1. 問いを絞る:何を「無音」と呼ぶか
  2. 準備するものと最小の実験ページ
  3. 記録の取り方
  4. 結果の読み方
  5. 起こりやすい誤り
  6. 次の行動

問いを絞る:何を「無音」と呼ぶか

「無音にする」には、少なくとも3通りあります。

  • 完全無音:BGMも効果音も環境音もすべて止めます。
  • BGMだけ停止:効果音や足音は鳴らし続けます。
  • 環境音だけ残す:風や水の音を残し、メロディだけ止めます。

条件を混ぜると原因が分からなくなります。この実験では「BGMだけを、重要な瞬間の直前に短く止める」に絞ります。重要な瞬間は、大きな効果音と画面の変化が同時に起きる一点とします。

仮説は、確かめられる形で立てます。たとえば次のようなものです。

  • 無音を入れると、その瞬間の「重要さ」の評価が上がる。
  • 無音を入れると、瞬間への反応が速くなる。身構えが生まれるためです。
  • 無音が長すぎると、評価は上がらず違和感だけが増える。

三つ目のように「効かなくなる境目」を問いに入れておくと、無音の長さを条件として振る理由がはっきりします。

準備するものと最小の実験ページ

用意するものは次のとおりです。

  • 実験用のHTMLファイル1つ(下のコードをそのまま使えます)
  • 同じヘッドホンまたは同じスピーカー(機器が変わると音量と遅延が変わります)
  • 記録用の紙か表計算
  • 試してくれる人(数人でも構いません。人数が少ないほど、結果は傾向としてだけ読みます)

変える要素は「直前にBGMを止めるかどうか」の1つだけです。止める以外の音量、効果音、待ち時間はすべて揃えます。

下のコードは、BGM代わりの低い持続音を鳴らします。開始4秒後に低い打撃音を鳴らし、同時に画面を光らせます。B条件では、打撃音の直前に指定した秒数だけBGMを無音にします。光ったらスペースキーを押し、反応時間を記録します。

html
<!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回

進め方は次のとおりです。

  1. B条件の無音の長さを、0.5秒、1.5秒、3秒の3種類に決めます。
  2. 条件ごとに1人あたり5回ずつ行います。A条件も5回です。合計20回なので、長くても10分ほどで終わります。
  3. 順序は固定せず、人ごとに入れ替えます。「A→B」の人と「B→A」の人を半々にします。
  4. 評価の質問文は一字一句決めておきます。たとえば「今の瞬間は、どれくらい重要に感じましたか。1から5で答えてください」とし、「緊張しましたか」のような誘導は避けます。
  5. 無音の長さは、試す人に伝えません。

反応時間は、この簡易ページでは数十ミリ秒の誤差を含みます。絶対値としては信用せず、同じ人のA条件とB条件の差だけを見ます。

結果の読み方

数字が集まったら、まず個人内でAとBを比べます。人ごとに平均を出し、Bのほうが速いか遅いかを見ます。次に、その向きが何人で揃っているかを見ます。ここでは、揃っていれば傾向、バラバラなら「この設定では差が見えなかった」と読みます。

読み方の例を挙げます。

  • 反応が速くなり、重要さの評価も上がる:無音が身構えを作った可能性があります。長さを変えて、効く範囲を探します。
  • 反応は速いが、評価は変わらない:予告として働いただけで、印象は変わっていない可能性があります。
  • 評価は上がるが、反応は変わらない:印象には効いても、操作には影響が出ていない可能性があります。
  • 長い無音(3秒)で評価が下がる、またはフライングが増える:待たされた感覚が強まったと考えられます。長さの上限の目安になります。
  • 一言感想に「壊れた」「止まった」が目立つ:数字に差がなくても、演出としては失敗している可能性があります。

反応が速くなることは、いつも良いこととは限りません。驚かせたい場面なら、予告が働く無音は狙いに反します。溜めたい場面なら、予告が働くことが成功です。数字を見る前に、自分のゲームがどちらを狙うのかを決めておくと判断がぶれません。

起こりやすい誤り

  • 待ち時間が固定のまま: 毎回4秒後に光るので、慣れて予測できるようになります。慣れの影響を減らすには、待ち時間を乱数にし、無音を入れる位置だけを揃えます。待ち時間も変数になるので、最初の実験が済んでから行います。
  • BGMがきれいすぎる: 持続音だけのBGMは、止まっても気づきにくいです。実際のゲームに近づけるには、メロディのあるBGMに差し替えます。
  • 無音の前後が急すぎる: 音量を一瞬で0にすると「プツッ」というノイズが乗ります。コードでは0.1秒のフェードを入れています。
  • スピーカーの遠さや部屋の騒音: 部屋の環境音が大きいと、無音は無音になりません。条件を揃えたうえで、同じ部屋で行います。
  • 無線ヘッドホンの遅延: 音が遅れて届くと、光と打撃音のずれが条件間で同じでも、感じ方が変わります。有線で揃えるのが安全です。
  • 試す人が目的を知っている: 「無音の効果を見ています」と伝えると、評価が引きずられます。説明は終わってからにします。
  • 音が出せない人を忘れる: 無音の演出は、音が聞こえることを前提にしています。アソバースの公式作品「こだまの森」は、音なしでも遊べます。音に頼る演出を入れるときは、暗転や静止などの代替が必要かを考えます。ただし、画面を揺らす演出は「動きを抑える」設定とぶつかる場合があります。「こだまの森」がどう扱っているかは、作品を開いて確かめてください。

次の行動

まず上のコードを保存し、自分とほかの1人で、A条件とB条件を5回ずつ試してください。次に、自作ゲームの一番重要な場面にフェード処理を移します。それから、無音の長さを2種類にして、試す人に遊んでもらってください。ゲームが単独のHTMLで動くなら、アソバースへ直接アップロードして、遊び手の反応を見ることもできます。