見出し画像

BeatSaberでカメラを動かしてみよう

こんにちは。BeatSaberを楽しんでいますか?
今回は第三者視点(アバターが画面に映る視点)で遊んでいる人向けの記事になります。第三者視点はCameraPlusCamera2のmodを利用することで表示できますが、通常はカメラの位置を固定していると思います。
実はCameraPlusやCamera2にはスクリプトと呼ぶ、カメラを指定した位置と時間で動かす機能があります。
この機能は昔からあるのですが、なにぶんスクリプトを作るのが結構大変で、カメラの座標と角度と移動時間を考えながら数値で直接打ち込む作業が必要でした。1年ぐらい前まではこの状況が続いていましたが、最近は支援ツールが充実しスクリプトの作成環境が大幅に改善しました。
今回はそのツールを使用して、だれでも簡単にカメラスクリプトが作れることを紹介したいと思います。

※なお、今回はCameraPlusの使用を前提とした説明になっています。Camera2でも同様なことは可能ですが、手順が難しかったり、曲専用のスクリプトが使えないなど一部機能に制限があるため、今回作成したスクリプトの使用はCameraPlusで使用することをお勧めします。


ツールのダウンロードとインストール

ChroMapperのインストール

まずは、ChroMapperと言う譜面作成ツールのダウンロードとインストールから始めましょう。こちらからダウンロードして下さい。
(なお、ChroMapperは各種OS版がありますが、このあとインストールするプラグイン等がWindows専用のためご了承ください)

ダウンロードしたCML.exeの実行場所がインストールの起点となるので、適当にフォルダを作成して、そこにCML.exeを保存します。
ただし、保存するフォルダはドライブ名から保存フォルダまで半角英数字だけの場所にしないと、プラグインの読み込みでエラーが出る場合があります。(デスクトップ等は止めて C:\TOOL\ChroMapper などにして下さい)

CML.exeを実行すると、自動的に最新版のChroMapperがダウンロード&インストールされて起動します。

ChroMapperの初回起動画面

ChroMapperが起動すると、上記画面が出ますのでBeat Saber InstallationがBeatSaberのインストールフォルダになっているか確認します。

BeatSaberのインストールされているPCなら自動的に設定されていると思います、BeatSaberがインストールされていないPCの場合はBSMGGitからmapping-folders.zipをダウンロードして適当なフォルダに解凍して下さい。
そして解凍先のフォルダをBeat Saber Installationに設定して下さい。

Languageは日本語も選べますが、現在のバージョンでは、まだ文字化けやレイアウト崩れが発生します。お好みで選択して下さい。なお説明はEnglishのまま進めます。

Let's go!を押してChroMapperの起動を確認したらQuitで一度ChroMapperを閉じて下さい。

Camera Movementのインストール

次に、私が製作しているChroMapper-CameraMovementと言うChroMapperでカメラスクリプトのプレビューをするプラグインをインストールします。

ここから、最新版のChroMapper-CameraMovement-*.*.*.zipをダウンロードして解凍します。解凍したChroMapper-CameraMovement.dllをChroMapperのインストールフォルダにある、Pluginsフォルダにコピーします。

ChroMapper-CameraMovementプラグインのインストール

Script Mapperのインストール

次にhibitさんが製作されているScript Mapperと言う、作譜ツールを使用してカメラスクリプトを作成するツールをインストールします。

ここから、最新版のScriptMapper*.**.zipをダウンロードして解凍します。解凍した中にあるScriptmapper.exeをChroMapperのインストールフォルダにコピーします。

ScriptMapperのインストール

ツールのインストールは以上です。

スクリプト作成の準備

スクリプト作成用譜面の準備

次にカメラスクリプトを作成したい譜面データをCustomWIPLevelsフォルダにコピーして下さい。今回の説明ではbsr 1b311 を参考に使用します。
スクリプト作成を行う過程で譜面データを編集するため、CustomLevelsフォルダのデータを編集すると、譜面のIDが変更されてしまいScoreSaberと連動が効かなくなるため、必ずCustomWIPLevelsフォルダで作業を行います。

