ゲームパッドと振動Gamepad and vibration

このページでは、Windows.Gaming.Input.Gamepad とユニバーサル Windows プラットフォーム (UWP) 用の関連 API を使った、Xbox One ゲームパッドを対象にしたプログラミングの基礎について説明します。This page describes the basics of programming for Xbox One gamepads using Windows.Gaming.Input.Gamepad and related APIs for the Universal Windows Platform (UWP).

ここでは、次の項目について紹介します。By reading this page, you'll learn:

  • 接続されているゲームパッドとそのユーザーの一覧を収集する方法how to gather a list of connected gamepads and their users
  • ゲームパッドが追加または削除されたことを検出する方法how to detect that a gamepad has been added or removed
  • 1 つ以上のゲームパッドの入力を読み取る方法how to read input from one or more gamepads
  • 振動とリアル コマンドを送信する方法how to send vibration and impulse commands
  • ゲーム パッドを UI ナビゲーション デバイスとして動作する方法how gamepads behave as UI navigation devices

ゲームパッドの概要Gamepad overview

Xbox ワイヤレス コントローラーや Xbox ワイヤレス コントローラー S などのゲームパッドは、汎用のゲーム入力デバイスです。Gamepads like the Xbox Wireless Controller and Xbox Wireless Controller S are general-purpose gaming input devices. ゲームパッドは Xbox One の標準入力デバイスです。一般的に、キーボードやマウスを好まない Windows のゲーマーが選びます。They're the standard input device on Xbox One and a common choice for Windows gamers when they don't favor a keyboard and mouse. ゲームパッドは、Windows 10 および Xbox UWP アプリで Windows.Gaming.Input 名前空間によってサポートされています。Gamepads are supported in Windows 10 and Xbox UWP apps by the Windows.Gaming.Input namespace.

Xbox One ゲームパッドかが装備、方向パッド (パッド);ABXYビュー、およびメニューボタンは左と右側のサムスティック、エンジン、およびトリガーです。4 つの振動モーターの合計。Xbox One gamepads are equipped with a directional pad (or D-pad); A, B, X, Y, View, and Menu buttons; left and right thumbsticks, bumpers, and triggers; and a total of four vibration motors. どちらのサムスティックも、X 軸と Y 軸のデュアル アナログの読み取り値を提供し、内側に押すとボタンとしても機能します。Both thumbsticks provide dual analog readings in the X and Y axes, and also act as a button when pressed inward. 各トリガーでは、どの程度はプルバックを表すアナログの読み取りを提供します。Each trigger provides an analog reading that represents how far it's pulled back.

注意

Windows.Gaming.Input.Gamepad Xbox 360 ゲーム パッド、Xbox One ゲームパッドの標準として同じコントロール レイアウトをサポートしています。Windows.Gaming.Input.Gamepad also supports Xbox 360 gamepads, which have the same control layout as standard Xbox One gamepads.

振動とリアル トリガーVibration and impulse triggers

Xbox One ゲームパッドには、強弱のゲームパッドの振動を生むための独立した 2 つのモーターと、トリガーごとに鋭い振動を生む 2 つの専用のモーターがあります (この独自の機能のために、Xbox One ゲームパッドのトリガーは_リアル トリガー_と呼ばれています)。Xbox One gamepads provide two independent motors for strong and subtle gamepad vibration as well as two dedicated motors for providing sharp vibration to each trigger (this unique feature is the reason that Xbox One gamepad triggers are referred to as impulse triggers).

注意

Xbox 360 のゲーム パッドが装備されていない_インパルス トリガー_します。Xbox 360 gamepads are not equipped with impulse triggers.

詳しくは、「振動とリアル トリガーの概要」をご覧ください。For more information, see Vibration and impulse triggers overview.

サムスティックのデッドゾーンThumbstick deadzones

中央の位置で待機中のサムスティックは、常に安定してニュートラルな X 軸と Y 軸の読み取り値を生成することが理想的ですが、A thumbstick at rest in the center position would ideally produce the same, neutral reading in the X and Y axes every time. 機械的な力とサムスティックの感度のために、中央の位置での実際の読み取り値は、理想的なニュートラルの値の近似値でしかなく、読み取りごとに異なる可能性があります。However, due to mechanical forces and the sensitivity of the thumbstick, actual readings in the center position only approximate the ideal neutral value and can vary between subsequent readings. このため、小さなを常に使用する必要があります_デッドゾーン_—は無視されますが、理想的な中央の位置に近い値の範囲—を補正するため、製造の相違点、機械的な損傷では、またはその他の gamepad問題です。For this reason, you must always use a small deadzone—a range of values near the ideal center position that are ignored—to compensate for manufacturing differences, mechanical wear, or other gamepad issues.

