https://github.com/thatfactory/gcoverseer
Observe and manage game controllers using AsyncSequence 🎮
https://github.com/thatfactory/gcoverseer
async-sequence game-controller game-development swift
Last synced: 4 months ago
JSON representation
Observe and manage game controllers using AsyncSequence 🎮
- Host: GitHub
- URL: https://github.com/thatfactory/gcoverseer
- Owner: thatfactory
- License: mit
- Created: 2020-10-13T19:24:42.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2026-02-15T22:48:10.000Z (4 months ago)
- Last Synced: 2026-02-16T06:13:28.653Z (4 months ago)
- Topics: async-sequence, game-controller, game-development, swift
- Language: Swift
- Homepage:
- Size: 95.7 KB
- Stars: 8
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://developer.apple.com/swift/)
[](https://developer.apple.com/xcode/)
[](https://developer.apple.com/documentation/xcode/swift-packages)
[](https://en.wikipedia.org/wiki/List_of_Apple_operating_systems)
[](https://en.wikipedia.org/wiki/MIT_License)
[](https://github.com/thatfactory/gcoverseer/actions/workflows/ci.yml)
[](https://github.com/thatfactory/gcoverseer/actions/workflows/release.yml)
# GCOverseer 🎮
[AsyncSequence](https://developer.apple.com/documentation/swift/asyncsequence) wrapper around Apple's [Game Controller Framework](https://developer.apple.com/documentation/gamecontroller).
## Usage Examples
### Handle Controller Connection/Disconnection Events
```swift
import SpriteKit
import GCOverseer
class GameScene: SKScene {
let gcOverseer = GCOverseer()
override init(size: CGSize) {
super.init(size: size)
// 🎮 Handle game controller connection/disconnection asynchronously
Task {
for await controllerEvent in gcOverseer.connectionStream {
switch controllerEvent {
case .connected:
print("A game controller connected.")
case .disconnected:
print("A game controller disconnected.")
}
}
}
}
}
```
## Available Properties
Property | Description
-------- | -----------
`var connectionStream: AsyncStream` | Provides an `AsyncSequence` for observing connect/disconnect events of game controllers.
`var controllers: [GCController]` | Returns all controllers connected to the device. E.g. *DualShock*, *Xbox*, *Siri Remote* controllers, etc.
## Available APIs
API | Description
--- | -----------
`extendedGamepadControllers()` | Returns all controllers supporting the `extendedGamepad` profile connected to the device. E.g., *DualShock*, *Xbox* controllers, etc.
`dualShockControllers()` | Returns all *DualShock* controllers that are connected to the device.
`dualSenseControllers()` | Returns all *DualSense* controllers that are connected to the device.
`xboxControllers()` | Returns all *Xbox* controllers that are connected to the device.
`microGamepadControllers()` | Returns all controllers supporting the `microGamepad` profile connected to the device. E.g. Apple's *Siri Remote*.
`motionControllers()` | Returns all controllers supporting the `motion` profile connected to the device.
`controllerFor(playerIndex:)` | Returns the controller for the player 1, player 2, etc.
`enableLogging() / disableLogging()` | Enables/disables logging output.
## Integration
### Xcode
Use Xcode's [built-in support for SPM](https://developer.apple.com/documentation/xcode/adding_package_dependencies_to_your_app).
*or...*
### Package.swift
In your `Package.swift`, add `GCOverseer` as a dependency:
```swift
dependencies: [
.package(
url: "https://github.com/thatfactory/gcoverseer",
from: "0.1.0"
)
]
```
Associate the dependency with your target:
```swift
targets: [
.target(
name: "YourTarget",
dependencies: [
.product(
name: "GCOverseer",
package: "gcoverseer"
)
]
)
]
```
Run: `swift build`