公開サーバーとその拡張
公開サーバー向けには、オープンな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つのパスを実行します:
- レベルとそのメタデータに対する宣言的ルール
- レベルのグラフのチェック
- サービスの
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つの公開プリセット:
standard | strict | |
|---|---|---|
| リソースへの直接リンク | 許可 | 禁止 |
| すべてのリソースの作者表記 | 不要 | 必須 |
| すべての記録のコンテンツハッシュ | 不要 | 必須 |
| 最大のリソース | 64 MB | 32 MB |
最大のlevel.jsonまたはmetadata.json | 32 MB | 16 MB |
| 最大のレベル | 256 MB | 128 MB |
| リスト外のサイト | RequiresLicenseCheck | RequiresResourceCheck |
すべてのプリセットとフィールド:公開プロファイル
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のレベルを商用でホストすることはできません
別のライセンスの別のコードで動くサーバーでも、コンテンツの権利は何も変わりません。作者向けの完全なルール:ユーザーレベルのライセンスポリシー