デッドゾーンを大きくすることは、意図する入力と意図しない入力とを分ける簡単な方法です。Larger deadzones offer a simple strategy for separating intentional input from unintentional input.

詳しくは、「サムスティックの読み取り」をご覧ください。For more information, see Reading the thumbsticks.

UI のナビゲーションUI navigation

ユーザー インターフェイスの操作に異なる入力デバイスをサポートする負担を軽くし、ゲームとデバイス間の整合性を高めるため、ほとんどの物理_入力デバイスは、_ UI ナビゲーション コントローラーと呼ばれる個別の論理_入力デバイスとして同時に機能します_。In order to ease the burden of supporting the different input devices for user interface navigation and to encourage consistency between games and devices, most physical input devices simultaneously act as a separate logical input device called a UI navigation controller. UI ナビゲーション コントローラーは、各種入力デバイスに共通の UI ナビゲーション コマンドのボキャブラリを提供します。The UI navigation controller provides a common vocabulary for UI navigation commands across input devices.

ゲームパッドのマップを UI ナビゲーション コント ローラーとして、セットに必要な左のサムスティック、ナビゲーション コマンドのパッド、ビューメニュー、 ****、およびBボタン。As a UI navigation controller, gamepads map the required set of navigation commands to the left thumbstick, D-pad, View, Menu, A, and B buttons.

ナビゲーション コマンドNavigation command ゲームパッド入力Gamepad input
UpUp 左スティックを上/方向パッドを上Left thumbstick up / D-pad up
DownDown 左スティックを下/方向パッドを下Left thumbstick down / D-pad down
LeftLeft 左スティックを左/方向パッドを左Left thumbstick left / D-pad left
Right 左スティックを右/方向パッドを右Left thumbstick right / D-pad right
ビューView 表示ボタンView button
MenuMenu メニュー ボタンMenu button
OKAccept A ボタンA button
CancelCancel B ボタンB button

また、ゲームパッドはナビゲーション コマンドのすべてのオプション セットをその他の入力にマップします。Additionally, gamepads map all of the optional set of navigation commands to the remaining inputs.

ナビゲーション コマンドNavigation command ゲームパッド入力Gamepad input
PageUpPage Up 左トリガーLeft trigger
PageDownPage Down 右トリガーRight trigger
Page LeftPage Left L ボタンLeft bumper
Page RightPage Right R ボタンRight bumper
Scroll UpScroll Up 右スティックを上Right thumbstick up
Scroll DownScroll Down 右スティックを下Right thumbstick down
Scroll LeftScroll Left 右スティックを左Right thumbstick left
Scroll RightScroll Right 右スティックを右Right thumbstick right
Context 1Context 1 X ボタンX Button
Context 2Context 2 Y ボタンY Button
Context 3Context 3 左スティックを押すLeft thumbstick press
Context 4Context 4 右スティックを押すRight thumbstick press

ゲームパッドの検出と追跡Detect and track gamepads

ゲームパッドはシステムによって管理されるため、ゲームパッドを自分で作成したり初期化する必要はありません。Gamepads are managed by the system, therefore you don't have to create or initialize them. 接続されているゲームパッドとイベントの一覧はシステムによって提供され、ゲームパッドが追加または削除されると通知されます。The system provides a list of connected gamepads and events to notify you when a gamepad is added or removed.

ゲームパッドの一覧The gamepads list

Gamepad クラスには静的プロパティである Gamepad が用意されています。これは、現在接続されているゲームパッドの読み取り専用リストです。The Gamepad class provides a static property, Gamepads, which is a read-only list of gamepads that are currently connected. 接続されているゲームパッドの一部に興味のみあります、ためには、通じてそれらへのアクセスではなく、独自のコレクションを管理することをお勧め、Gamepadsプロパティ。Because you might only be interested in some of the connected gamepads, it's recommended that you maintain your own collection instead of accessing them through the Gamepads property.

