godai-kaihatsu / gondwana

https://gondwana.godai.co.jp/
2 stars 0 forks source link

G4のコンフィグレーションファイルの仕組みをより明瞭で簡潔な構造へ移行する #63

Closed usagi closed 6 years ago

usagi commented 6 years ago

G4 のシステムコンフィグレーションについて現在の実装では内部的に UE4 の API を通じて "Game.ini" ファイルを用いて扱っている。

しかし、この方式では次の問題群が生じている:

  1. コンフィグレーションファイルの場所や記述がパワーユーザークラスでも UE4 の仕様をある程度把握していないと分かり難い。
  2. INI フォーマット内部の記述形式が UE4 と関連した G4 の設計に基づく分類となっており、 G4 のユーザーに対して分かりにくく不適。
  3. 保持項目が増えると単一のINIファイルでの管理が非常に困難となる

そこで、次のような G4 独自のコンフィグレーションファイルの仕組みへ移行したい:

  1. G4の配置ディレクトリー直下に etc ディレクトリーを設置し JSON 形式で保持。
  2. JSON の枠内で他のファイルを参照する include 的な仕組みを用意。
    • conf に階層的な単位を設けて { } 内に "include" キーが存在すればそのファイルのディレクトリー"以下"のパスから JSON を読み出して元の { } を置き換える、など。
usagi commented 6 years ago

108 に先行してこれやってしまおう。そろそろコンフィグレーションを綺麗にしないとモジュールのバージョン選択とかも面倒だし。

usagi commented 6 years ago

UE4のJSONシリアライザーはライブラリーの完成度、高レベルAPIやFVectorはじめ多用されるUE4型への対応がいまひとつ未完成かつ侵入型でCPPにより実装されおり、G4では対応コストが嵩む。そこで G3 でも実績のある cereal を用いて必要に応じて FVector 等には非侵入型のしリアライザーを追加して採用する方針を決めた。

usagi commented 6 years ago

UE4/INI ベースのコンフィグレーションの暫定仕様から完全に cereal ベースの JSON コンフィグレーションへ移行、動作確認を完了した。

usagi commented 6 years ago

新しい JSON コンフィグレーションのパスは G4/G4Configuration.json とした。シングルファイルで次のような構造の JSON とした。

{
  "G4Configuration": {
    "cereal_class_version": 1,
    "Planet": {
      "cereal_class_version": 1,
      "level_of_detail_min": 0,
      "level_of_detail_max": 13,
      "adjacency_cell_distance": 2,
      "pmc_pool_initial_count": 1024,
      "material_tile_services_JSON_path": "tile_service/material",
      "altitude_tile_services_JSON_path": "tile_service/altitude",
      "default_zero_wireframe_visibility": true,
      "default_terrain_wireframe_visibility": true,
      "default_zero_wireframe_color": {
        "R": 0.0,
        "G": 0.0,
        "B": 1.0,
        "A": 0.5
      },
      "default_terrain_wireframe_color": {
        "R": 0.0,
        "G": 0.10000000149011612,
        "B": 0.0,
        "A": 0.5
      },
      "datetime_tick_factor": 1.0,
      "datetime": "2018-03-30T14:16:32.921Z",
      "adjust_date_time_at_start": true
    },
    "Camera": {
      "cereal_class_version": 1,
      "initial_lonlat": {
        "X": 141.31610107421876,
        "Y": 43.04843521118164
      },
      "save_final_state": true,
      "target_moving_velocity_effect_altitude": true,
      "target_moving_velocity_effect_fovy": true,
      "target_moving_base_velocity_in_degrees_per_sec": 0.00027777778450399637,
      "target_altitude_mode": 0,
      "target_altitude_value": 0.0,
      "eye_distance_in_meter": 472.45068359375,
      "eye_pitch": -25.261877059936525,
      "eye_yaw": 0.0,
      "pointing_device_control_assignment_left_button": 1,
      "pointing_device_control_assignment_right_button": 2,
      "pointing_device_control_assignment_middle_button": 0,
      "pointing_device_control_assignment_thumb1_button": 0,
      "pointing_device_control_assignment_thumb2_button": 0,
      "pointing_device_control_assignment_wheel": 2
    },
    "Chat": {
      "cereal_class_version": 1,
      "auto_save_interval_in_sec": 5.0,
      "max_count": 1024,
      "max_past": "+28.00:00:00.000",
      "body_max_characters": 512,
      "target_max_characters": 32,
      "to_max_count": 32,
      "auto_export": true,
      "auto_import": true
    },
    "AI": {
      "cereal_class_version": 1,
      "input_mode": 0,
      "acceptable_score": 0.4000000059604645,
      "name": "G4AI"
    }
  }
}
usagi commented 6 years ago

同時に開発環境におけるコンフィグレーションの読み込みの制御を器用に行いやすく実装したのでコンフィグレーションを変化させながら何度も試験を繰り返す必要のある開発の効率が上がるなどの嬉しいおまけ作用もある。すばらしい。