MSFS2020でのSimConnectの使い方 C#編

Microsoft Flight Simulator(2020)でSimConnectを使うためのメモ C#編

ほんの少しですがわかっている情報について記載します。

必要なもの : MSFS2020本体、Visual Studio Community以上で.NET開発を有効

SimConnectのダウンロードとインストール

まずMSFS2020のゲームを起動して、 Help -> Downloads -> SDK Installerを選びインストーラーをダウンロードします。 ダウンロードしたらインストーラーを起動します。

SDKの中にサンプルコードがあり、SimvarWatcherというプロジェクトを開くとMSFSから変数を取得したりEVENTをset/getする事ができるプログラムを閲覧できます。この内容で理解できるのであれば、この記事を読む必要はありません。

SimConnectを使うプログラミングの概要

詳しくはわからないのですが、SimConnectはFSX(Microsoft Flight Simulator X : 古いやつ)時代からあるようで、Prepar3Dというのにもあるようです。そのためWeb上にあるSimConnectを使う方法はMSFS2020以外の情報もごちゃ混ぜになっているので自分が参考にする資料に気を付けてください。

データの取得と設定

まず、データの取得と設定には大きく二種類あります。

どちらもコールバックが必要になるので、イベントハンドラを用います。注意点としてコールバック関数が直接呼ばれるわけではなく、ウィンドウプロシージャによって何かが起きたことを知らせてくれるので、メッセージを受け取ったらデータを受信する処理を行わないとイベントハンドラが呼ばれません。後述します。

EVENT IDsとVariablesについて

EVENT IDs

フラップを動かす or 動かしたランディングギアを動かす or 動かしたオートパイロットをON/OFFの情報

EVENT IDs : SDKの情報

Variables

飛行機の高度フラップの位置ランディングギアのポジション等オートパイロットのON/OFFの情報

Simulation variables : SDKの情報

EVENT IDsとVariablesの使い分け

二つとも似たようなことができ詳しく調べられていませんが、それぞれ特性が違うので必要に応じて使い分ける必要があります。

EVENT IDs

EVENTは何かが起こったこと・起こすことを取得したり設定することができます。コックピット視点でオートパイロットのスイッチを押すたびに、AP_MASTERイベントが発生します。そのイベントデータの中にONであれば1OFFであれば0というデータが入っています。また、AP_MASTERイベントに1を設定すると、オートパイロットがONになります。

注意点として、EVENTでAP_MASTER1を設定すると、何故かAP_MASTERイベントが発生せず値を取得でき来ません。コックピット視点でボタンを押すか、コントローラーなどのショートカットで設定をするときのみ値を取得できるので、プログラムから操作するときに設定した結果はVariablesで読み取る必要があるようです。

Variables

Variablesは変数ということで、今の状態(飛行機の状態、カメラの状態等)を取得でき、一部は変数に値を設定できます。オートパイロットの状態を変数として取得するにはAUTOPILOT MASTERという変数を読み込む必要があります。BoolでSettableが×という変数なので読みとり専用です。Boolといいながら、C#でプログラムを書く場合には01という数値型になっているようです。前述のEVENTでAP_MASTER1にした場合、設定ができたかどうかは変数のAUTOPILOT MASTERで取得してみないとわからないということになります。

プログラミングのメモ

初期設定

  • プロジェクト作成時のテンプレートは、Windows フォーム アプリケーション (.NET Framework)を選びましょう。似たようなWindows フォーム アプリがありますが違います。
  • フォームいらないよ!コンソールでいいよ!っていう場合は、恐らくフォームを非表示にする方法をとるのが楽です。前述のウィンドウプロシージャの処理が必要なので、コンソールアプリでは苦労します。
  • x64でビルドするように設定する。
  • VSのプロジェクト参照にMicrosoft.FlightSimulator.SimConnectを追加する。SDKをインストールしたフォルダの SimConnect SDK\lib\managed以下にあるはず。

大枠の流れ

  1. Form1.csとかでWndProc()をオーバーライド
  2. WM_USER_SIMCONNECT(0x0402)を受信したらSimConnect.ReceiveMessage()を呼ぶようにする。
  3. ウィンドウハンドルを取得。
  4. SimConnectのインスタンス化。
  5. コールバックの追加(イベントハンドラ)。
  6. EVENT IDsの登録。
  7. MapClientEventToSimEvent()
  8. AddClientEventToNotificationGroup()
  9. ↑このセットを必要なEVENT分繰り返す。
  10. SetNotificationGroupPriority()
  11. Variablesの登録。
  12. AddToDataDefinition()
  13. ↑このセットを必要なVariables分繰り返す。
  14. RegisterDataDefineStruct<>()
  15. EVENTの取得はSimConnect.OnRecvEvent()
  16. Variablesの取得は2種類
  17. RequestDataOnSimObjectType() → 単発
    1. 取得したらSimConnect.OnRecvSimobjectDataByType()が呼ばれる。
  18. RequestDataOnSimObject() → 指定した周期
    1. 取得したらSimConnect.OnRecvSimobjectData()が呼ばれる。
  19. EVENTの設定はTransmitClientEvent()
  20. Variablesの設定はSetDataOnSimObject()

とりあえずここまで

By @Akio Tomita in
Tags :