次の例では、接続されているすべてのゲームパッドを新しいコレクションにコピーします。The following example copies all connected gamepads into a new collection. バック グラウンドで他のスレッドがこのコレクションにアクセスするため (で、 GamepadAddedGamepadRemovedイベント)、任意のコードを読み取るまたは更新プログラムに関するロックを配置する必要がある、コレクションです。Note that because other threads in the background will be accessing this collection (in the GamepadAdded and GamepadRemoved events), you need to place a lock around any code that reads or updates the collection.

auto myGamepads = ref new Vector<Gamepad^>();
critical_section myLock{};

for (auto gamepad : Gamepad::Gamepads)
{
    // Check if the gamepad is already in myGamepads; if it isn't, add it.
    critical_section::scoped_lock lock{ myLock };
    auto it = std::find(begin(myGamepads), end(myGamepads), gamepad);

    if (it == end(myGamepads))
    {
        // This code assumes that you're interested in all gamepads.
        myGamepads->Append(gamepad);
    }
}
private readonly object myLock = new object();
private List<Gamepad> myGamepads = new List<Gamepad>();
private Gamepad mainGamepad;

private void GetGamepads()
{
    lock (myLock)
    {
        foreach (var gamepad in Gamepad.Gamepads)
        {
            // Check if the gamepad is already in myGamepads; if it isn't, add it.
            bool gamepadInList = myGamepads.Contains(gamepad);

            if (!gamepadInList)
            {
                // This code assumes that you're interested in all gamepads.
                myGamepads.Add(gamepad);
            }
        }
    }   
}

ゲームパッドの追加と削除Adding and removing gamepads

ゲームパッドを追加または削除されると、ときに、 GamepadAddedGamepadRemovedイベントが発生します。When a gamepad is added or removed, the GamepadAdded and GamepadRemoved events are raised. これらのイベントハンドラーを登録することで、現在接続されているゲームパッドを追跡できます。You can register handlers for these events to keep track of the gamepads that are currently connected.

次の例では、追加されたゲームパッドの追跡を開始します。The following example starts tracking a gamepad that's been added.

Gamepad::GamepadAdded += ref new EventHandler<Gamepad^>(Platform::Object^, Gamepad^ args)
{
    // Check if the just-added gamepad is already in myGamepads; if it isn't, add
    // it.
    critical_section::scoped_lock lock{ myLock };
    auto it = std::find(begin(myGamepads), end(myGamepads), args);

    if (it == end(myGamepads))
    {
        // This code assumes that you're interested in all new gamepads.
        myGamepads->Append(args);
    }
}
Gamepad.GamepadAdded += (object sender, Gamepad e) =>
{
    // Check if the just-added gamepad is already in myGamepads; if it isn't, add
    // it.
    lock (myLock)
    {
        bool gamepadInList = myGamepads.Contains(e);

        if (!gamepadInList)
        {
            myGamepads.Add(e);
        }
    }
};

次の例では、削除されているゲームパッドの追跡を停止します。The following example stops tracking a gamepad that's been removed. 削除したときに追跡しているゲームパッドする動作を処理する必要もありますたとえば、このコードはのみ 1 つのゲーム パッドからの入力を追跡し、だけに設定nullptrが削除されたとき。You'll also need to handle what happens to the gamepads that you're tracking when they're removed; for example, this code only tracks input from one gamepad, and simply sets it to nullptr when it's removed. すべてのフレーム、ゲームパッドがアクティブである場合とどのゲームパッド コント ローラーの接続および切断されたときからの入力を収集する更新プログラムを確認する必要があります。You'll need to check every frame if your gamepad is active, and update which gamepad you're gathering input from when controllers are connected and disconnected.

Gamepad::GamepadRemoved += ref new EventHandler<Gamepad^>(Platform::Object^, Gamepad^ args)
{
    unsigned int indexRemoved;
    critical_section::scoped_lock lock{ myLock };

    if(myGamepads->IndexOf(args, &indexRemoved))
    {
        if (m_gamepad == myGamepads->GetAt(indexRemoved))
        {
            m_gamepad = nullptr;
        }

        myGamepads->RemoveAt(indexRemoved);
    }
}
Gamepad.GamepadRemoved += (object sender, Gamepad e) =>
{
    lock (myLock)
    {
        int indexRemoved = myGamepads.IndexOf(e);

        if (indexRemoved > -1)
        {
            if (mainGamepad == myGamepads[indexRemoved])
            {
                mainGamepad = null;
            }

            myGamepads.RemoveAt(indexRemoved);
        }
    }
};

