ResoniteLink
Library for working with Resonite's data model externally and foundation for various SDK's.
Install / Use
/learn @Yellow-Dog-Man/ResoniteLinkREADME
⚠️ Beta WARNING! ⚠️
Currently, this library is in "beta" state. It's just been recently released, and we're seeking for feedback on the protocol and are still open to significant breaking changes.
As such, please take care when building with this protocol in this stage and be prepared for potential significant breaking changes (e.g. changes to schema, naming things, structure and such).
This stage won't likely run long. Once we're happy that we got some feedback, we'll remove the label and will be a lot more hesitant to introduce breaking changes, providing more stability.
Nuget Package
Official projects
Here are official projects using ResoniteLink - you can use these as a reference or build on them!
Unity SDK - Allows building Resonite worlds, avatars & items from the Unity Editor
Community project/library links
There are a few community projects built around or with ResoniteLink:
Python <img alt="Python programming language logo. Two snakes interlaced." src="https://skillicons.dev/icons?i=py" width="16">
| Repository | Description | |---------------------------------------------------------------------------------------|-----------------------------------------------------------------| | XekriRedmane/pyresonitelink | Python bindings for ResoniteLink | | JackTheFoxOtter/ResoniteLink.py | A modern & easy to use Python wrapper for ResoniteLink. | | Nytra/Blender_ResoniteLink | A ResoniteLink extension for Blender |
Rust <img alt="Rust programming language logo. R letter in a dented wheel." src="https://skillicons.dev/icons?i=rust" width="16">
| Repository | Description | |-------------------------------------------------------------|----------------------------------------| | Resoxide/resoxide-link | A Rust implementation of ResoniteLink. |
Golang <img alt="Golang programming language logo. Go text on coloured background." src="https://skillicons.dev/icons?i=go" width="16">
| Repository | Description | |-------------------------------------------------------------------------------|--------------------------------------------------------| | CyrillusDerg/GoResoniteLink | Go implementation of REPL with extended functionality. |
C# <img alt="C# programming language logo. C and # characters on a bright background." src="https://skillicons.dev/icons?i=cs" width="16">
| Repository | Description | |---------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------| | ssmucny/ResoniteLink.RPath | API to perform more complex queries on ResoniteLink, similar to LINQ, but not quite the same. | | Earthmark/Rfmk.Resolink.Grpc | A gRPC proxy for ResoniteLink, exposing ResoniteLink with a strongly-typed GRPC and protobuf API. |
JavaScript <img alt="JavaScript programming language logo. JS letters on a bright coloured background." src="https://skillicons.dev/icons?i=js" width="16">
| Repository | Description | |-----------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------| | xhayper/ResoniteLink.js | A type-safe, easy to use JS wrapper for interacting with ResoniteLink | | eth0fox/tsrl | tsrl (TypeScript ResoniteLink) is a library for interacting with ResoniteLink in a JavaScript based application. |
If you build something cool, let us know (just create an issue on this repository) with a link, and we'll add it when we can!
What is Resonite?
Resonite is a social VR sandbox where you can build anything in-game, realtime and with realtime collaboration and implicit network synchronization. It is like being inside a virtual universe / game-engine that you have control over and that you can build together with your friends or colleagues.
Everything in Resonite is built around a shared data model - from the overall scene hierarchy, components to the individual fields - everything is accessible, modifiable and scriptable, giving users unprecedented level of control.
You can get Resonite completely for free on Steam here: https://store.steampowered.com/app/2519830/Resonite/
What is ResoniteLink?
While Resonite has a heavy focus on building things in-game, interoperability with external tools and scripts is also important, as it plugs Resonite into a larger ecosystem. ResoniteLink is a simple WebSocket protocol designed as a foundational building block to allow anyone to more easily build external tools and interfaces to read and write Resonite's data model.
The protocol closely follow's Resonite's data model and deconstructs it into primitive JSON types which can be used from nearly any programming language. With this, you can integrate Resonite worlds with any tool you can imagine.
You can find the documentation hosted on GitHub pages.
Use case examples
- Unity/Unreal/Godot/Blender... SDK
- You can bring existing content from those tools into Resonite easily
- They will also allow integrating Resonite with other tools as part of your workflow
- Procedural world/asset generation with external tools
- External scripts controlling a world during live events
- Monitoring state of the world with external tools
- Twitch chat integration
- With the REPL classes, you can let Twitch chat control the Resonite world at fine level - at your own risk :3
- External utilities & tools for processing worlds
- Use Resonite as visualization tool for external tools
- E.g. 3D scanning software can easily send data to Resonite for realtime VR visualization
- Any tool will benefit from free collaboration & network synchronization and fully built VR interactions without having to build this by itself
Does this replace in-game building?
No.
Building in-game is still our primary focus. Any content you bring into Resonite via this protocol can still be edited and worked with using the in-game tools.
This is meant to enhance the interoperability and open new workflows, but not replace any of them.
What is this NOT?
ResoniteLink opens up a lot of new possibilities. However there are certain use-cases that it's not designed for:
- Realtime control / simulation of in-game objects
- While it's generally fast and let's you pipe in continuous updates to things, it does not provide mechanisms to synchronize with game updates - any reads/writes happen "eventually"
- Updating lots of objects in realtime is better done with in-game mechanisms and scripting, providing smoother results and better efficiency
- Using in-game OSC / WebSocket mechanisms can be more efficient method to control data in realtime
- The JSON serialization & structure of the models is designed for ease of implementation and integration, not maximum performance
- Access to session control data model / streams
- This provides you with access to the data model representing the world itself, but currently not any other parts of the data model
- Some of this might change in the future, but not likely
- Replacement for in-game scripting
- While you can use this to control in-game objects with external scripts, it's still recommended to use ProtoFlux where possible
- Using this to control things requires running an external program and to be the host of the session
- Serialization for long term storage
- Saving the returned JSON and sending it to a different version of Resonite is NOT supported
- ResoniteLink gives you snapshot of what's currently in world for the version of Resonite you're using, but isn't designed for long term storage
- Resonite's inner data model has mechanisms for long term compatibility and has upgrade mechanisms. Those aren't part of ResoniteLink - you need to let Resonite handle those upgrades
Why WebSocket?
- It's pretty commonly supported in lots of languages and enviroments (even ones where raw TCP/UDP isn't)
- It forms a session with easy back & forth communication
- Allows either side to initiate sending a message (as compared to HTTP REST API for example)
- Allows sending binary messages
- These allow for more efficient implementation of sending asset data
Why JSON?
- It's very ub
