Skip to content
keijiro edited this page Oct 23, 2014 · 12 revisions

プロジェクトの基本構造について

まず Main シーンを開いた瞬間、こう思うはずです。

「シーンが空っぽなんですけど」

Screenshot

シーンが空っぽなのは、何も配置されていないからです。すべてのオブジェクトは実行後にインスタンス化されます。

「わかりにくいんですけど」

すみません。わかりにくくてすみません。でもこれには理由があるんです。

CRS プロジェクトに含まれるほとんどのオブジェクトはプレハブの中に固められています。

Screenshot

これらのプレハブはシーンの構成要素毎に分けてまとめられています。

もし、これらの構成要素が直にシーンに置かれていたとすると、このプロジェクトに参加するメンバー全員が同時に1つのシーンファイルを編集することになってしまいます。当然、変更内容のコンフリクトが生じることになりますが、複雑な構成のシーンファイルを手作業でマージするのは大変困難な作業です。できれば避けたいところです。

そこで、構成要素をプレハブに分け、変更範囲を単一プレハブの内部に止め、なるべくシーンファイルには手をつけないようにする、というポリシーを敷くことになるわけです。

なお、この問題はチームでの共同作業において問題となるだけでなく、Git リポジトリ上でのブランチ管理でも問題になります。ブランチ上の変更を本流へマージしたり、本流上での変更を rebase でブランチに伝えたりすることが、ひどく面倒になるわけです。これは Oculus VR 版や Gear VR 版、Vuforia 版や WebGL 版など、多数のバリエーションを扱う必要のあった CRS プロジェクトにおいては、大きな問題となりました。

このようにプレハブへの分割を行うにしても、そのプレハブをシーンに配置しておけばいいじゃないか、と思われるかもしれません。残念ながら Unity 4 においては、これはあまり望ましい結果を導きません。Unity 4 はシーンファイルの中にプレハブの内容も含めてしまう設計になってしまっているためです。そのため、プレハブのみへの変更もシーンファイルへ波及してしまいます。

ちなみに、Unity 5 ではこの点は改善されていて、プレハブの内容はシーンファイル内に保存されないようになりました。この改善により、今回の CRS プロジェクトのような分かりにくい設計は不要になるはずです。

シーン構成

Scene Name 内容
Main メインのライブステージ
WaitingRoom タイトル画面的なもの
Character Setup キャラクター設定のためのテストシーン

何か新しいフィーチャーを実装する際には、Character Setup のような専用のテストシーンを用意して作業することをお勧めします。

各プレハブの機能について

キャラクター系

Prefab Name 内容
CandyRockStar セットアップ済みユニティちゃんモデル
CaracterLight ユニティちゃん専用ライト
LipSyncController 口パクコントローラー

音楽系

フルコーラス(約4分)のバージョンと、尺の短いバージョン(約1分45分)のバージョンがあります。またそれぞれ、スペクトルアナライザー付きのものと、スペアナを無くして軽量化したものを用意してあります。

Prefab Name 内容
MusicPlayer フル、スペアナ付き
MusicPlayer (short) ショート、スペアナ付き
MusicPlayer (simple) フル、スペアナ無し
MusicPlayer (simple, short) ショート、スペアナ無し

カメラ系

Prefab Name 内容
Main Camera Rig メインカメラシステム
Back Screen Camera Rig 中継スクリーン用カメラシステム

ステージギミック系

Prefab Name 内容
Confetti 紙吹雪(多め)
Confetti (light) 紙吹雪(軽量版)
Laser レーザービームのモデル/アニメーション
Visualizer 床面エフェクト(ビジュアライザー)

背景物

Prefab Name 内容
Background 遠景
Stage ステージ上の静止物

演出の制御

曲の進行に合わせた演出の制御は Stage Director オブジェクトが行っています。

Screenshot

この Stage Director はアニメーションカーブとアニメーションイベントによって制御されています。

Screenshot

ちょっと分かりにくいのは短縮バージョンの挙動です。FastForward というイベントが発動されることによって無理やり全体の進行をショートカットして実現しています。

Screenshot

このイベントは IgnoreFastForward が true の場合は無視されます。これにより、フルコーラスにするか、ショートバージョンにするか、という切り分けができるわけです。

なお、楽曲についてはプログラム的に縮めようとするとかなりしんどいことになりますので、単純にフルコーラス版とショートバージョンを別々に用意してあります。

口パクの仕組み

口パクは簡単な手付けによって実現されています。

Screenshot

このアニメーションカーブは Max 上で作成されたもので、各ノードのZ座標がブレンド率に対応するよう作られています。これを適当にフィルタリングしつつ blend shape のブレンド率として設定するための処理が LipSyncController.cs に書かれています。

Music Player の構造について

Music Player は少し変な作りになっています。

Screenshot

これら5つの Game Object がそれぞれ1つずつストリームを再生しています。実際に音を出しているのは1つだけで、あとの4つはスペクトル分析を行うためのものです。

アホみたいな実装ですが、これは Unity 5 の Audio Mixer への移行を見越して敢えてモジュラー性の高い設計を選んだがゆえのアホさです。許してください。もっとも、デスクトッププラットフォームであれば負荷的にも問題にならないので、もとよりこんなもんかなと思います。

ただし、モバイルプラットフォームなどでは問題になると思いますので、そういう場合は simple バージョンを使ってください。

Clone this wiki locally