参照してくださいゲームのプラクティスを入力詳細についてはします。See Input practices for games for more information.

ユーザーとヘッドセットUsers and headsets

各ゲームパッドは、ユーザー アカウントと関連付けることでユーザーの ID をユーザーのゲームプレイにリンクできます。また、ボイス チャットやゲーム内機能を円滑化するためにヘッドセットをアタッチすることもできます。Each gamepad can be associated with a user account to link their identity to their gameplay, and can have a headset attached to facilitate voice chat or in-game features. ユーザーとの連携およびヘッドセット操作について詳しくは、ユーザーおよびそのデバイスの追跡と、ヘッドセットに関するページをご覧ください。To learn more about working with users and headsets, see Tracking users and their devices and Headset.

ゲームパッドの読み取りReading the gamepad

目的のゲームパッドを特定したら、入力を収集する準備は完了です。After you identify the gamepad that you're interested in, you're ready to gather input from it. ただし、なじみのある一部の他の種類の入力とは違い、ゲームパッドはイベントを発生することによって状態の変化を伝えるわけではありません。However, unlike some other kinds of input that you might be used to, gamepads don't communicate state-change by raising events. 代わりに、イベントを_ポーリング_することで現在の状態を定期的に読み取ります。Instead, you take regular readings of their current state by polling them.

ゲームパッドのポーリングPolling the gamepad

ポーリングでは、明確な時点におけるナビゲーション デバイスのスナップショットをキャプチャします。Polling captures a snapshot of the navigation device at a precise point in time. 入力を収集するこのアプローチはほとんどのゲームに最適です。ゲームのロジックはイベント駆動型ではなく、確定的なループの中で実行されることが一般的なためです。また通常は、徐々に集めた多数の単一の入力によるコマンドを解釈するより、一度に集めた入力によるゲーム コマンドを解釈する方が簡単になります。This approach to input gathering is a good fit for most games because their logic typically runs in a deterministic loop rather than being event-driven; it's also typically simpler to interpret game commands from input gathered all at once than it is from many single inputs gathered over time.

ゲームパッドをポーリングするには、GetCurrentReading を呼び出します。この関数はゲームパッドの状態が格納された GamepadReading を返します。You poll a gamepad by calling GetCurrentReading; this function returns a GamepadReading that contains the state of the gamepad.

次の例では、ゲームパッドをポーリングして現在の状態を確認します。The following example polls a gamepad for its current state.

auto gamepad = myGamepads[0];

GamepadReading reading = gamepad->GetCurrentReading();
Gamepad gamepad = myGamepads[0];

GamepadReading reading = gamepad.GetCurrentReading();

読み取りデータには、ゲームパッドの状態だけでなく、正確にいつ状態が取得されたかを示すタイムスタンプも含まれます。 In addition to the gamepad state, each reading includes a timestamp that indicates precisely when the state was retrieved. このタイムスタンプは、以前の読み取りのタイミングや、ゲームのシミュレーションのタイミングと関連付けに便利です。The timestamp is useful for relating to the timing of previous readings or to the timing of the game simulation.

サムスティックの読み取りReading the thumbsticks

各サムスティックは、X 軸と Y 軸で -1.0 ~ +1.0 のアナログの読み取り値を提供します。Each thumbstick provides an analog reading between -1.0 and +1.0 in the X and Y axes. X 軸では、-1.0 の値はサムスティックを最も左に移動した位置に対応し、+1.0 の値はサムスティックを最も右に移動した位置に対応します。In the X axis, a value of -1.0 corresponds to the left-most thumbstick position; a value of +1.0 corresponds to right-most position. Y 軸では、-1.0 の値はサムスティックを最も下に移動した位置に対応し、+1.0 の値はサムスティックを最も上に移動した位置に対応します。In the Y axis, a value of -1.0 corresponds to the bottom-most thumbstick position; a value of +1.0 corresponds to the top-most position. 両方の軸で、値は約、後続の読み取り; の間、スティックは、中央の位置を変えるには、正確な値は 0.0 があってもこのバリエーションを緩和するための戦略は、このセクションで後で説明します。In both axes, the value is approximately 0.0 when the stick is in the center position, but it's normal for the precise value to vary, even between subsequent readings; strategies for mitigating this variation are discussed later in this section.

