前回に引き続き、今回もカスタムプラットフォームを作っていこうと思います。前回の内容を軽くおさらいしておいてください。前回を読まれた方も、忘れてしまった部分あるかと思います。また、今回も完成品をページの一番下に置いています。

アバターのカスタマイズや、Beat Saber ではカスタムセイバー、カスタムノーツ、カスタムプラットフォームの作成など、ゲーム開発とは関係ない部分で Unity を使う場面が増えています。ゲームは作ったことないけれど Unity はちょっと触れる、という方もいらっしゃるかもしれません。 とはいえ、Unity はいちおう開発ツ...
前回と同じように、新たにプラットフォームを作るときは、テンプレートをコピーして、そちらを編集していく形になります。
テンプレートは下記のページで配布されています。
こちらの [UnityProject.zip] をダウンロードして、zip の中にある CustomPlatform フォルダを保存したい場所にコピーし、フォルダ名をわかるように変更してから、Unity Hub から開きます。
これら手順を忘れてしまった方は、前回の「カスタムプラットフォームのテンプレート」以下をお読みください。
今回は適当に CustomPlatforms_Sample2 にしました。
プロジェクトを開いたとき、このような画面が出た場合は、[Check for Updates] (アップデートのチェック) を外して、[Skip new version] (新バージョンをスキップ) をクリックします。新しいバージョンがあるからアップデートしないか、と聞かれているのですが、アップデートするとカスタムプラットフォーム作りで不都合がでます。
このように、CustomPlatforms_Sample2 を開きました。
Unityでは、多くの有料、無料のアセットが公開されており、自分で一からモデリングすることなく、高品質なモデルを使用することができます。今回は、無料のアセットを使用して、手軽にプラットフォームを作ってみましょう。
Unity アセットストア
https://assetstore.unity.com/
こちらが、Unity のアセットストアになります。ここから、プラットフォーム作りに使うものを探しやすいよう、すこし絞り込みをします。下記は「3D」「環境 (Environment)」「無料アセット」で絞り込んだリンクです。
https://assetstore.unity.com/?category=3d%2Fenvironments&free=true&orderBy=1
これからアカウントにアセットを追加するので、前回作成した Unity のユーザーアカウントでサインインしておく必要があります。もし自動でサインインされていないようであれば、下記画像の赤で囲った部分をクリックして、サインインを行ってください。
さて、たくさんのアセットが表示されて目移りするところですが、今回は手軽にプラットフォームを作成したいため、最初からデータ量が小さく、手間のかかる軽量化が不要なアセットを使用します。(ビートセイバーでは、VRで表示する分、負荷には厳しい面があるので、重いアセットは軽量化しないと使用できません)
アセットの検索のところで、「Sci-Fi Styled Modular Pack」を検索してください。下記のアセットが見つかるはずです。ファイルサイズは 8.6MB とあり、そのまま使用できそうな軽いアセットですね。
この画面が出たら、[マイアセットに追加する] をクリックしてください。次の画面で [同意する] を押すと、購入処理 (0円なのでお金はかからずアカウントへの登録だけ) が完了します。
購入済のアセットは、[マイアセットに追加する] が [Unityで開く] に変わるので、この [Unityで開く] をクリックしてください。このとき、Unity では前述の CustomPlatforms_Sample2 を開いている状態にしておいてください。この操作の場合、現在開いているプロジェクトにアセットが追加される形になります。
ここで Unity のほうに画面が移りますが、もし Unity のほうでサインインがされていないと、下記のような画面になります。[Sign in ...] を押すと、ブラウザに画面が移り、[Unity Hub を開く] ボタンが表示されるので、これをクリックしてください。Unity 側でもサインインが完了します。
サインインが完了すると、このようにブラウザで [Unityで開く] を選んだアセットが Unity 上で選択されます。もしこの画面にならなかったときは、再度ブラウザでアセットの画面から [Unityで開く] を行ってください。
上記画面右下の [Download] をクリックすると、アセットのダウンロードが始まります。このときなにやらエラーメッセージが出た場合は [Try Again] を、それでもメッセージが消えない場合は [Cancel] をクリックしてください。気持ちは悪いですが、それでもダウンロードはできているようです。
ダウンロードが完了すると、[Download] の左の [Import] が押せるようになるので、これを押してください。
下記のような画面が出てきます。これはアセットに入っているファイルがどのようにプロジェクトに展開されるかを表しています。見たところ、「Sci-Fi Styled Modular Pack」というフォルダ以下にファイルが展開されるようですね。アセットを追加するときはここだけは忘れずに見ておきましょう。でないと、アセットを追加したのに、どこにファイルが入ったのかわからなくなる場合があります。確認したら右下の [Import] を押してください。
Import が終わったら、下記画面の右上の × を押して Package Manager を閉じます。これでプロジェクトにアセットが追加されました。
さっそくアセットを配置…、の前に、まずカスタムプラットフォームとなる GameObject を作成しておきます。やり方を忘れてしまった方は、前回の「カスタムプラットフォームを作成する」のセクションを読み直してください。
今回も、前回とまったく同じように TestPlatform という名前で GameObject を作り、[Add Component] で [Custom Platform] を追加しました。前回も書きましたが、この [TestPlatform] はかならず Transform が Position (0, 0, 0)、Rotation (0, 0, 0)、Scale (1, 1, 1) となるようにしてください (下記画面では右上)。
つぎにアセットを配置してみましょう。先ほど確認した通り、「Sci-Fi Styled Modular Pack」フォルダの下にアセットのファイルが入っています。この中をたどると、Prefabs のフォルダの中にいろいろとオブジェクトが入っているのがわかると思います。
Prefab とは、Unity で配置可能な部品のようなものです。この Prefab をドラッグアンドドロップで中央の 3D 空間に持って行くと、シーン内にその Prefab のコピーを配置していくことができるようになっています。配置したオブジェクトは適宜、移動やカスタマイズを行うことができ、これを繰り返していくのが基本的な Unity でのシーンの作り方になります。
補足として、このただ 3D 空間に置いただけのオブジェクトは、そのままではカスタムプラットフォームに出力されません。カスタムプラットフォームになるのは、左の一覧で [TestPlatform] 配下にある部分だけです。ですので、左の一覧から配置したオブジェクトを選択し、ドラッグアンドドロップで [TestPlatform] 配下に移す必要があります。[TestPlatform] 内は、GameObject を作って、フォルダ構造のように自分のわかりやすいよう管理するのが良いでしょう
とりあえず、今回はこの適当に配置したオブジェクトはいらないので削除します。左の一覧か、3D 空間でオブジェクトを選択して、[Delete] キーを押すか、左の一覧のオブジェクトを右クリックして [Delete] を選ぶと削除できます。
さて、今回はお手軽にシーンを作りたいので、この Prefab からひとつひとつ配置していくことはしません。このアセットに入っているサンプルシーンをそのまま使おうと思います。
[Sci-Fi Styled Modular Pack] の下の [Example scenes] をクリックしてください。ここにサンプルのシーンが入っています。2つありますが、右の [outpost with snow] を左の一覧内に (中央の 3D 空間内ではなく) ドラッグアンドドロップします。(文字が途中で切れて読めませんが、よく見ると下に表示されています。またこの上で Ctrl + ホイールで表示サイズを変更すると読めるようになります)
このように、先ほどの Prefab を使って作成されたサンプルシーンが読み込まれました。もし間違えて [outpost on desert] をドラッグアンドドロップして、違う画面になってしまったときは、慌てずに左の一覧から [outpost on desert] を右クリックして [Remove Scene] を選択すれば削除できます。
このサンプルシーンのオブジェクトを、カスタムプラットフォームとして出力したいのですが、カスタムプラットフォームになるのは先ほど追加した [TestPlatform] 配下の部分だけです。こちらに移すことを考えましょう。まず、TestPlatform の下に GameObject を作成してください。操作は左の一覧の [TestPlatform] を右クリックして [Create Empty] です。
次に、左の一覧から [outpost with snow] 以下のオブジェクトをすべて選択 (一番下の Map をクリックして選択し、[Shift] キーを押しながら + [↑] キーを3回) して、ドラッグアンドドロップで [TestPlatform] の下の [GameObject] に移します。
[TestPlatform] に直接ドラッグアンドドロップすればよかったのでは、と思うかもしれませんが、カスタムプラットフォームの基底である [TestPlatform] は、動かしたり、サイズを変更したりしてはいけないため、ひとつ GameObject を間に挟んで、移動やサイズ変更に対応できるようにしています。
これでオブジェクトはカスタムプラットフォーム側に移せたのですが、ビートセイバー上ではどこに表示されるのかわかりません。そういった場合は、ビートセイバーのデフォルトプラットフォームを表示してみましょう。[Assets] の下にある [Scenes] を開いてください。
「DefaultPlatform」を、さきほどの「outpost with snow」と同じように、左の一覧にドラッグアンドドロップしてください。なにやらいろいろ配置されます。
角度を変えてみると、ビートセイバーのデフォルトプラットフォームに見られる左右のタワーやライト、中央のトラックレーンが伸びているのが見えます。このデフォルトプラットフォームの位置を参考に、カスタムプラットフォームの位置合わせを行っていきます。
下記のように DefaultPlatform の下の PlayersPlace をクリックすると、プレーヤーの足場の位置がわかります。ここでセイバーを振ることになるので、この位置がどこにあるのか、この位置から周りのオブジェクトはどう見えるのか、は重要ですね。
なお、これらのデフォルトプラットフォームのオブジェクトは、[TestPlatform] の外に置いているので、カスタムプラットフォームの .plat ファイルを出力しても、これらのオブジェクトは含まれません。今回は位置の確認に使っているだけです。
一時的に非表示にしたいときは、DefaultPlatformの左のあたりをクリックすると、目のアイコンがついて非表示になります。再度クリックすると目のアイコンが消えて、また表示されます。
さきほどのデフォルトプラットフォームの PlayersPlayer に近づいていって (マウスホイールで前後移動。3D 空間の移動の仕方は前回を参照してください)、建物の中の状態が映るようにしてください。現在のプレイヤー位置はここになるようです。トラックレーンの位置関係から、この画面の奥からノーツがくることになりますが、これではプレイできませんね。
まず、ノーツが飛んでくる方向が悪いので回転させます。左の一覧から [TestPlatform] の下の [GameObject] を選択してください。この GameObject には、さきほどサンプルシーンのオブジェクトをすべて放り込みましたが、この座標を変更することでオブジェクトをまとめた状態で、位置、回転、拡大率を調整することが可能です。
この [GameObject] を選択した状態で、右の [Transform] の中の [Rotate Y] に 180 を入力します。これにより Y を軸として 180 度回転、つまり前後逆になるように回転させました。
次に位置を調整します。今回は前後 (Z) と左右 (X) の位置はそのまま使うことにしますが、高さ (Y) が合っていません。下の画面にもあるように、プレーヤーの足場 (PlayersPlace) が埋まってしまっています。
[GameObject] を選択した状態で、右の [Transform] の中の [Position Y] に -0.12 を入力します。これにより高さが下がって、ちょっとわかりにくいですが、足場がすこし見えるようになりました。
トラックレーンの位置関係から、現在は下の画面の奥からノーツがくることになりますが、正面の扉が邪魔です。削除してしまいましょう。正面の扉をクリックすると、選択状態になります。このまま [Delete] キーを押すと削除が可能です。
さらに奥にあるシェルフも削除します。
さらに Corridor_L (5) も削除。オブジェクトをクリックすると、左の一覧の選択も同期されるので、何が選択されているか確認することができます。
この調子で正面にあるものを削除していきます。
decorative_plant_
container_big (2)
container_bit (1)
decorative_plant_ (2つ目)
decorative_table_
light_wall_1 (1)
を削除します。
これで奥が見通せるようになりました。
すこしはみだしてきている椅子も左に動かします。選択して右の [Transform] の [Position X] を適当に 2.5 に。数値入力ではなく、画面上の矢印をドラッグアンドドロップして動かすことも可能です。
奥の椅子も左に。
とりあえずここまででテストしてみましょうか。左の一覧から [TestPlatform] を選択して、右の [Custom Platform (Script)] の中の情報を設定します。前回説明したので詳細は割愛しますが、SciFiBaseという名前をつけました。
右下の [Export] ボタンを押して、Beat Saber のカスタムプラットフォームフォルダ内に plat ファイルを出力します。Steam 版 Beat Saber のデフォルトインストール先の場合は下記フォルダになります。
C:\Program Files (x86)\Steam\steamapps\common\Beat Saber\CustomPlatforms
本来であれば、ここでプログレス (進捗) バーが現れ、ファイルの出力が行われるところですが、何も起こりません。代わりに画面下に不穏な赤い文字が…。この赤い文字の部分をクリックしてください。
エラーの原因がログとして表示されています。ここでは「You are trying to replace or create a Prefab from the instance 'door_3' that references a missing script. This is not allowed. Please change the script or remove it...」とあります。簡単に言うと、「'door_3' に不明なスクリプトがついているので出力できない。スクリプトを削除するか変更して」と言っています。
この「You are」の部分をクリックすると、左の一覧で、問題の door_3 をハイライトしてくれます。
この door_3 を選択して、右の部分を下にスクロールすると、黄色い!マークがついており、不明なスクリプトがついているのがわかります。これを削除しましょう。
縦に並ぶ・・・をクリックして、[Remove Component] で削除できます。
今回はこれでエラーが解消されます。カスタムプラットフォームだけでなく、カスタムノーツやカスタムセイバーを作るときも同様のエラーが出る場合はあるので、覚えておきましょう。
再び左の一覧から [TestPlatform] を選択して、右の [Custom Platform (Script)] の中から [Export] をクリックして出力します。今度はしばらく待っていると plat ファイルが出力されるはずです。さっそくビートセイバーを起動して、カスタムプラットフォームを確認してみましょう。
さきほど出力したSciFiBaseを選択すると、真っ白なプラットフォームがでてきたのではないでしょうか。じつは Beat Saber は特殊なポストプロセスを使っていて、通常のシェーダーを使用したものはすべて真っ白に描画されてしまうのです…。
このポストプロセスはオフにすることもできて、Beat Saber の設定で、[Bloom Post Process] を [Off] に設定することで解除できます。
ポストプロセスをオフにすると正しい色で表示されました。ただ、VR 内で周りを見渡すと、なんだかすべてが大きすぎるので、全体的に縮小する必要があるようです。また最終的には、ポストプロセスがオンの状態でも正常に表示できるようにしたいですね。
左の一覧から [TestPlatform] の下の [GameObject] を選択し、右の [Transform] の中の [Scale] を 3 つとも 0.8 に、[Position Y] に -0.091 を入力します。
なにをしているのかというと、サイズを全体的に 0.8 倍に縮小して、これにともなって他の座標もずれるので、PlayersPlace が埋まらない程度の高さに Y を設定しなおしました。(GameObject をもう一つ作って親子関係にするとずれずに拡大縮小できるのですが、説明がわかりにくくなるので…)
このあたり、どのくらいの倍率が良いのかは何度かプラットフォームを出力しては、ビートセイバーを起動してテストする、の繰り返しになります。
さきほどからシェーダー、という言葉がでてきますが、シェーダーというのは、オブジェクトの描画方法を記述したプログラムのようなものです。画像をそのまま描画するだけの単純なものから、水面や鏡を実現するような複雑なものまで、シェーダーは多岐にわたりますが、描画方法であって、実際に何が描画されるかはマテリアルの情報と合わせて決まります。
前回の記事では、オブジェクトがどのように表示されるかはマテリアルで指定する、と書きましたが、マテリアルは、使用するシェーダーと、そのシェーダーに渡すテクスチャやパラメーターを保持しています。つまり、マテリアルはシェーダーとそのデータをひっくるめたもの、というように考えればわかりやすいかもしれません。
今回必要なのは、ビートセイバーで正しくオブジェクトを表示するためのシェーダーです。シェーダーが書ける方なら、自分で既存のものをビートセイバー用に書き換えることも可能ですが、今回は既に作られたものを使用しましょう。
よく使われているものでは、下記のカスタムノーツのプロジェクトに入っているシェーダーがあります (Assets/Shaders の中にあります) 。これらの .shader ファイルをプロジェクトの Assets の中にコピーして、カスタムプラットフォームでも使用することも可能です。
Beat Saber CustomNotes Unity Project
https://github.com/legoandmars/CustomNotesUnityProject
ですが、今回はもうすこし機能豊富で、Unity で一般的な Standard シェーダーに近いことができるシェーダーを導入します。
BS_Uber
https://github.com/Ikeiwa/BeatSaber-shaders/blob/master/BS_Uber.unitypackage
上記のページを開いて、ちょっと場所がわかりにくいですが、右下の小さな [Download] ボタンを押してください。[Download] ボタンが出ない場合は [view raw] を右クリックして、[名前を付けてリンク先を保存...] でダウンロードできます。
ダウンロードが完了したら、この BS_Uber.unitypackage をダブルクリックしてください。Unity に画面が移り、下記のようなインポート画面が表示されます。右下の [Import] を押すと、導入完了です。
この導入したシェーダーを使用する方法ですが、どのシェーダーを使用するかはマテリアルに設定されています。このプロジェクト内で使用されている各マテリアルで、使用するシェーダーを変更していく作業になります。
左下のツリーから [Assets] → [Sci-Fi Styled Modular Pack] → [Materials] を開くと、下記のようにアイコンがたくさん並んでいるのが見えます。これらがマテリアルです (ひとつフォルダもありますが)。
下記の画面のように、[Pallets] フォルダと青い四角形の [hologram...] を除いて、すべて選択してください。クリックして 1 つ選択してから、[Ctrl] + [A] キーですべて選択し、そのまま [Ctrl] キー + フォルダクリック、[Ctrl] キー + [hologram...] クリックで、フォルダと [hologram...] を選択除外できます。
右上 Inspector 下、Shader [--] となっているところをクリックして、[Beat Saber] → [Uber] と選択します。
このように右上の [Shader] の部分が [BeatSaber/Uber] となります。
BeatSaber/Uber の場合、このままでは色が出ない部分があるので、マテリアルの設定をすこし変更します。右のずらずらとたくさんあるところは、テクスチャや色情報といったマテリアルのパラメーターを設定している部分です。この中から、Emissoin のチェックを外し、Tint Albedo のチェックを入れます。
下記画面で、Emission は右中央あたり、Tint Albedo は右下あたりにあります。
また、さきほど選択除外した [Pallets] フォルダをダブルクリックして開き、その中に入っているマテリアルもすべて選択して、同様に [Shader] を [BeatSaber/Uber] に変更してください。
こちらも同様に、Emissoin のチェックを外し、Tint Albedo のチェックを入れます。
ちなみに、なぜ [hologram...] を除外したのかというと、このマテリアルに使われているシェーダーのみビートセイバーで白くならずにそのまま使用できるためです。
基本的には上記の操作で、だいたいのオブジェクトはビートセイバー内でもそれなりに描画されるようになりますが、一部、手動で変更しないと正常に表示されなかったり、見栄えが悪い場合もあります。
この場合、パラメーターを変更しては、カスタムプラットフォームを出力して、ビートセイバー内で確認して、またパラメーターを調整…、という根気のいる作業になります。
今回、手動で設定が必要な部分をやっていきます。ふたたび、左下のツリーから [Assets] → [Sci-Fi Styled Modular Pack] → [Materials] を開いて、[grass] を選択してください。本来透明なはずのガラスが黒くなってしまっています。
右の一覧から [Albedo] の横にある白い四角をクリックしてください。下記のようなカラー選択がでてくるので、[A] (不透明度) のところに適当に 127 を入れます。0 でもいいのですが、0 は完全な透明なので窓感がでないかな、と思って。(後から思いましたが、もうすこし少ない数値のほうがいいかも。50くらいでどうでしょう)
窓が (半) 透明になりました。
マウスホイールを回転させて遠景にしてください。この白い地面は見栄えも悪いので消してしまいましょう。下記の画面のように、地面をクリックすると左のツリーでは [Plane] が選択されます (別のものが選択されていた場合は、もう一度地面をクリックして [Plane] が選択されるようにしてください。この状態で、[Delete] キーを押すと削除されます。
同様に操作して、正面のドアやオブジェクトも消してしまいます。テストしてみたら邪魔だったので…。もし間違えて別のものを削除してしまったときは、[Ctrl] + [Z] キーで元に戻すことができます。
だいぶすっきりしました。
ここまでできたら、またカスタムプラットフォームを出力してみましょう。左の一覧から [TestPlatform] を選択して、右の [Custom Platform (Script)] の中から [Export] をクリックして出力します。
チェックボックスはこのようにしました。[Hide Default Platform] のみ、つまりデフォルトの足場だけ隠す設定です。
plat ファイルが出力されたら、ビートセイバーを起動して、カスタムプラットフォームを確認してみましょう。
うまく表示できているようです。まだまだ手を入れられる部分は多いですが、とりあえずはこれで完成です。ここまでついてこられた方は、かなり長い作業になったと思いますが、おつかれさまです!
- 今回、手間を削減するため、マテリアルは一括設定しただけでしたが、ひとつひとつ色や質感を調整することができます。現状、一部オリジナルアセットの色を再現できていない部分があります。
- 不要なコライダー (当たり判定) がたくさんついています。おそらく体感レベルではあまり差はないでしょうが、削除すれば負荷軽減になります。
- 不要なライトがたくさん存在します。BeatSaber/Uber シェーダーや CustomNotes プロジェクトに含まれるビートセイバー用シェーダーでは、ライトは無視されるので、すべて削除してしまって問題ありません。削除すれば負荷軽減になります。
- プレーヤーから見えない部分は削除しておくと負荷軽減になります。今回は不要ですが、サイズの大きなアセットでは必須の作業になります。
- カスタムプラットフォームには、譜面に合わせて動くギミックが用意されています。カスタムプラットフォームのテンプレートに最初から入っている Playground というシーンがそれらの使用例になります。これらのギミックを取り入れるのも良いオリジナル要素になります。
記事中では 2 回しか出力していませんが、実際は何度も出力とテストを繰り返して、良い結果になったものだけを記事に反映しています。mod でもそうですが、ビートセイバー内で確認しないとわからない部分も多いので、手間がかかりますね…。
今回はシンプルに、アセットを読み込んで、それをそのままカスタムプラットフォームとして仕立て上げる流れを説明しました。
いろいろと制限はありますが、Unity に持ち込めるものは、ビートセイバーにも持ち込めるのがわかっていただけたかと思います。Unity アセットストアや Booth にはさまざまな素材があるので、オリジナルのカスタムプラットフォーム作りにチャレンジしてみるのも楽しいかと思います。
すぐ上に書いた制限、について触れておきます。とくに見栄えのいい重量級のアセットを使用する場合にはこの制限で持ち込めない場合もあるので注意が必要です。
- 今回 Unity バージョン 2019.4.18f を使用していますが、これより新しいバージョンが必要なアセットは使用できない可能性が高いです。
- Unity の画面描画方式にはいくつか種類があり、Beat Saber が使用しているのは 「Built-In (ビルトイン)」という一番基本的なものです。「URP」「HDRP」を指定するアセットは基本的に使用できません。上記のバージョン指定と合わせて、このあたりの指定は、アセットの販売ページをよく見ると書いてあります。
- カスタムプラットフォームでは、スクリプト (プログラミングされたもの) は持ち込むことができません (アニメーションとパーティクルは動きます)。たとえばギミック込みのアセットをカスタムプラットフォームにしてもギミックは動きませんし、描画自体にスクリプトが必要なアセット (水面のような複雑なシェーダーはこの類が多いです) は描画されません。
- Beat Saber では一般的なシェーダーが使用できないため、特殊なシェーダーが使用されているアセットは、自分でそのシェーダーを Beat Saber 対応に改造しないと使用できません。今回の記事では BeatSaber/Uber に置き換えましたが、BeatSaber/Uber や CustomNotes プロジェクトに入っているシェーダーでは再現不可能なシェーダーも存在します。
- ビートセイバーのシェーダーでは、ライティングや影は無効化されており、また、カスタムプラットフォームの仕様として、反射やライトマップも使用できないため、Unity 上よりはかなり見栄えが落ちます (わたしの CityTerrace プラットフォームでは、専用のmodを作ることで、そのあたりを無理やり解決させてます)
- 重量級のアセットでは軽量化が必要になります。そのまま出力すると、数百 MB にもなる .plat ファイルが生成された、処理落ちでプレイに支障が出る、なんてことになります。軽量化のテクニックはかなり多岐にわたるので全部は書けませんが、大きく負荷に影響するものを挙げておきます。
- Mesh Baker でメッシュ、マテリアルの結合
- Terrain to Mesh (Terrain 使用の場合)
- テクスチャ、メッシュのサイズ削減
- プレーヤーから見えないオブジェクト、パーティクルを削除
- ライト、コライダーを削除
- パーティクルを軽いものに変更
- シェーダーを軽いものに変更
当然、これらを行うと見栄えはどんどん落ちていくので、何度もテストしながら、見栄えと負荷のバランスを探っていくことになります。わたしの公開しているカスタムプラットフォームではこのような調整を行っています。
なるるるるな / NALULUNA
2022-08-31 15:14:48 +0000 UTC東京にゃんこTokyoCat
2022-08-11 00:25:40 +0000 UTCなるるるるな / NALULUNA
2022-07-31 22:00:26 +0000 UTCSp00ky_C0de
2022-07-30 21:01:19 +0000 UTCなるるるるな / NALULUNA
2022-07-30 12:34:34 +0000 UTCなるるるるな / NALULUNA
2022-07-30 12:33:56 +0000 UTCJAN
2022-07-30 10:02:00 +0000 UTC