uSURVIVALを使っている最中の感想です。
私はサーバ実装の知見が無いため、これを使えばイケる!と意気揚々でしたが。
感想
アイテムを増やしたりステータスを変えたりと、用意されたテーブルをいじるだけなら楽にでき、
機能を増やしたりしたくなるとまずコーディングの突貫ぶりが気になってくる。といったところです。
試作品やミニゲーム向けで、長期保守していくレベルの製品には不向きな印象を受けました。
個人的にはミニゲームレベルでもそれなりに手を加えました(今後のアップデートをマージする気が起きません)。
作りたいゲームシステムによってはそのままで良い可能性もありますが、そうはなりませんでした。
なんというか、uSURVIVALというよりSurvival Game Starter Kitです。
機能
私はこの手のゲームをあまりしないのですが、アークサバイバルやポータルナイツなどに近い機能構成です。
ログイン時にキャラクターを作成し、そのキャラクターでゲームに入ります。
切断した時点のステータスや位置情報がデータベースにセーブされ、次のログイン時はそこから開始します。
アドオンとしてPUBGのようなダメージドーム機能も入っています。
任意のモデル差し替えは難しくないのですが手順が多いので自分でエディタ拡張を書くことになると思います。
キャラクターの初期ステータスやデフォルト所持アイテムはプレファブ自体をいじって設定する形式なので、
これも設定ファイル形式に修正した方が無難です。
他にできることは、
- サーバのみの起動
- サーバ兼クライアントとしての起動
- ローカル又はグローバルなサーバへの接続
- キャラクター作成と削除
- 装備
- 装備品の耐久度
- アイテムドロップ
- クラフト(アイテムを合成)
- クラフトの成功率設定
- かまど(アイテムの強化装置みたいな)
- インベントリ(使用や入れ替えが可能)
- アイテムボックス(使用できず入れ替えのみ可能)
- FPS視点(目玉などのオブジェクトを非表示にする)
- 扉の開閉(閉めると敵が入れなくなる)
- リロード
- リスポーン
- 武器に応じた構えや攻撃
- サブ武器を肩や腰に背負う
- 水面を泳ぐ
- 足音
- 独自のステータスの追加
- ステータスのフロー(酸素が尽きると代わりにHPが減る)
※一部Mirrorと被る機能があるかもしれません。
仕様としての注意
味方同士に攻撃が当たります。
インタラクトする判定に距離は使わず、すべてレイキャスト(線)で取っています。
よってTPS視点ではカメラ位置を調整しないと操作しづらいです。
フィールド上のアイテムを一度取ってゲームをプレイしなおすと、そのアイテムが同じ場所に復活しています。
これはリスポーン設定をオフにしても一緒です。
避けたい場合は最後に取ったサーバ時間を読み書きする判定処理などの対応が必要です。
エイペックスのようにバトル開始前にキャラクター選択する構成ではありません。
やるならMirrorのサンプルにあるようなルーム機能を織り交ぜますが、このアセットの趣旨と違うような気がします。
キャラクター作成時に同名は使えません。
デフォルトではキャラクターを削除した後にその名前で再度作成もできません。
データベースを見るとレコードのdeletedのフラグが立つだけでテーブルから削除はしない作りになっています。
これはクエリを書き換えれば簡単に変更できますが、
キャラ情報をユーザが即座に抹消できるような機能は危険です。
設計としての注意
すべてが1シーンで完結しているので、タイトルシーンやステージシーンが必要なら手を加える必要があります。
メモリ管理のお約束に則っていません。
毎フレームnewしている箇所があります。
毎フレームGetComponent()やSetActive()やGetComponentInChildren()やAddListener()をしている箇所があります。
イベント駆動ではなく、Updateループ内で毎フレーム状態のクリアと更新をする設計思想が見受けられます。
SendMessageを使っている箇所があります。
UnityEventをインスペクタで多用しています。
プレイヤーオブジェクトに大量の機能コンポーネントがアタッチされています。
当然、ゲームによっては必要ない機能もあるわけですが、
単純にオンオフできず、削除するだけではnullエラーになります。
中身を弄りたくなければ「酸素量」や「体温」などのUIを非表示にして解決することになります。
uSurvivalに入っているMirrorを削除してgithubから最新のMirrorを落としてきたら参照が壊れます。
ちなみに参照が狂うのはNetworkIdentify、NetworkStartPositionなどです。付け直せば解決します。
linqの一部は重いからこっちの形で実装する!といった親切なコメントが書かれています。
WebGLの場合、付属しているjslibのメソッドが旧式のためそのままでは100%エラーが発生します。
Pointer_stringfyやRuntime.dyncallなどです。エディタ起動では正常動作するため要注意です。
攻撃時、サーバでレイキャストを取ってクライアントでもレイキャストを取る処理があります。
サーバ側ではダメージ処理を、クライアント側ではサウンドやエフェクトの発生に使うようです。
見た目では当たってるのに内部では当たっていないケースが起こりえます。
そのうち修正されそうですが、サーバーオンリーモードだとプレイヤーの座標が更新されず、攻撃が当たらないバグがありました。
サンプルシーンに出てくるゾンビは倒れるだけで非アクティブにはなりませんが、
Unityのレイキャストは非アクティブなオブジェクトにも当たるので、仮に死んだ敵を非アクティブにしても当たります。自分で何を書いているのか分からないので要検証です。
これを防ぐにはレイキャスト後に非アクティブなオブジェクトを除外するか、レイヤーを変える手段があります。
Inputクラスがそのまま使われているのでどこで何の入力判定を行っているのか一目で分かりません。
最後に
市販アセットの欠点は「買うまでスクリプトの中身が分からない」ことだと思います。
しかし作者が内部の話を未購入のユーザーに上手く伝えるのも難しいことは理解しています。
スチームみたいに2時間以内なら返金するサービスもありえないので、レビューを頼るかこうして情報交換するのが望ましいと考えています。
以下のようなレビューがすべてを物語るわけではありませんが、少なからず気持ちは分かります。