左のサムスティックの X 軸の値は、GamepadReading 構造体の LeftThumbstickX プロパティから読み取られ、Y 軸の値は LeftThumbstickY プロパティから読み取られます。The value of the left thumbstick's X axis is read from the LeftThumbstickX property of the GamepadReading structure; the value of the Y axis is read from the LeftThumbstickY property. 右のサムスティックの X 軸の値は、RightThumbstickX プロパティから読み取られ、Y 軸の値は RightThumbstickY プロパティから読み取られます。The value of the right thumbstick's X axis is read from the RightThumbstickX property; the value of the Y axis is read from the RightThumbstickY property.

float leftStickX = reading.LeftThumbstickX;   // returns a value between -1.0 and +1.0
float leftStickY = reading.LeftThumbstickY;   // returns a value between -1.0 and +1.0
float rightStickX = reading.RightThumbstickX; // returns a value between -1.0 and +1.0
float rightStickY = reading.RightThumbstickY; // returns a value between -1.0 and +1.0
double leftStickX = reading.LeftThumbstickX;   // returns a value between -1.0 and +1.0
double leftStickY = reading.LeftThumbstickY;   // returns a value between -1.0 and +1.0
double rightStickX = reading.RightThumbstickX; // returns a value between -1.0 and +1.0
double rightStickY = reading.RightThumbstickY; // returns a value between -1.0 and +1.0

サムスティックの値を読み取るとき、中央の位置で待機中のサムスティックの値は、一定してニュートラルの 0.0 にはなりません。サムスティックを動かし、中央の位置に戻るたびに、0.0 に近い値が生成されます。When reading the thumbstick values, you'll notice that they don't reliably produce a neutral reading of 0.0 when the thumbstick is at rest in the center position; instead, they'll produce different values near 0.0 each time the thumbstick is moved and returned to the center position. このばらつきを少なくするために、小さな_デッドゾーン_を実装します。デッドゾーン+は、理想の中央の位置付近の、無視される範囲の値です。To mitigate these variations, you can implement a small deadzone, which is a range of values near the ideal center position that are ignored. デッドゾーンを実装する方法の 1 つは、サムスティックが中央から移動された距離を特定し、読み取り値が指定した距離以下の場合は無視することです。One way to implement a deadzone is to determine how far from center the thumbstick has moved, and ignoring the readings that are nearer than some distance you choose. おおよその距離を計算できます—スティックの測定値は基本的に、極座標、いない平面の値であるために、正確なことはありません—ピタゴラスの定理を使用するだけで。You can compute the distance roughly—it's not exact because thumbstick readings are essentially polar, not planar, values—just by using the Pythagorean theorem. これで、放射状のデッドゾーンが作られます。This produces a radial deadzone.

次の例は、ピタゴラスの定理を使った基本的な放射状のデッドゾーンを示しています。The following example demonstrates a basic radial deadzone using the Pythagorean theorem.

float leftStickX = reading.LeftThumbstickX;   // returns a value between -1.0 and +1.0
float leftStickY = reading.LeftThumbstickY;   // returns a value between -1.0 and +1.0

// choose a deadzone -- readings inside this radius are ignored.
const float deadzoneRadius = 0.1;
const float deadzoneSquared = deadzoneRadius * deadzoneRadius;

// Pythagorean theorem -- for a right triangle, hypotenuse^2 = (opposite side)^2 + (adjacent side)^2
auto oppositeSquared = leftStickY * leftStickY;
auto adjacentSquared = leftStickX * leftStickX;

// accept and process input if true; otherwise, reject and ignore it.
if ((oppositeSquared + adjacentSquared) > deadzoneSquared)
{
    // input accepted, process it
}
double leftStickX = reading.LeftThumbstickX;   // returns a value between -1.0 and +1.0
double leftStickY = reading.LeftThumbstickY;   // returns a value between -1.0 and +1.0

// choose a deadzone -- readings inside this radius are ignored.
const double deadzoneRadius = 0.1;
const double deadzoneSquared = deadzoneRadius * deadzoneRadius;

