本文へスキップ
ドキュメント
このページの内容

公開サーバーとその拡張

公開サーバー向けには、オープンなSDKがすでにあります。クライアントと同じモデルとチェックを、Unityなしでビルドできます。プロトコル、サーバーAPI、モデレーションツールはまだ決まっていません

警告

サーバーのコードもプロトコルもまだありません。以下は、サーバーの基盤となるSDKの部分で、これはすでに動いています。アドレス、メッセージ形式、サーバー自体のAPIはここにはありません。まだ存在しないからです

SDKはサーバーで動く

SDKはゲームのオープンなデータモデルです:モデル、JSONとバイナリ形式へのシリアライズ、検証ルール、ジェネレーター。Unityがコンパイルするのと同じソースが、エンジンなしの通常のnetstandard2.1ライブラリとしてビルドできます。サーバーやユーティリティから参照できます:

dotnet build -c Release BH.SDK.csproj
dotnet pack  -c Release BH.SDK.csproj

パッケージ名はBulletHero.SDKです。コードはgithub.com/bullet-hero/sdkにあり、ライセンスはMITです

SDKのバージョンは通常ゲームのバージョンと一致しますが、APIの安定性はまだ保証していません。詳細:バージョン管理とマイグレーション

クライアントとサーバーは、同じモデルに対して同じチェックを実行します。エディターが準備完了とみなしたレベルは、サーバーにとっても準備完了です。整合性を保つべき第2のルールセットはありません

ValidateForPublish

1回の呼び出しで「このレベルをここで公開できるか」という問いに答えます:

new ValidationFacade().ValidateForPublish(meta, profile, level, now, payload)

一度に3つのパスを実行します:

  1. レベルとそのメタデータに対する宣言的ルール
  2. レベルのグラフのチェック
  3. サービスのPublishProfileによる独自の条件

レベル自体を渡すのは任意です。metadata.jsonが別ファイルになっているのは、カタログが1つも開かずに数千のレベルを評価できるようにするためです。この低コストのパスで、ポリシーの大部分をカバーできます

ただし、2つのチェックにはlevel.jsonが必要です:記録がまったくないリソースと、リソースの取得方法です。メタデータだけによる問題のないレポートは「読み取った範囲にエラーはない」という意味です。レベルファイルがチェックされるまで、IsReadyはfalseのままです

payloadは測定したサイズを運びます:各リソース、level.json、metadata.json、レベル全体のサイズです。これがないと、プロファイルのサイズ上限をチェックできません

チェック中は何も修正されません。これは意図的です。出力時にコンテンツを黙って書き換えることは、サービスにとって最も避けたいことです。詳細:検証

3つの判定

グループ意味サーバーの動作
Errorサービスが拒否するアップロードを却下する(HasErrors)
Warning公開はできるが、人の確認が必要レベルをモデレーションキューに入れる(NeedsManualReview)
Advice記録のみ何もしない

クライアントは、同じエラーがあればアップロードを始める前にブロックします。そのため、サーバーが却下するようなレベルがサーバーに届くことはまれです

独自のPublishProfile

サービスのポリシーはファイルであり、シリアライズされたSDKのモデルです。より厳しいサーバーや緩いサーバーは、コードのフォークではなく、別のファイルです

プレイヤーのデバイスに残るレベルは一切チェックされません。プロファイルが意味を持つのは、レベルがサービスに提出される時点だけです。作者がその時点に向けてレベルを準備する方法:公開の準備

プリセット:

プリセットキー用途
CreateOpen()localデバイス上のレベル、何も要求しない
CreateStandard()standard公開サーバー、ユーザーレベルのライセンスポリシーのポリシー
CreateStrict()strictストア版ビルド、直接リンクなし、すべてのリソースにハッシュ

主なフィールド:

フィールド決めること
AllowedLicenses受け付ける一般的なライセンス。空のリストはすべてを受け付ける
AllowedUriTypesリソースの取得方法。空のリストはすべての方法を許可する
AllowUnknownLicenseリソースが自身の条件について何も示さなくてよいか
AllowPermissionInstead却下されたライセンスの代わりに権利者の許可を使えるか(常にレビューに回される)
RequireResourceMeta、RequireResourceUrl、RequireAttribution各リソースの記録に含めるべき内容
RequireAgeRating、RequireLevelAuthors、RequireHashesレベルが宣言すべき内容
MaxResourceBytes、MaxDataFileBytes、MaxTotalBytesサイズの上限。ゼロは無制限
Sources、UnknownSourceTrust信頼済みサイトのリストと、リスト外のサイトの評価方法

