> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# GameInput のフォースフィードバック

> GameInput のフォースフィードバック

このトピックでは、`GameInput` 上のフォースフィードバックがデバイス出力をどのように管理できるかについて説明します。フォースフィードバックを使用すると、ゲーム入力デバイスは、デバイスの 1 つまたは複数の入力コントロールを物理的に動かしてユーザーに触覚フィードバックを提供できます。フォースフィードバックは、ドライビングホイールやフライトシミュレーションリグなど、車両の操作をシミュレートする入力デバイスで機能します。これらのデバイスには、コントローラーに軸方向の力を加えるフォースフィードバックモーターが含まれています。レーシングホイールでは、ゲーム内のシナリオをシミュレートするためにホイールを回転させる回転力になります。フライトスティックでフォースフィードバックを使用すると、特定の位置からレバーを押したり引いたりしにくくすることができます。

フォースフィードバックをサポートする `GameInput` インターフェイスの詳細については、[IGameInputDevice](/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice) および [IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) を参照してください。

## フォースフィードバックモーターの確認

フォースフィードバック効果を作成するには、効果を適用したい入力デバイスを表す [IGameInputDevice](/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice) インターフェイスが必要です。`IGameInputDevice` インターフェイスを取得した後、[GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo) 構造体を調べて、デバイス上のフォースフィードバックモーターの数を確認します。これは [IGameInputDevice::GetDeviceInfo](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_getdeviceinfo) を呼び出すことで実行できます。入力デバイスにフォースフィードバックモーターがある場合、[GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo) のメンバー `ForceFeedbackMotorCount` の値は 1 以上になります。

## フォースフィードバック効果の作成

デバイスの [GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo) 構造体がフォースフィードバックモーターを 1 つ以上持つことを示している場合、次のコードに示すように [IGameInputDevice::CreateForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) を呼び出してデバイス用のフォースフィードバック効果を作成します。

```cpp theme={null}
HRESULT CreateForceFeedbackEffect(  
         uint32_t motorIndex,  
         const GameInputForceFeedbackParams* params,  
         IGameInputForceFeedbackEffect** effect  
) 
```

motor index パラメーターは、フォースフィードバックの影響を受けるモーターのインデックスです。このインデックスは、[GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo) 構造体の [GameInputForceFeedbackMotorInfo](/reference/input/gameinput/structs/gameinputforcefeedbackmotorinfo) 配列内の該当するモーターに対応します。この配列には、存在するフォースフィードバックモーターとその機能に関する情報が含まれています。

2 番目のパラメーターには、次のコードに示すように、効果の特性を記述するフォースフィードバック効果のための [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams) 構造体を構築します。

```cpp theme={null}
typedef struct GameInputForceFeedbackParams {  
    GameInputForceFeedbackEffectKind kind;  
    union  
    {  
        GameInputForceFeedbackConstantParams constant;  
        GameInputForceFeedbackRampParams ramp;  
        GameInputForceFeedbackPeriodicParams sineWave;  
        GameInputForceFeedbackPeriodicParams squareWave;  
        GameInputForceFeedbackPeriodicParams triangleWave;  
        GameInputForceFeedbackPeriodicParams sawtoothUpWave;  
        GameInputForceFeedbackPeriodicParams sawtoothDownWave;  
        GameInputForceFeedbackConditionParams spring;  
        GameInputForceFeedbackConditionParams friction;  
        GameInputForceFeedbackConditionParams damper;  
        GameInputForceFeedbackConditionParams inertia;  
    };  
} 
```

[GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 列挙型を選択し、対応する `GameInputForceFeedbackParams` 構造体を初期化します。

たとえば、スプリング動作のフィードバック効果を作成するには、[GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams) は [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) の値 `GameInputForceFeedbackSpring` と、スプリング用の [GameInputForceFeedbackConditionParams](/reference/input/gameinput/structs/gameinputforcefeedbackconditionparams) 構造体で構成されます。選択した [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 列挙型のパラメーターを入力します。

フォースフィードバックモーター効果をそのインデックスで選択し、[GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams) 構造体を作成した後、[IGameInputDevice::CreateForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) を呼び出して効果を作成します。これは [IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) インターフェイスで表されます。

フォースフィードバック効果の有効期間は、作成された [IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) インターフェイスに関連付けられています。効果が作成されると、デバイスにロードされます。最後の参照がリリースされると、フォースフィードバック効果は停止し、デバイスモーターからアンロードされます。

## フォースフィードバック効果の適用と更新

フォースフィードバック効果を作成すると、それは直接デバイスモーターにロードされます。フォースフィードバックモーターには有限のメモリしかありません。これにより、同時にロードして再生できるフォースフィードバック効果の数が制限されます。この制限に達した後に [IGameInputDevice::CreateForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_createforcefeedbackeffect) を呼び出すと、関数はエラーを返します。

フォースフィードバック効果を作成した後、停止状態でフォースフィードバックモーターにロードされます。ロードされた後、[IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect) インターフェイスを使用して効果の[状態を設定](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setstate)し、`Running` にします。これにより、デバイスモーターで効果が再生されます。

### フォースフィードバック効果の状態

フォースフィードバック効果は、ゲームの現在の状態に合わせていくつかの状態を経て変化します。期待される動作を維持するために、ゲームに合わせて効果の状態を更新し、把握することが重要です。

フォースフィードバックの状態は、次のコードに示すように [GameInputFeedbackEffectState](/reference/input/gameinput/enums/gameinputfeedbackeffectstate) に従って設定できます。

```cpp theme={null}
typedef enum GameInputFeedbackEffectState    
{  
    GameInputFeedbackStopped = 0,  
    GameInputFeedbackRunning = 1,  
    GameInputFeedbackPaused = 2  
} GameInputFeedbackEffectState  
```

フォースフィードバック効果が作成されると、`Stopped` 状態になります。新規または停止中のフィードバック効果が `Running` 状態に設定されると、効果の最初から再生されます。状態を `Paused` に設定すると、フォースフィードバック効果がモーターに影響を与えなくなります。ただし、`Paused` 状態の効果を `Running` に設定すると、フォースフィードバック効果は中断した位置から効果パターンを適用します。

効果を停止すると効果は終了しますが、後で効果を再度トリガーすることができます。たとえば、レーシングゲームでユーザーが荒れた地形から離れたときなどです。同様に、効果の一時停止は、ゲームプレイは変わらないがユーザーが UI (一時停止メニューなど) をナビゲートしたい状況で便利です。

フォースフィードバック効果の状態を設定するには、[IGameInputForceFeedbackEffect::SetState](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setstate) を呼び出します。

### フォースフィードバック効果の更新

フォースフィードバック効果のゲインを調整するか、新しい [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams) 構造体が同じ [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 列挙型を共有する場合は、新しいパラメーターセットを提供します。

#### ゲイン

次のコードに示すように、[IGameInputForceFeedbackEffect::SetGain](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setgain) 関数を使用してゲインを調整することで、フォースフィードバック効果の強度を変更します。

```cpp theme={null}
void SetGain(  
         float gain  
)  
```

ゲインは 0 から 1 の間の値です。既定では、フォースフィードバック効果のゲインは 1 に設定されています。この関数は主に、効果の強度を緩和するために使用されます。

#### 新しいパラメーターの設定

次のコードに示すように、[IGameInputForceFeedbackEffect::SetParams](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/methods/igameinputforcefeedbackeffect_setparams) 関数を使用して、フォースフィードバック効果の新しいパラメーターを提供します。

```cpp theme={null}
bool SetParams(  
         const GameInputForceFeedbackParams* params  
)  
```

この関数を使用してフォースフィードバック効果のパラメーターを置き換える場合は、パラメーターを設定するフォースフィードバック効果と同じ [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 列挙型を使用します。新しいパラメーターは直ちに反映され、実行中の効果を停止せずに適用されます。duration の値が変更されない場合、duration タイマーは**リフレッシュされません**。異なる duration 値が提供されるか、効果が停止して再開された場合にのみリフレッシュされます。

実行中の効果が停止した場合は、新しいパラメーターで再開されます。一部のゲームでは、`GameInputForceFeedbackConstant` の [GameInputForceFeedbackEffectKind](/reference/input/gameinput/enums/gameinputforcefeedbackeffectkind) 列挙型を持つフィードバック効果のパラメーターを設定することで、パラメーターを変更してさまざまなフィードバックパターンをシミュレートできます。

#### GIP デバイスと HID デバイスの機能の違い

コンソールでは、すべてのデバイスが GIP ドライバーモデルを使用します。PC では、デバイスは GIP または HID のいずれかのドライバーモデルを使用できます。ベンダードライバーをインストールすると、一般的に HID モードに変換されます (手動制御用の物理スイッチがある場合を除く)。HID デバイスのフォースフィードバック機能は、元々設計された DirectInput API によって制限されます。GameInput は、可能な限りこれらの制限を回避するようにベストエフォートで動作します。それでも、いくつかの違いは残ります。

HID デバイスは現在、ハードウェアがサポートする追加の軸に関係なく、フォースフィードバックを AngularX 軸に制限しています。この構成は、大多数のレーシングホイールを適切にサポートします。

HID フォースフィードバックは現在、Windows の 19H2 以降のバージョンで利用可能で、今後のアップデートで 19H1 でも動作するように更新される予定です。

## リファレンス API ドキュメント

* [GameInput (API 内容)](/reference/input/gameinput/gameinput_members)
  * 構造体
    * [GameInputDeviceInfo](/reference/input/gameinput/structs/gameinputdeviceinfo)
    * [GameInputForceFeedbackMotorInfo](/reference/input/gameinput/structs/gameinputforcefeedbackmotorinfo)
    * [GameInputForceFeedbackParams](/reference/input/gameinput/structs/gameinputforcefeedbackparams)
    * [GameInputForceFeedbackConditionParams](/reference/input/gameinput/structs/gameinputforcefeedbackconditionparams)

## 関連項目

[IGameInputForceFeedbackEffect](/reference/input/gameinput/interfaces/igameinputforcefeedbackeffect/igameinputforcefeedbackeffect)

[IGameInputDevice](/reference/input/gameinput/interfaces/igameinputdevice/igameinputdevice)


## Related topics

- [GameInput フォースフィードバックインターフェイス](/ja-jp/build/core-features/common/input/hardware/input-hardware-force-feedback.md)
- [GameInput の高度なトピック](/ja-jp/build/core-features/common/input/advanced/input-advanced-topics.md)
- [GameInput の高度なトピック: フォース フィードバックとコールバック](/ja-jp/build/core-features/common/input/advanced/index.md)
- [GameInput ハードウェア: フォース フィードバック、ハプティクス、センサー](/ja-jp/build/core-features/common/input/hardware/index.md)
- [GameInputFeedbackEffectState](/ja-jp/reference/input/gameinput/enums/gameinputfeedbackeffectstate.md)