// Pythagorean theorem -- for a right triangle, hypotenuse^2 = (opposite side)^2 + (adjacent side)^2
double oppositeSquared = leftStickY * leftStickY;
double adjacentSquared = leftStickX * leftStickX;

// accept and process input if true; otherwise, reject and ignore it.
if ((oppositeSquared + adjacentSquared) > deadzoneSquared)
{
    // input accepted, process it
}

各サムスティックは、内側に押すことでボタンとしても機能します。この入力の読み取りの詳細については、「ボタンの読み取り」をご覧ください。Each thumbstick also acts as a button when pressed inward; for more information on reading this input, see Reading the buttons.

トリガーの読み取りReading the triggers

トリガーは、0.0 (完全に離された状態) ~ 1.0 (完全に押された状態) の浮動小数点値として表されます。The triggers are represented as floating-point values between 0.0 (fully released) and 1.0 (fully depressed). 左のトリガーの値は、GamepadReading 構造体の LeftTrigger プロパティから、右のトリガーの値は RightTrigger プロパティから読み取られます。The value of the left trigger is read from the LeftTrigger property of the GamepadReading structure; the value of the right trigger is read from the RightTrigger property.

float leftTrigger  = reading.LeftTrigger;  // returns a value between 0.0 and 1.0
float rightTrigger = reading.RightTrigger; // returns a value between 0.0 and 1.0
double leftTrigger = reading.LeftTrigger;  // returns a value between 0.0 and 1.0
double rightTrigger = reading.RightTrigger; // returns a value between 0.0 and 1.0

ボタンの読み取りReading the buttons

各ゲームパッド ボタン—4 つの方向パッド、左端と右端のエンジン、左および右のサムスティック キーを押して、 ABXYビュー、およびメニュー—(ダウン) 押されたまたは (up) をリリースしたかどうかを示すデジタル閲覧を提供します。Each of the gamepad buttons—the four directions of the D-pad, left and right bumpers, left and right thumbstick press, A, B, X, Y, View, and Menu—provides a digital reading that indicates whether it's pressed (down) or released (up). 効率性、ボタンの測定値がない個々 のブール値として表されます。代わりに、すべて豊富で表される 1 つのビット フィールドに、 GamepadButtons列挙体。For efficiency, button readings aren't represented as individual boolean values; instead, they're all packed into a single bitfield that's represented by the GamepadButtons enumeration.

ボタンの値は、GamepadReading 構造体の Buttons プロパティから読み取ります。The button values are read from the Buttons property of the GamepadReading structure. このプロパティはビットフィールドであるため、ビット演算子マスクを使用して目的のボタンの値を分離します。Because this property is a bitfield, bitwise masking is used to isolate the value of the button that you're interested in. 対応するビットが設定されているときはボタンが押されており (ダウン)、それ以外の場合はボタンが離されています (アップ)。The button is pressed (down) when the corresponding bit is set; otherwise, it's released (up).

次の例では、A ボタンが押されているかどうかを判別します。The following example determines whether the A button is pressed.

if (GamepadButtons::A == (reading.Buttons & GamepadButtons::A))
{
    // button A is pressed
}
if (GamepadButtons.A == (reading.Buttons & GamepadButtons.A))
{
    // button A is pressed
}

次の例では、A ボタンが離されているかどうかを判別します。The following example determines whether the A button is released.

if (GamepadButtons::None == (reading.Buttons & GamepadButtons::A))
{
    // button A is released
}
if (GamepadButtons.None == (reading.Buttons & GamepadButtons.A))
{
    // button A is released
}

たいことがありますから、ボタンが遷移するときに決定するリリースに押された状態または、複数のボタンが押された状態またはリリースされるかどうか、または特定の方法で一連のボタンが配置されている場合に押されたリリース—いくつか押すと、失敗します。Sometimes you might want to determine when a button transitions from pressed to released or released to pressed, whether multiple buttons are pressed or released, or if a set of buttons is arranged in a particular way—some pressed, some not. これらの各状態を検出する方法について詳しくは、「ボタンの状態遷移の検出」および「ボタンの複雑な配置の検出」をご覧ください。For information on how to detect each of these conditions, see Detecting button transitions and Detecting complex button arrangements.

ゲームパッド入力のサンプルの実行Run the gamepad input sample

