本文へスキップ

制作実績 ・ 2026 ・ 配信中

intro.

自分のプレイリストが、そのままクイズになる

SwiftSwiftUIMusicKitGameKitAVFoundationSpeechSwift Concurrency
intro のプレイ画面
インストール
1,500
役割
企画・設計・実装・運用のすべて
対応
iOS 17.0 以降
対戦形式
ひとり / 1台を分割 / オンライン
収益
広告が主 + 広告非表示の買い切り

解こうとしたこと

イントロクイズは古典的な遊びですが、アプリになった途端に「運営が用意した曲」しか出てこなくなります。知らない曲ばかりが流れて盛り上がらない、という体験の落ち方が起きる。

そこで出題範囲をユーザー側に完全に委ねる設計にしました。Apple Music のプレイリスト、端末内のライブラリ、アーティスト名での検索、人気曲ランキング、よく聴く曲からの自動出題。自分たちが知っている曲だけで場を作れるようにしています。

サブスク前提にしなかった判断

MusicKit をそのまま使うと、Apple Music 未加入のユーザーは何も再生できません。音楽アプリでこれをやると、インストール直後に何もできずに離脱します。

再生を担うアダプタを一枚挟み、加入していればフル尺のイントロを、していなければ iTunes のプレビュー音源を鳴らすようにしました。プレビュー音源の解決に使う API は認証不要で Apple Music の加入も要らないため、未加入のままでも出題が成立します。

この構造にしておくと、出題側は「どこから来た音源か」を知らずに済みます。ゲームのロジックが見るのは、指定した秒数だけ鳴らせるかどうかだけです。

スマホ1台に何人も乗せる

パーティーモードは、画面を人数分に分割して各自が自分の陣地をタップする方式です。専用機材もログインも要らず、飲み会やドライブでそのまま始められることを優先しました。

1 人から 6 人まで、人数ごとに分割の形そのものを変えています。向かい合って置いたときに文字が逆さまにならないよう、対面側のセルは 180 度回転させ、余った区画には再生の操作パネルを埋めています。端末を机に置いて全員で囲む、という使われ方を前提にした割り付けです。

手こずったのは幅の配分でした。等分に伸ばす指定を並べても、操作パネルの中身が画面の半分より広くなると、その分だけ対面のセルが押し潰されます。列の幅を画面幅から計算して明示的に与えることで、誰の陣地も同じ大きさになるようにしています。

早押しの判定自体は、最初に触れた 1 人を採る単純な形にしました。タップではなく指が触れた瞬間に発火させています。指を離すまで待つ作りにすると、早押しとしては明らかに遅いためです。

離れていても同じ問題を解く

オンライン対戦は Game Center の上に載せています。ランダムマッチと、招待コードで友達とつなぐフレンドマッチの 2 種類があります。

対戦で担保しなければならないのは「二人が同じ曲順・同じ選択肢で解いていること」です。ここを各端末が独立にシャッフルすると、片方だけ簡単な問題になってしまう。そこでレースごとの ID から決まる共通のシードを配り、それを元に各端末が自分で出題を組み立てる形にしました。通信で配るのは結果とシードだけで、曲そのものは流れません。

接続の状態管理は、素朴に「つながっているか否か」の真偽値で扱っていた時期に痛い目を見ました。接続が確立する前に失敗した場合と、そもそもまだ何もしていない場合が、どちらも同じ値に潰れてしまう。重複を除いて流す仕組みが前者を握り潰し、40 秒の監視タイマーが起きるまで復旧できませんでした。失敗を独立した状態として型に持たせて、この構造そのものを無くしています。

Game Center から渡されるプレイヤー情報は、そのままだとスレッドを跨いで触れません。デリゲートが呼ばれた側で ID と表示名だけを値型に写し取ってから渡すことで、データ競合を型のレベルで防いでいます。

知らない曲を出さない

ランダムマッチで一番効いたのは、出題範囲の決め方でした。イントロクイズは知っている曲でしか成立しません。見知らぬ相手と当たったとき、どちらか一方しか知らないアーティストを出すと、その問題は片方にとって答えようがなく、勝負として壊れます。

そこで二人の共通部分だけを出題範囲にしています。優先するのは「両者が過去に正解したことのある曲」で、これは実際に答えられた証拠なので最も確実です。それが足りなければ両者が登録しているアーティストの積集合、それも足りなければ地域のチャート上位に落とします。

和集合にはしていません。相手の好きなアーティストは自分にとって未知である可能性が高く、「知らない曲を出さない」という目的に真っ向から反するためです。共通項が無い二人には、流行っている曲の方がまだ当たります。

この判定は純粋な関数として切り出してあります。オンラインの経路は実機 2 台がないと試せませんが、ここだけは単体で検証できる。壊れると対戦が成立しなくなる中核なので、テストを厚くしています。

声で答える

早押しの回答中は、マイクに曲名を声で答えることもできます。運転中や手が塞がっているときでも遊べるようにするためです。

音声認識と選択肢タップは排他にせず、併存させています。認識が外れたときに何も操作できなくなるのを避けるためで、音声はあくまで近道として置いています。現時点ではベータとして出しています。

ご相談

こういうものを作っています.

設計の判断からご一緒できます。
まだ形になっていない段階のご相談も歓迎です。