- 25 August 2023 – Android 12 improvements for Quest 2 Firmware Version 56+
- 27 April 2023 – Added support for Android 12 (Quest 2 Version 51+). Added the universal ReadCommandLineArgument function (check below for examples)
- 14 February 2022 – Added Android support and released on Unity Assets Store
- 03 March 2022 – added “Live Interactions” support
- Get the “SynthesisVR-DRM” package from the Unity Assets Store (for Unity 2021+) or through direct download (for older Unity versions)
- Add the package to your project
- Add the SynthesisRootObject object to the main path of your project:
- Open the “Inspector” for SynthesisRootObject and set your Synthesis Game ID:
- If you are preparing a build for Meta Quest, Pico Neo, HTC Focus 3 or another standalone HMD and you are seeing the following error message:
then, go, under the Unity Edit >> go to Edit >> Project Settings >> Player >> switch to the Android settings >> Publishing Settings >> enable the “Custom Main Gradle Template” option:
- Build the game and upload your build on SynthesisVR
Live Interactions (optional):
- Documentation: https://svrstorage.s3.amazonaws.com/producers/README.Live%20Interactions.pdf
- Demonstration: https://svrstorage.s3.amazonaws.com/producers/unity_live_events.mp4
From any of your scripts, get a reference to the SynthesisArcadeObject:
var synthesis = GameObject.Find("SynthesisRootObject").GetComponent<SynthesisArcadeObject>();
The Synthesis software controls the lifespan of your game executable. When the pre-paid user time is over (=session end), Synthesis will kill your game. This gives you no option to perform some final actions like peacefully end the user experience and encourage them to get back for another play session. Also, you wont have any time to record any final leaderboard data.
When applicable and for a better user experience, we suggest regularly check how much time the user has. If it is between 1 to 30 seconds, end the gameplay, display a nice message, log the leaderboard data, and let Synthesis end the exe. To check how much seconds the user still have, use the following call:
var secondsLeft = synthesis.sessionSecondsLeft();
Pay-Per-Play (PPP) billing:
The industry-standard licensing method is Pay-Per-Minute and doesn’t require any special extra code.
However, if you would like your game to be billed Per-Play instead, it is important to be able to notify Synthesis that the current session is over and a new session is starting. For that purpose, you have to call the ResetBillingSession method every time the game is restarted. Without calling ResetBillingSession, any configured PPP Billing will consider the entire lifespan as a single session and will bill it as such. If your game has a fixed gameplay duration, you could specify that on your Producer Package settings and Synthesis will calculate the sessions by dividing the entire lifespan of the session by the predefined duration.
var success = synthesis.resetBillingSession(synthesisGameId);
Fine control over the Pay-Per-Minute (PPM) billing model:
Typically, the arcades pay for every minute your game is running on any of their stations. As long as this is widely accepted and is fine for most of the LBVR businesses, the PPM billing model isn’t economically feasible for businesses operating VR Kiosk stations. Such stations usually offer a single game that is running all the time and this could easily result in a licensing bill that exceeds the generated revenue. That’s where a fine billing control is needed:
- // Your game is launched and goes to an in-game lobby / demo mode / splash screen. You have to disable the default Synthesis PPM billing (called once for the lifespan of the game instance):
- // Upon user interaction with your lobby and the start of the actual gameplay
- // After the gameplay is over and the user is returned to your lobby:
ReadCommandLineArgument (both Windows and Android)
If your game has specific VR arcade arguments, this function can be used to read the data regardless of the underlying platform (Windows or Android).
var playerName = GameObject.Find("SynthesisRootObject").GetComponent().ReadCommandLineArgument("playername") || 'Player 1';