GamepadUWP サンプル (github) は、ゲームパッドに接続して、その状態を読み取る方法を示しています。The GamepadUWP sample (github) demonstrates how to connect to a gamepad and read its state.

振動とリアル トリガーの概要Vibration and impulse triggers overview

ゲームパッド内の振動モーターは、触覚的なフィードバックをユーザーに提供することを目的としています。The vibration motors inside a gamepad are for providing tactile feedback to the user. ゲームではこの機能を、より高い没入感を生み出す、状態情報 (ダメージを受けたなど) の伝達を助ける、重要なアイテムに近接信号を送るなど、クリエイティブな用途に利用します。Games use this ability to create a greater sense of immersion, to help communicate status information (such as taking damage), to signal proximity to important objects, or for other creative uses.

Xbox One ゲームパッドには、独立した振動モーターが合計 4 つ搭載されています。Xbox One gamepads are equipped with a total of four independent vibration motors. 2 つは、ゲームパッドの本体にある大規模なモーター左側のモーター右モーター穏やかより微妙な振動を提供しますが、大まかな、高 amplitude の振動を提供します。Two are large motors located in the gamepad body; the left motor provides rough, high-amplitude vibration, while the right motor provides gentler, more subtle vibration. 残り 2 つは小型のモーターで、各トリガー内に 1 つずつ組み込まれていて、トリガーを操作しているユーザーの指に直接、鋭い弾けるような振動を伝えます。Xbox One ゲームパッドのトリガーは、この独自の機能のために、_リアル トリガー_と呼ばれます。The other two are small motors, one inside each trigger, that provide sharp bursts of vibration directly to the user's trigger fingers; this unique ability of the Xbox One gamepad is the reason its triggers are referred to as impulse triggers. これらのモーターが協調することで、幅広い種類の触感を生成できます。By orchestrating these motors together, a wide range of tactile sensations can be produced.

振動とリアル トリガーの使用Using vibration and impulse

ゲームパッドの振動は、Gamepad クラスの Vibration プロパティによって制御されます。Gamepad vibration is controlled through the Vibration property of the Gamepad class. Vibration インスタンスである、 GamepadVibrationの 4 つの浮動小数点から成る構造では、ポイント値。 値は各、モーターのいずれかの濃度。Vibration is an instance of the GamepadVibration structure which is made up of four floating point values; each value represents the intensity of one of the motors.

メンバー、Gamepad.Vibrationプロパティを直接変更することができます、個別に初期化することをお勧めGamepadVibration値し、それをコピーするインスタンス、Gamepad.Vibration実際のモーターの強度を変更するプロパティ一度にすべて。Although the members of the Gamepad.Vibration property can be modified directly, it's recommended that you initialize a separate GamepadVibration instance to the values you want, and then copy it into the Gamepad.Vibration property to change the actual motor intensities all at once.

次の例は、モーターの強さを一度に変更する方法を示しています。The following example demonstrates how to change the motor intensities all at once.

// get the first gamepad
Gamepad^ gamepad = Gamepad::Gamepads->GetAt(0);

// create an instance of GamepadVibration
GamepadVibration vibration;

// ... set vibration levels on vibration struct here

// copy the GamepadVibration struct to the gamepad
gamepad.Vibration = vibration;
// get the first gamepad
Gamepad gamepad = Gamepad.Gamepads[0];

// create an instance of GamepadVibration
GamepadVibration vibration = new GamepadVibration();

// ... set vibration levels on vibration struct here

// copy the GamepadVibration struct to the gamepad
gamepad.Vibration = vibration;

振動モーターの使用Using the vibration motors

左右の振動モーターの値は、0.0 (振動なし) ~ 1.0 (最も強い振動) の浮動小数点値になります。The left and right vibration motors take floating point values between 0.0 (no vibration) and 1.0 (most intense vibration). 左のモーターの強さは、GamepadVibration 構造体の LeftMotor プロパティによって設定され、右のモーターの強さは RightMotor プロパティによって設定されます。The intensity of the left motor is set by the LeftMotor property of the GamepadVibration structure; the intensity of the right motor is set by the RightMotor property.

次の例では両方の振動モーターの強さを設定し、ゲームパッドの振動を有効にします。The following example sets the intensity of both vibration motors and activates gamepad vibration.

