For my final for Networked Games, I got together with a small group of programmers to create a plugin for Unity that would allow for multiple users to interact with a single scene at once. We faced many hurdles that range from typical computer science problems, to user experience design.
The problem that we tried to overcome with this plugin is that in a project that requires the attention of various members on a team, how do you streamline the process of editing the levels? The classic way is to use a repository that lets each person work on their own local changes before putting the new content up. But the issue with complex meta data that go into a Unity scene means that you can't merge old and new scene data like you can with just code. Thus, we needed a way for people to work on the same scene simultaneously, but without the danger of people overriding each other unknowingly.
Our plugin support several baseline features and some other extra things that try to make the experience of using this system as intuitive as possible:
Chat System Object Highlighting
Reparenting Objects Server Side Auto Saving
Component Serialization View and Edit Modes
We faced many technical hurdles in trying to make this system run as smoothly as possible, here are a few and how we overcame them:
To optimize the finding and setting of gameobject information, we created a hash map of the game objects in the scene when the server is started. Each object is given a unique ID by the server, which is then translated into a hash code, pointing it to a location in the hash map. After we implemented this structure to organize our data, we saw a significant increase in synchronization speeds. When new objects are created, they are also given a unique ID, but there is prefix for the instance that created it, preventing any form of conflicting IDs.
Because each gameobject can have any number of components, we tasked ourselves with finding an effective way to break down the information into as simple a data set that also would go over the network. So each component has a flag and a function used to convert it's data to a character equivalent, and then a translator that uses the starting flag to read in the corresponding data. So a Box Collider thats "is Trigger" bool is true, with a center at 0,0,0 and size of 1,1,1 equals: "BoxCol|true|0,0,0|1,1,1|"
With this system running on a project, we envision work sessions where the lighting artist can work right in the same scene as the level designer. They can give one another live feedback and see how the world changes with each interaction.
You could have a team lead be in "View Mode" and review each member's progress as they are working. Highlighting areas that need work directly to the team rather than waiting for a check-in.
Made in Unity with C++ RakNet backend. Programming by Aaron Hamilton, James Smith and Thomas McGillicuddy (myself).