ここまで準備が出来たら、CML.exeを実行してChroMapperを起動します。
※ChroMapper.exeを実行しても起動しますが、CML.exeの方が最新版のチェック機能があるため、CML.exeから起動することをオススメします。

起動すると、WIP Levelsに先程コピーした譜面データがあると思いますので、選択して下さい。

WIP Levelsにコピーしたカメラスクリプト作成用譜面を選択

譜面の情報画面が表示されるので、右側の難易度選択でカメラスクリプトを作成したい難易度を選択してOpen Editorで開きます。
なお、作成したスクリプトは選択した難易度以外でも同じ曲ならどれでも使えます。ただし、配置されているノーツを参考にスクリプトを作成するので、実際にプレイする難易度を選択した方が良いでしょう。

難易度選択画面

アバターの表示と調整

Open Editor押して編集画面を起動すると、なんかピンク色の棒人間が表示されます。

ピンクの棒人間

これは、アバターの代わりですがせっかくなので自分が使用しているアバターに変更しましょう。TABキーを押すと右にパネルが表示されますので、水色のカメラのアイコンをクリックして下さい。

CameraMovementのアイコン

次に、開いたCameraMovementのパネルからMore Settingsを選択します。

More Settingsを選択する

More Settingsのパネルが開きますので、Avatar Fileの項目をSelectで自分の使用しているアバターのファイルに変更します。アバターファイルはVRM(*.vrm)とカスタムアバターに(*.avatar)対応しています。BeatSaberでアバター表示している場合は、どちらかを使用しているはずです。

Avatar Fileの変更

なお、アバター表示していない場合はSour Miku Black v2がデフォルトになっていますので、ChroMapperのインストールフォルダに置いて下さい。
でも、スクリプト作る場合はアバターを使用しているハズですよね?

アバターを選択したら、Custom or VRM Avatarをチェックするとアバターが表示されると思います。表示されない場合はReloadボタンを押して下さい。
VRMファイルの場合は表示まで数秒(5~10秒)かかります。
なお、本記事で使用させて頂いたVRMのアバターはくりねこちゃんです。

アバターファイルの表示

次に、アバターのサイズ調整を行います。デフォルトで読み込んだままだとサイズが合っていないので、BeatSaberでプレイするときもキャリブレーションを行ってサイズ調整をしていると思います。
CameraMovementでも、同じようにサイズ調整が必要ですが、キャリブレーションは出来ないので数値で直接合わせる必要があります。
本来は何らかの方法でBeatSaber内でキャリブレーション後のアバターサイズを測定して、それに合わせる必要がありますが、簡易的に自分の身長から判断しましょう。
(もっと正確に合わせたい場合は、BeatSaberの画面と本ツールで同じカメラ位置にして、同じアバターサイズになるように調整して下さい)

その前に、ChroMapper内でのカメラの動かし方を説明します。マウスの右クリックを押しながら、キーボードのWASDで前後左右に移動します。Ctrlが下、スペースキーが上移動です。マウスを動かすとカメラの角度が変わります。
また、最新版ではALTを押しながらアバター中心の移動、Zキーを押しながらマウス操作での移動ができます。詳しくはキーボードショートカットを参照して下さい。


アバターの正面にカメラを移動したら、More SettingパネルのHead Hightの値を自分の身長-15cm(顔の中心)に設定します。設定値はm単位なので、身長175cmの場合は1.6[m]と設定します。次に、ピンクのアバター表示に合うように、Avatar Scaleの値を調整します。

Simple Avatarの身長設定と、アバターサイズの調整
ピンクのアバターと、アバター表示が重なる様にAvatar Scaleを調整

調整が終わったら、Simple Avatarのチェックを外してピンクのアバターを消してから、Setting Saveボタンで保存して、Closeで閉じます。

設定の保存

作業画面用レイアウトの決定と保存

次に、作業画面用のカメラ位置の保存をします。カメラ位置はお好みですが、下記画面のレイアウトが作業しやすいと思います。位置が決まったら、Ctrl + F5 キーで保存して下さい。これで、いつでもF5キーで今のカメラ位置に移動します。ちなみに、カメラ位置はF5~F8まで保存できます。またShiftを押しながらも別に保存できるので、合計8箇所保存できます。