GamepadVibration vibration;
vibration.LeftMotor = 0.80;  // sets the intensity of the left motor to 80%
vibration.RightMotor = 0.25; // sets the intensity of the right motor to 25%
gamepad.Vibration = vibration;
GamepadVibration vibration = new GamepadVibration();
vibration.LeftMotor = 0.80;  // sets the intensity of the left motor to 80%
vibration.RightMotor = 0.25; // sets the intensity of the right motor to 25%
mainGamepad.Vibration = vibration;

この 2 つのモーターは同じではないため、これらのプロパティを同じ値に設定しても、一方のモーターともう一方のモーターの振動は同じになりません。Remember that these two motors are not identical so setting these properties to the same value doesn't produce the same vibration in one motor as in the other. 左側のモーター、任意の値の右側モーターをより強力な振動低い頻度でが生成—、同じ値の—より高い頻度で穏やか振動を生成します。For any value, the left motor produces a stronger vibration at a lower frequency than the right motor which—for the same value—produces a gentler vibration at a higher frequency. 最大値でも、左のモーターでは右のモーターと同じ高い周波数を生成することはできず、右のモーターは左のモーターほど強い力を生み出すことはできません。Even at the maximum value, the left motor can't produce the high frequencies of the right motor, nor can the right motor produce the high forces of the left motor. ただし、これらのモーターはゲームパッドの本体によってしっかりと連結しているため、各モーターの特徴は異なり、振動の強度が異なる場合でも、プレイヤーがそれぞれの振動を完全に分けて感じることはありません。Still, because the motors are rigidly connected by the gamepad body, players don't experience the vibrations fully independently even though the motors have different characteristics and can vibrate with different intensities. このアレンジによって、モーターがまったく同じ場合よりも、より幅広く表現豊かに触感を生み出すことができます。This arrangement allows for a wider, more expressive range of sensations to be produced than if the motors were identical.

リアル トリガーの使用Using the impulse triggers

各リアル トリガーのモーターの値は、0.0 (振動なし) ~ 1.0 (最も強い振動) の浮動小数点値になります。Each impulse trigger motor takes a floating point value between 0.0 (no vibration) and 1.0 (most intense vibration). 左のトリガー モーターの強さは、GamepadVibration 構造体の LeftTrigger プロパティによって設定され、右のトリガー の強さは RightTrigger プロパティによって設定されます。The intensity of the left trigger motor is set by the LeftTrigger property of the GamepadVibration structure; the intensity of the right trigger is set by the RightTrigger property.

次の例では両方のリアル トリガーの強さを設定し、有効にします。The following example sets intensity of both impulse triggers and activates them.

GamepadVibration vibration;
vibration.LeftTrigger = 0.75;  // sets the intensity of the left trigger to 75%
vibration.RightTrigger = 0.50; // sets the intensity of the right trigger to 50%
gamepad.Vibration = vibration;
GamepadVibration vibration = new GamepadVibration();
vibration.LeftTrigger = 0.75;  // sets the intensity of the left trigger to 75%
vibration.RightTrigger = 0.50; // sets the intensity of the right trigger to 50%
mainGamepad.Vibration = vibration;

本体のモーターと異なり、トリガー内のこの 2 つの振動モーターは同じであるため、同じ値を設定すると、どちらのモーターでも同じ振動が生成されます。Unlike the others, the two vibration motors inside the triggers are identical so they produce the same vibration in either motor for the same value. ただし、これらのモーターは何らかの形で強く連結されてはいないため、プレイヤーは振動を個別に感じます。However, because these motors are not rigidly connected in any way, players experience the vibrations independently. このアレンジでは、完全に独立した感覚を両方のトリガーに提供することができ、ゲームパッド本体のモーターよりも、個別の情報を伝えることができます。This arrangement allows for fully independent sensations to be directed to both triggers simultaneously, and helps them to convey more specific information than the motors in the gamepad body can.

ゲームパッドの振動のサンプルの実行Run the gamepad vibration sample

GamepadVibrationUWP サンプル (github) では、ゲームパッドの振動モーターとリアル トリガーを使用して、さまざまな効果を生む方法を示しています。The GamepadVibrationUWP sample (github) demonstrates how the gamepad vibration motors and impulse triggers are used to produce a variety of effects.

関連項目See also