Controlling Game Input for Apple TV

Graphics and Games
#WWDC16
Controlling Game Input for Apple TV
Session 607
JJ Cwik Software Engineer
© 2016 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.
What’s New
tvOS 10
Apps may require an MFi game controller
Support for up to four MFi game controllers
Apple TV Remote app
NEW
Siri Remote
MFi Game Controller
Game Controller Framework
Overview
Adds Siri Remote and MFi game controller
support to your game
Game Controller Framework
Overview
Adds Siri Remote and MFi game controller
support to your game
Same API for all controllers
• Detect controllers
• Handle connection, disconnection
• Read inputs
Game Controller Framework
Overview
Adds Siri Remote and MFi game controller
support to your game
Same API for all controllers
• Detect controllers
• Handle connection, disconnection
• Read inputs
Available for tvOS, iOS and macOS
Detecting Controllers
GCController represents a physical controller
Same class for all controllers
Detecting Controllers
GCController represents a physical controller
Same class for all controllers
Currently-connected controllers:
GCController.controllers() // [GCController]
Detecting Controllers
GCController represents a physical controller
Same class for all controllers
Currently-connected controllers:
GCController.controllers() // [GCController]
Connection and disconnection notifications:
GCControllerDidConnectNotification
GCControllerDidDisconnectNotification
Siri Remote
GCController
Siri Remote
GCController
• GCMicroGamepad
Siri Remote
GCController
• GCMicroGamepad
• GCMotion
GCMicroGamepad Profile
DPAD
Dpad (analog or digital)
‘A’ button (digital)
‘X’ button (digital)
GCMicroGamepad Profile
Dpad (analog or digital)
‘A’ button (digital)
‘X’ button (digital)
GCMicroGamepad Profile
‘A’ button
Dpad (analog or digital)
‘A’ button (digital)
‘X’ button (digital)
GCMicroGamepad Profile
Dpad (analog or digital)
‘A’ button (digital)
‘X’ button (digital)
GCMicroGamepad Profile
Dpad (analog or digital)
‘A’ button (digital)
‘X’ button (digital)
‘X’ button
GCMicroGamepad Profile
Buttons
Polling
let isAPressed = controller.microGamepad?.buttonA.isPressed // Bool
let isXPressed = controller.microGamepad?.buttonX.isPressed // Bool
GCMicroGamepad Profile
Buttons
Polling
let isAPressed = controller.microGamepad?.buttonA.isPressed // Bool
let isXPressed = controller.microGamepad?.buttonX.isPressed // Bool
Event callbacks
controller.microGamepad?.buttonA.pressedChangedHandler = myButtonAHandler
controller.microGamepad?.buttonX.pressedChangedHandler = myButtonXHandler
GCMicroGamepad Profile
GCControllerDirectionPad
DPAD
Treated as four buttons
• up, down, left, right
And as two axes
• xAxis, yAxis
GCMicroGamepad Profile
GCControllerAxisInput
Polling
let dpadX = controller.microGamepad?.dpad.xAxis.value // Float, -1.0 to 1.0
let dpadY = controller.microGamepad?.dpad.yAxis.value // Float, -1.0 to 1.0
GCMicroGamepad Profile
GCControllerAxisInput
Polling
let dpadX = controller.microGamepad?.dpad.xAxis.value // Float, -1.0 to 1.0
let dpadY = controller.microGamepad?.dpad.yAxis.value // Float, -1.0 to 1.0
Event callbacks
controller.microGamepad?.dpad.valueChangedHandler = myDpadHandler
Siri Remote
DPAD windowing
Siri Remote
DPAD windowing
y
x
Siri Remote
DPAD windowing
y
x
Provides windowed values (by default)
• Touch start location defines (0, 0)
• Subsequent values relative to start point
Siri Remote
DPAD windowing
Siri Remote
DPAD windowing
Siri Remote
DPAD windowing
y
x
Siri Remote
DPAD windowing
y
x
Siri Remote
DPAD windowing
y
x
Siri Remote
DPAD windowing
y
x
Siri Remote
DPAD windowing
y
x
Opt-in to get absolute dpad values
Places (0, 0) at center of touch surface
controller.microGamepad?.reportsAbsoluteDpadValues = true
Siri Remote
DPAD windowing
Siri Remote
DPAD windowing
y
x
Siri Remote
DPAD windowing
y
x
Siri Remote
Rotation
y
x
DPAD (x, y) values reported in portrait
• Regardless of remote orientation
• X right, Y up
Siri Remote
Rotation
DPAD (x, y) values reported in portrait
• Regardless of remote orientation
• X right, Y up
y
x
Siri Remote
Rotation
Opt-in to report (x, y) based on orientation
• Portrait
• Landscape left
• Landscape right
controller.microGamepad?.allowsRotation = true
y
x
Siri Remote
Motion
GCMotion
• Gravity vector (x, y, z)
• User acceleration (x, y, z)
Siri Remote
Motion
GCMotion
• Gravity vector (x, y, z)
• User acceleration (x, y, z)
Already filtered
Siri Remote
Motion
GCMotion
• Gravity vector (x, y, z)
• User acceleration (x, y, z)
Already filtered
Fused motion data
• Accelerometer and gyroscope
Siri Remote
Motion
Not intended for
• Vigorous shaking
• Aggressive movements
Menu Button
Menu Button
1. Minimize app and return to Apple TV Home Screen
Menu Button
1. Minimize app and return to Apple TV Home Screen
2. Go back one level in app menus
Menu Button
1. Minimize app and return to Apple TV Home Screen
2. Go back one level in app menus
3. Pause / resume gameplay
Menu Button
Menu Button
Child View Controller
Child View Controller
Root View Controller
UIKit apps
Menu Button
Child View Controller
Child View Controller
Root View Controller
UIKit apps
Root View Controller
Main menu
Character selection
Level selection
Gameplay
Pause screen
Games
Menu Button
GCEventViewController
• For single-view controller games
• Use as your root view controller
Menu Button
GCEventViewController
• For single-view controller games
• Use as your root view controller
public var controllerUserInteractionEnabled: Bool
• false: Stay in-game
• true: Return to Home Screen
Menu Button
Managing controllerUserInteractionEnabled
Menu Button
Managing controllerUserInteractionEnabled
Home Screen
Splash
Screen
In-Game
Main Menu
controllerUserInteractionEnabled:
true
true
Menu Button
Managing controllerUserInteractionEnabled
Home Screen
Splash
Screen
In-Game
Main Menu
In-Game
Submenus
Gameplay
Pause Screen
false
false
false
controllerUserInteractionEnabled:
true
true
Menu Button
Pause handler
public var controllerPausedHandler: ((GCController) -> Void)?
Called when Menu button pressed
Menu Button
Pause handler
public var controllerPausedHandler: ((GCController) -> Void)?
Called when Menu button pressed
• In submenus: Go back to previous menu
• In gameplay: Toggle pause state
MFi Game Controller
MFi Game Controller
Optional accessory
Wireless extended gamepad
• DPAD
• ABXY
• 2 thumbsticks
• 2 shoulders
• 2 triggers
• Menu
• Player indicator LEDs
MFi Game Controller
GCExtendedGamepad profile
Property
Type
dpad
leftThumbstick
rightThumbstick
buttonA
buttonB
buttonX
buttonY
leftShoulder
rightShoulder
leftTrigger
rightTrigger
GCControllerDirectionPad
GCControllerButtonInput
MFi Game Controller
Pressure-sensitive
Polling
let digital = controller.extendedGamepad?.buttonA.isPressed // Bool
let analog = controller.extendedGamepad?.buttonA.value // Float, 0.0 to 1.0
MFi Game Controller
Pressure-sensitive
Polling
let digital = controller.extendedGamepad?.buttonA.isPressed // Bool
let analog = controller.extendedGamepad?.buttonA.value // Float, 0.0 to 1.0
Event callbacks
controller.extendedGamepad?.buttonA.pressedChangedHandler = myButtonAHandler // digital
controller.extendedGamepad?.buttonA.valueChangedHandler = myButtonAHandler // analog
Supported Controller Types
tvOS
Siri Remote
Supported Controller Types
tvOS
Siri Remote
Siri Remote and MFi game controllers
Supported Controller Types
tvOS
Siri Remote
Siri Remote and MFi game controllers
MFi game controllers
NEW
Supported Controller Types
tvOS
Specify in Game Controllers capability in Xcode
Automatically updates Info.plist
Needed for App Review
Supported Controller Types
tvOS
App Store
• Badging
• May warn if MFi game controller
has not been paired
Requiring MFi Game Controllers
Design considerations
Game may launch with no game controllers connected
NEW
Requiring MFi Game Controllers
Design considerations
Game may launch with no game controllers connected
Provide feedback to player to connect a game controller
NEW
Requiring MFi Game Controllers
Design considerations
Game may launch with no game controllers connected
Provide feedback to player to connect a game controller
Gracefully handle game controllers that disconnect
NEW
Requiring MFi Game Controllers
Design considerations
Game may launch with no game controllers connected
Provide feedback to player to connect a game controller
Gracefully handle game controllers that disconnect
See “Designing for tvOS” (session 802)
NEW
Apple TV Remote App
NEW
Apple TV Remote App
GCMicroGamepad, GCMotion
NEW
Apple TV Remote App
NEW
Coalescing
controllers[0]
Siri Remote
controllers[1]
Apple TV Remote app
controllers[n]
Apple TV Remote App
NEW
Coalescing
controllers[0]
Siri Remote
controllers[1]
Apple TV Remote app
controllers[n]
Apple TV Remote App
NEW
Separate remotes
controllers[0]
Siri Remote
controllers[1]
Apple TV Remote app
controllers[n]
Apple TV Remote App
NEW
Separate remotes
Opt-in to separate Siri Remote and Apple
TV Remote app
controllers[0]
Siri Remote
GCSupportsMultipleMicroGamepads YES
in Info.plist
controllers[1]
Apple TV Remote app
controllers[n]
Apple TV Remote App
Design considerations
Game Controller mode is in landscape
NEW
Apple TV Remote App
Design considerations
Game Controller mode is in landscape
Dpad values automatically rotated 90 degrees
NEW
Apple TV Remote App
Design considerations
Game Controller mode is in landscape
Dpad values automatically rotated 90 degrees
Don’t rotate dpad values in-game, instead set
allowsRotation = true
NEW
Apple TV Remote App
NEW
Design considerations
Game Controller mode separates ‘A’ Button
from touchpad surface
Touchpad
‘A’ Button
Apple TV Remote App
NEW
Design considerations
Game Controller mode separates ‘A’ Button
from touchpad surface
Can still simultaneously use both
Touchpad
‘A’ Button
Apple TV Remote App
NEW
Design considerations
Game Controller mode separates ‘A’ Button
from touchpad surface
Can still simultaneously use both
‘A’ Button presses don’t implicitly provide
touchpad DPAD values
Touchpad
‘A’ Button
Multiple Controllers
Multiple Controllers
One Siri Remote
Up to four MFi game controllers
Apple TV Remote app
NEW
Single-player game
Single-player game
Single-player game
Single-player game
Multiple Controllers
Single-player best practices
Allow user to seamlessly switch to a different controller
Multiple Controllers
Single-player best practices
Allow user to seamlessly switch to a different controller
Treat intentional input (buttons, DPAD, thumbsticks, touch surface) as user intent
Multiple Controllers
Single-player best practices
Allow user to seamlessly switch to a different controller
Treat intentional input (buttons, DPAD, thumbsticks, touch surface) as user intent
Take motion from the last controller to register intentional input
Summary
Siri Remote
Menu button
MFi game controllers
Apple TV Remote app
Multiple controllers
More Information
https://developer.apple.com/wwdc16/607
Related Sessions
Mastering UIKit on tvOS
Presidio
Wednesday 10:00AM
Designing for tvOS
Presidio
Tuesday 4:00PM
Labs
Game Controllers Lab
Graphics, Games, and
Media Lab A
Thursday 9:00AM
tvOS Lab
Frameworks Lab D
Thursday 9:00AM
Download PDF

advertising