作業用カメラ位置の決定

スクリプトの作成

ツールの準備も出来たら、早速スクリプトを作成していきましょう。
CameraMovementパネルの下5つがチェックされている事を確認します。

スクリプト作成用ツールのチェック

カメラ移動速度の調整

スクリプトは、実際に写したい位置に右クリック+WASDでカメラを移動して作成していきます。その際にカメラの移動速度が速すぎるので、設定で調整します。ESCキーでOptionsを選択して、Settingsパネルの左にあるカメラアイコンのControlsを選択して、VisualsのMouse SensitivityCamera Speedの値を下げて下さい。どちらも最低値にして良いと思います。

マウス感度とカメラ移動スピードの調整

なお、Camera SpeedはカメラコントロールパネルのMove Speedと連動しているので、場面によっていつでも変更できますし、設定画面で出来なかった5未満の値にも設定可能です。

カメラコントロールパネルのカメラ移動スピード設定

カメラ移動の始点と終点の決定

まず、カメラスクリプトで移動したい始点にカメラを移動します。
今回はアバターの右斜め後ろにしましょう。

カメラを始点に移動、アバターの右斜め後ろ

移動したらカメラコントロールパネルのCopyボタンを押します。
その際にq formatがチェックされていることを確認して下さい。

q formatでカメラ位置をコピーする

コピーしたら、ブックマーク編集パネルのEmptyにCtrl + vで貼り付けます。

始点のカメラ位置を貼り付ける

次にカメラを終点に移動します。
今回はそのまま左に移動して、丁度反対側ぐらいにします。

カメラを終点に移動、始点から真横に移動してアバターの左斜め後ろ

移動したら同じ様にCopyして始点と終点の間に,(カンマ)を入れてから終点のカメラ位置を貼り付けます。

始点と終点のカメラ位置を入力

始点と終点のタイミングの決定

F5キーでカメラを元に戻して、カメラを移動したい始点のタイミングにマウスホイールで移動します。曲を聴く場合はスペースキーで再生・停止します。とりあえず今回は、曲のスタート0拍目に設定します。ブックマーク編集パネルのNewボタンでブックマークを設定して下さい。

ブックマークにコマンドを追加

なお、コマンドがライティング用のエリアに重なって見切れてしまうのが嫌な場合は、More SettingsのBookmark Areaで調整可能です。
また、v1.7.0以降はBookmark Size(%)で文字サイズも変更可能です。100が標準で値を小さくするとサイズが小さくなります。

ブックマーク表示エリアの調整

次に終点のカメラ位置になるタイミングまで曲を進めます。
移動したら、Bキーを押して、ブックマークの入力画面を表示してstopとコマンドを打ち込みます。なお、今回は20拍目を終点にしてみます。

終点タイミングにstopコマンドを入力

ScriptMapperの実行とプレビュー

入力が出来たら早速確認して見ましょう。
CameraMovementパネルのScript Mapper Runボタンを押します。

Script Mapper の実行

なんか、一瞬黒い画面が表示されたと思います。もし入力内容に問題がある場合は下記画面の様なエラー表示が出ますので、赤字の内容を確認して下さい。また、エラー内容の詳細を確認したい場合は、譜面フォルダに生成されているlog_latest.txtを開いて確認して下さい。

ScriptMapperのエラー
ScriptMapperのログファイル

では早速確認してみましょう。カメラ移動の始点タイミング(今回は0拍目)に移動して、CameraMovementのMovement Enableをチェックしてスペースキーで再生して下さい。

カメラワークのプレビュー

どうでしょうか?結構簡単に作れると思いませんか?
カメラスクリプトと言うと、以前まではカメラの座標や角度、移動時間など全て数値で考えて作っていく必要があったのですが、ここまでその説明を一切無しでスクリプトの作成ができました。これは、ブックマークにコマンドを入力することで、カメラスクリプトの作成ができるScriptMapperのおかげです。

ScriptMapperのコマンドの説明

では、先程ブックマークに入力したコマンドの説明をします。

0拍目:q_1.38_1.5_-1.9_3.7_359.2_0_60,q_-1.29_1.5_-1.94_3.7_359.2_0_60