2つの公開プリセット:

standardstrict
リソースへの直接リンク許可禁止
すべてのリソースの作者表記不要必須
すべての記録のコンテンツハッシュ不要必須
最大のリソース64 MB32 MB
最大のlevel.jsonまたはmetadata.json32 MB16 MB
最大のレベル256 MB128 MB
リスト外のサイトRequiresLicenseCheckRequiresResourceCheck

すべてのプリセットとフィールド:公開プロファイル

standardにGPLがない理由

GPL系のライセンスは、意図的にstandardから除外されています。App Storeを通じて配布されるGPLの作品は、Appleの規約と衝突します。GPLを許可したカタログは、後からiOSで提供できなくなります

補足

SDKに同梱されている信頼済みサイトのリストは、出発点にすぎません。サイトは規約を変えるため、サーバーの運営者はそれぞれ自分のプロファイルでこのリストを上書きするべきです。特定のサイトがリストに載っていることを前提にはできません

モデレーション

公式サーバーがチェックに加えて追加を予定しているものです。公開サーバーにも、おそらく必要になります:

  • モデレーションキュー。Warningの検出結果がここに入ります
  • レベルとユーザーの通報とブロック。Google PlayとApp Storeの規約は、他の人が目にするあらゆるコンテンツにこの両方を求めています
  • ハッシュによる削除。リソースの記録には、そのファイルのコンテンツハッシュをsha256:<hex>の形式で保存できます。通報は作品を名指しします。ハッシュがあれば、その作品を含むすべてのレベルを、タイトルから推測するのではなく検索で見つけられます。エディターはリソースのインポート時にハッシュを記録します
  • 利用規約。ライセンスがカバーしない部分をカバーします:作者が権利を持っているという表明、サーバー運営者がレベルを削除する権利、一覧でレベルのタイトルとカバーを表示する権利

Steamワークショップの仕組みは異なります。ファイルを保存するのはValveで、Bullet Hero側にモデレーションキューはありません。ゲームはアップロード前にレベルまたはコレクションをチェックし、エラーがあればアップロードをブロックします(公開)。公開後にゲームが決めるのは、そのうち何をダウンロードするかだけです

アーカイブ形式

レベルはファイルのフォルダーであり、アーカイブによって持ち運べるようになります。SDKが読み書きできる形式:

形式読み込み書き込み備考
.tar.gz可可デフォルト
.zip可可エントリーごとにAES-256で暗号化できる
.tar.gz.gpg、.zip.gpg可可パスワードで保護されたOpenPGPメッセージ。.tar.gzで使える唯一の保護
level.json.gpg可可保護された単一のレベルファイル
.7z不可不可わかりやすい名前で拒否するために検出される

形式は拡張子ではなく、ファイルの先頭のバイトで判定されます。名前は、ファイルの中で誰でも変更できる唯一の部分だからです

tar -xzf、gpg -d、任意のzipアーカイバーで、書き込まれるすべての形式を開けます。レベルの展開にゲームは必要ありません。詳細:アーカイブと保護

決まっていないこと

  • ゲームとサーバーの間のプロトコル、およびそれがOWSとNOWSで共通かどうか
  • サーバーAPI:アップロード、カタログ、検索、アカウント
  • ゲームにコミュニティサーバーを指定する方法
  • サーバー自体の拡張方法と、その言語
  • サーバーで一緒にプレイする機能:トランスポート、権限、レベルの同期、ロビー

一緒にプレイする機能について検討済みなのは1点だけです:ネットワークメッセージに応じてプレイヤーのアバターが出現し、消える仕組みです

いずれかのサービスへのレベルの公開は、早くてもgv 1.0.0の次のアップデート以降になります。チェックが依存するデータは、公開される前にレベルに含まれている必要があります

レベルのライセンスとあらゆるサーバー

デフォルトでは、レベルはCC BY-NCで配布され、作者はレベルのメタデータで別のライセンスを選べます。レベルを共有する許可は、作者から受け取る人それぞれに直接与えられます。そのため、公式かコミュニティかを問わず、どのサーバーもCC BY-NCのレベルを商用でホストすることはできません

別のライセンスの別のコードで動くサーバーでも、コンテンツの権利は何も変わりません。作者向けの完全なルール:ユーザーレベルのライセンスポリシー