There's no support for Oculus Quest 2 (and the old one) on Mac for development. The only way to test your game is to build and run directly on your headset, so inconvenient.
The aim of Linkintosh is to run the project directly into the Unity editor, using your headset/controllers as input on MacOS/Linux.
Build and run the project directly into your headset, it will silently start a local websocket server (LTServer.cs
).
The stream will be received by the client and instead of manipulating the anchors, will simulate an XR device. It takes advantages of the new Input System, so if your project is using the old system, unfortunately there's no support at the moment.
Anyway, should not be difficult to make a proper adapter and make it working with your project.
Manipulating the anchors is definitely possible, take a look to the LTClient.cs
.
- Copy the folder
Scripts/Client
andScripts/Models
into your project - Attach
LTClient.cs
andLTDeviceSimulator
to an object - Setup the
LTDeviceSimulator
reference intoLTClient.cs
- Type the server URL (ws://your.headset.local.address:8080) (eg: ws://10.0.0.8:8080)
And you are ready to go, open the app on the headset and press play on Unity.
It supports:
XR Position/rotation:
- Headset (CenterEyePosition/CenterEyeRotation)
- Right controller (DevicePosition/DeviceRotation)
- Left controller (DevicePosition/DeviceRotation)
XR Generic Inputs:
- PrimaryButton
- PrimaryTouch
- SecondaryButton
- SecondaryTouch
- GripButton
- TriggerButton
- MenuButton
- Primary2DAxisClick
- Primary2DAxisTouch
- Secondary2DAxisClick
- Secondary2DAxisTouch
- UserPresence
I own the Oculus Quest 2, but it should work with all the Open XR headsets.
I haven't tried on Linux yet, but it should work there as well. The websocket client is based on System.Net.WebSockets.ClientWebSocket
.
The streaming from the Unity editor is not supported yet, but seems feasible using Unity Render Streaming, if you are willing to help, just open a PR. Cheers.
The server creates a websocket server, so theoretically any app can connect and receive the data. It can be adapted to another editor or app, using the data streamed from the headset into your app.
A sample JSON:
{
"headset": {
"position": {
"x": 0,
"y": 0,
"z": 0
},
"rotation": {
"x": 0,
"y": 0,
"z": 0,
"w": 1
}
},
"rightHand": {
"position": {
"x": 0,
"y": 0,
"z": 0
},
"rotation": {
"x": 0,
"y": 0,
"z": 0,
"w": 1
}
},
"leftHand": {
"position": {
"x": 0,
"y": 0,
"z": 0
},
"rotation": {
"x": 0,
"y": 0,
"z": 0,
"w": 1
}
},
"leftInput": {
"buttons": 0,
"axis2D": {
"primary": {
"x": 0,
"y": 0
}
},
"trigger": {
"index": 0,
"hand": 0
}
},
"rightInput": {
"buttons": 0,
"axis2D": {
"primary": {
"x": 0,
"y": 0
}
},
"trigger": {
"index": 0,
"hand": 0
}
}
}
N.B: The buttons
represents the state of the buttons/touches on the controller, using bitwise operations. Please refer to LTUtils.cs
in order to understand the mapping.