20拍目:stop

0拍目のこれは,(カンマ)で区切ってカメラ移動の始点,終点位置を指定しています。始点のタイミングはそのブックマークを入力したタイミング、つまり0拍目です。終点のタイミングは次のブックマーク入力位置、つまり20拍目です。始点と終点の間は自動的に位置が補完されて連続的に変化していきます。
次に20拍目のstopは、ここでカメラ移動をストップする意味になります。なので以降はカメラが移動しません。
20拍目でカメラを止めずに別のカメラワークを続けて入れたい場合は、stopの代わりに0拍目の様な始点,終点入力をすれば引き続きカメラが移動していきます。

試しに20拍目から36拍目までアバターを中心にカメラを回転させてみましょう。まず、先程の20拍目に移動します。
ブックマークの移動は@[のショートカットキーで出来ますので覚えて置いてください。
20拍目に移動したら、ブックマークパネルのChangeボタンを押して内容を変更します。変更する内容はrotate4,1.6,1.6,0です。1.6の部分はアバターの身長設定で設定したHead Hightの値と同じにして下さい。1.5の場合はrotate4,1.5,1.5,0です。rotateの場合はこれ一つで始点終点を含む(1回転する)ので,(カンマ)で区切って終点指示は不要です。

20拍目のコマンドを変更

次に終点位置の36拍目に移動してBキーでブックマークを追加で、stopを追加して下さい。

36拍目にstopを追加

入力が出来たら早速確認です。Script Mapper Runでブックマークのコマンドをカメラスクリプトに変換して下さい。
今回はUIも消して実際のプレイ画面のイメージに近くしてみましょう。
Ver1.5.0以降はF4キーで実際のプレイ画面を再現したプレビューモードのON/OFFができます。

実際のプレイ画面に近い表示に設定

なお、上記CameraMovementパネルはTABキーを押した時のカメラアイコンをクリックすると閉じます。

Camera Movementパネルの閉じ方

では、曲の最初に移動(セミコロンで移動します)してスペースキーで再生してみましょう。
ちなみに、スペースキーを押しっぱなしにすると離した時に押した場所に戻りますので、何度も確認する場合に便利です。

再生したカメラワーク

どうでしょうか?先程のカメラワークに続けてアバター中心で回転するようになりました。この様に回転などの難しい移動もScriptMapperの機能を使用すると簡単に実現することができます。

ScriptMapperには他にも色々コマンドが用意されています。ここでは紹介しきれませんので、詳細はScriptMapperのREADMEをよく読んでください。

よくある質問でカメラの移動に緩急(イージング)を付けたいと言うのがありますが、こちらはScriptMapperのWikiAdvanced Documentに説明があります。他にも、環境コマンドなど様々な機能があります。とりあえずコマンドを打ってみて、プレビューして覚えていくのが良いと思います。

また、hibitさんがScriptMapper開発時の記事を下記に投稿されています。
記事の最後にはScriptMapperのDiscordサーバの紹介もあります。
ScriptMapperのREADMEやWikiにまだ記載が無い機能の確認や、使い方の質問などは、Discordの方で行われていますので、参加されることをオススメします。私も参加していますので、Camera Movementの質問や要望もここでしてもらっても構いません。

その他便利機能

さて、作業に慣れてくると、いちいちMovement Enableを押して確認するのもカメラ位置が変わってしまって面倒です。(F5キーで戻れますが)
そのため、常にカメラスクリプトの動きを再現するサブカメラ機能があります。CameraMovementパネルのSub Cameraをチェックすると左上に表示されます。(なお、Movement Enableのチェックを外さないとサブカメラは表示されません)

サブカメラの表示

なお、サブカメラの位置や大きさはMore Settingsに設定がありますので調整して下さい。Ver1.5.0以降はCursor Key Move,Sizeボタンを押すとカーソルキーで調整できます。

サブカメラの調整

あと、スクリプトを作成しているとブックマークの数が増えてきて、タイムライン上のマークが判りづらくなると思います。その場合は、More SettingsにBookmark Widthの設定がありますので、適当に値を小さくして下さい。

タイムライン上のブックマークの幅を3に縮めた

ブックマーク編集パネルの右上にある、プリセットコマンド(center ~ random)のボタンは、ボタンを押すと編集ボックスの末尾にコマンドを追加してくれますが、このボタンの内容は自由に変更可能です。
パネルにあるSetをチェックして、各ボタンを押すと入力内容がボタンに登録されます。よく使用するコマンド(イージングコマンド等)を登録すると便利だと思います。登録したらメインパネルにあるSetting Saveで保存を忘れずに行って下さい。

よく使用するコマンドをボタンに登録できる

各設定パネルは、Shiftキーを押しながら左ドラッグで好きな位置に移動可能です。

各パネルはShift+左ドラッグで移動可能

カメラスクリプトでのプレイ

カメラスクリプトが作成し終えたら、実際にそれでプレイしてみます。ScriptMapperはスクリプト生成時にCustomLevelsフォルダに同じ名前の譜面フォルダが有った場合は、そちらにもカメラスクリプトを生成してくれますので、その場合はWIPsongでなくてもOKです。

カメラスクリプトはCameraPlusを使用してください。ModAssistantで標準登録されているCamera2でもスクリプトは使えるのですが、曲専用のスクリプト再生機能がありません。また、スクリプトの設定のUIが無いため、直接カメラ設定のjsonファイルを編集する必要があります。どうしてもCamera2で使用する場合は、こちらの説明を読みながら設定して下さい。

CameraPlusでは、BeatSaberのゲームウィンドウ画面で右クリックすることで、設定パネルが開きますのでMovementScriptからMovementScript MethodをTick Audio Timerに、Song specific scriptをEnableに設定して下さい。
こうすることで、曲の時間に同期してスクリプトが再現されます。また曲専用に用意されたスクリプト(ScriptMapperで生成したスクリプト)が再生されます。

スクリプトの曲との同期と曲専用スクリプトの設定

なおCamera Plusの設定の詳細説明、ScriptMapperのコマンドの入れ方、具体的なカメラワークなどは椿さんの動画が参考になります。

カメラ座標・角度・FOVについて

さて、ここまでカメラの座標・角度の説明は一切省いてきましたが、実際にスクリプトを作成すると座標を直接扱った方が便利な場合も多いです。

まず、カメラ座標の基本的な説明をすると、水平方向の座標はXとZで表しています。下図の様に、Z値がプラスになると前方、マイナスになると後方になります。同じく、X値がプラスになると右方向、マイナスになると左方向になります。XもZもステージ中央が0になります。単位はmです。
ちなみに、ステージの寸法は横3m☓縦2mです。

水平方向の座標

次に垂直方向の座標です。垂直はY値になり、プラスになると上方向、マイナスになると下方向です。ステージの床が0になります。

垂直方向の座標

なのでアバターの顔の高さ1.6mで、アバターより右に1.4m、後ろに1.9mの斜め右後方にカメラを置きたい場合は、X=1.4 Y=1.6 Z=-1.9 の値になります。
次にカメラの角度です。先程の位置にカメラがあるとして、カメラをアバターの方向に向けるには、カメラを水平方向に回転させる必要があります。水平方向の回転はY軸の回転になります。
回転は0~360度の角度で指定して、前方が0度で右回りにプラスです。
具体的には下図の様になります。

カメラの水平方向の回転
上のカメラ位置での画像

次にカメラの垂直方向の回転です。アバターの真後1.9mで、高さ3mから見下ろす様にするには、カメラを垂直方向に回転させる必要があります。垂直方向の回転はX軸の回転になります。回転は0~360度の角度で指定して、前方が0度で下回りにプラスです。具体的には下図の様になります。

カメラの垂直方向の回転
上のカメラ位置での画像

カメラの回転の最後はZ軸です。Z軸の角度は右回りに画面が回転します。具体的には90度の場合は以下の様に左が床面になります。

Z軸を90度回転させた画像

最後にFOVの説明です。FOV(Field of View)は視野の意味で、カメラの映る範囲を角度で表しています。

FOVの角度

つまり、角度を狭めると映る範囲が狭くなるためズーム(拡大)し、広げると映る範囲が広くなるため広角(縮小)になります。

ここまで説明すると、最初にコピー&ペーストで作っていたコマンドの意味が分かります。
始点:q_1.38_1.5_-1.9_3.7_359.2_0_60
終点:q_-1.29_1.5_-1.94_3.7_359.2_0_60
これですね。
これはqコマンドと言って、直接座標と角度FOVを指定するコマンドです。
q_X座標_Y座標_Z座標_X角度_Y角度_Z角度_FOV
の並びになっています。

始点と終点を見てみると、X座標が始点:1.38と終点:-1.29でプラス・マイナスが逆ぐらいになっています。あと他の値はだいたい同じです。
(多少のズレは手作業で動かしたので誤差があります)
つまり、アバターを挟んでちょうど反対側(左側)に移動したので、X座標がプラス・マイナス逆になっています。
なので、ぴったり反対側に移動したい場合は、左右方向ならX座標の値をプラス・マイナス逆に、前後方向ならZ座標の値をプラス・マイナス逆にすれば良いのです。(対角の場合はX,Z共にプラス・マイナス逆です)

カメラの座標は、カメラをWASDで動かすとカメラコントールパネルに表示されます。また、パネルの値を直接変更しても、その位置にカメラが移動します。なので、大雑把にWASDで移動して、パネルの座標で細かく調整するなんてことも出来ます。

カメラコントールパネル

パネル上段のPox X,Y,Zはカメラ座標、RotX,Y,Zはカメラ角度です。
Distはアバターからカメラまでの距離で、現在値の表示の他、入力することで現在のカメラ角度のまま、指定した距離まで離れた位置にカメラが移動します。
また、カメラの角度については、調整が難しい場合はカメラコントロールパネルのLook Atボタンを押すと、自動的に現在の座標でアバターの方向にカメラが向きます。

Look Atボタンでアバターの方向を向く

また、その時にカメラが向くY座標はMoreSettingsのHead Hightの値の位置になります。X,Z座標は0です。

Look Atで向く位置

CameraMovement応用編

2023年のアドカレで、CameraMovement応用編の記事を書きました。
この記事を作成してから追加した機能など、色々紹介していますので、
ぜひ参考にして下さい。

CameraMovementの作成と本記事の投稿について

さて、カメラスクリプト作成の記事は以上です。
ここからは、私が作成したCameraMovementと今回の記事について書いていきます、興味が無い方は以降は読まなくても全く問題ありません。

今回、CameraMovementを作ろうと思ったのは1年位前にビーセイ関係のツール作りを考えていた時に、カメラスクリプトって結構作るのが大変だなって思ったのが起点です。丁度、このツイートですね。

当時は、カメラスクリプトを作成するツールはCamera Plus Script Makerしか無い状態で、直接座標や角度、移動時間を打ち込むだけのツールでした。
hibitさんが、一部カメラの回転などを生成するツールを作られていましたが、全体を通して編集できる様なツールは無い状態でした。

早速取り掛かったのですが、すぐに暗礁に乗り上げました、と言うのも自分の力ではCamera Plus Script Makerに毛が生えた程度の機能しか実現できそうに無かったからです。ツールから現在の座標角度をCameraPlus等に送信して、すぐに判る様にするなどある程度は考えたのですが、どうも良いツールができそうにありませんでした。
やっぱり、作りながら画面で確認したい・・・ですよね。

そんなわけで、暗礁に乗り上げたままモチベーションも下がっていたところに、hibitさんがScriptMapperを作成されました。
タイミング調整に譜面作成ツールを使う、目から鱗な発想です。
やっぱり、カメラスクリプトを実際に作ってる人ならではですね。

良いツールも生まれたし、もう自分の出番は無いかなと、ツール作成の構想もお蔵入りしてしまいました。(当時、期待させた方申し訳ありません!)

そして、時間は流れて2022年1月、譜面作成ツールのMMA2の機能で一部修正したい部分があったので、自分で直してみようと思いました。
しかし、MMA2はUnreal Engineと呼ぶゲームエンジンを使用しており、プログラムはブループリントと呼ばれるフローチャートの様な画面を操作して作るものでした。

これは、プログラミング知識の無いデザイナーでも、プログラム部分が触れるようになった画期的な機能な様ですが、ぶっちゃけ自分には使いにくいことこの上ない物でした。(コードで直接書かせてくれって感じ)

ちなみに、以下はMMA2のHalf Jump Duration と Jump Distanceを求めている処理ですが、以下にコードに書き直した物と並べますが、どっちがわかりやすいと思いますか?

ブループリントでのHJDとJDの計算処理
HalfJumpDuration = 4.0
while (NJS * HalfJumpDuration * (60 / BPM) > 18) {
  HalfJumpDuration /= 2
}
HalfJumpDuration += Offset
if (HalfJumpDuration < 1.0) {
  HalfJumpDuration = 1.0
}
JumpDistance = HalfJumpDuration * 2 * (60 / BPM) * NJS

全編こんな感じなのですw

とりあえず、該当の修正は簡単だったのでブループリントを見様見真似で修正しました、あと日本語化程度なら簡単だったのでMMA2の日本語版も作ってみました。MMA2日本語版は以下で配布しています。

MMA2をいじっているときに、ふとカメラスクリプトの再現ができるんじゃないかと思いましたが、ブループリントを見た時に諦めました。ブループリントの作り方を覚えても良いのですが、今後役に立ちそうに無かったのが大きいです。自分は別にゲームを作りたいわけじゃなくて、BeatSaber関係のツールやmodを作りたいだけなので。

MMA2を諦めた頃、ChroMapperならどうかと思ってみたところ、プラグインを作る機能があることが分かりました。また、Unityで作られているので、これでカメラスクリプトの支援ツール作れば、BeatSaberのmod作成の参考にもなるんじゃないかと思いました。

さて、早速取り掛かろうと思ったのですが、実は私のUnityの知識は殆どゼロだったのです。とりあえず、1からUnityを学ぼうと適当にAmazonで評価の良さそうな本を買って、本の手順に従ってゲームっぽいものを作ってみました。

正直入門書すぎて、ある程度C#の知識がある自分には冗長すぎる説明でしたが、流石に入門書なだけあって基本は抑えられているので、Unityでどうやってゲームが作られるのか知るのには丁度良かったです。
だって、Prefabの意味も知らなかったのですから。

一通り本を読んで、実際に試してみるとUnityの基本が分かってきたので、早速取り掛かりました。ChroMapperのUnityプロジェクトはGItHubに上がっていますから、UnityでChroMapper本体を確認しながら、プラグインを作って行けば良いので、非常に理解しやすかったです。
(それでもUnityで該当箇所を探していくのは結構たいへんですが)

このあたりは、BeatSaberのmod作りと違うところで、BeatSaberの場合はUnityで見られないので、ゲーム本体のファイルを逆コンパイルして読み解く必要があって結構難易度が高いです。また、その時にUnityの知識がある程度必要なんだと分かりました。全くUnityを知らない状態だと、何をやってるのかチンプンカンプンな所が出てきますから。
BeatSaberのmodを作成しようと思っている方で、ゲーム本体を操作している部分が判らないと悩んでいる場合は、入門書をなぞる程度でも良いので、一度Unityのゲームを作ってみることをオススメします。

そんなわけで、2月の初めにCameraMovementを公開して、2月中は機能改善を行い、ようやくこの記事を書けるぐらいに、だれでも簡単にスクリプトが作れる様になったので、今回この記事を書こうと思いました。

先週まで行われたビー祭では、カメラスクリプトを活かしたプレイが沢山ありました、その中ではCameraMovementを使って頂いて、スクリプトの作成がとても楽になったと言う声もあり、ツールを作った甲斐があったなと思います。

BeatSaberの基本は音楽に合わせてノーツを斬ってスコアを競うゲームですが、カメラスクリプトを使ってアバターを中心に絵作りを行うことで、ゲームとは違った、別の表現ツールの様な可能性が見えてくると思いました。
BeatSaberはシンプルなゲームゆえに、ユーザの工夫で何でもできるので、これからも驚くようなプレイが見れることを期待しています。