Designori
During this time I worked as a Unity developer for Designori LLC, an extended reality startup based out of Anchorage, AK. At Designori, we developed VR training products for clients across a wide variety of industries in Alaska and the lower 48. Over time I moved up from the position of VR developer to direct a number of small projects for Designori.
Torchmate
My first project at Designori was a virtual plasma cutter demo for AVTEC, a vocational training center in Seward, AK. The challenge was to create a virtual plasma cutter based on a real-world Torchmate 4400. Our reality capture expert, Matt Moore, had already captured reference material for the torch on-site at AVTEC, and our artist, Thomas Vanek, had prepared a 3D model -- my job was adding its interactive functionality in VR.
This work consisted of:
- Building a pipeline/set of scripts for converting the torch's cut-files (defining the patterns to cut) into a sequence of points the VR torch could follow.
- Setting up an in-game torch control screen for selecting these cut patterns and other torch operations. This was based on the real-world torch's screen, but made bigger for readability issues in VR.
- Creating a system for loading different cut materials into the torch, and then allowing or disallowing operation based on whether the appropriate parameters had been set on the in-game torch control screen.
- Synchronizing the arm and gimble to keep the torch on track over whatever pattern the user selected for cutting.
- Adding effects.
- Creating a guidance system which tracked the state of the scene and guided the player to the next best step to complete their orientation.
Modular Library
This work gave rise to the beginning of Designori's modular script library. Prior to Torchmate, Designori's devs had tended toward bespoke scripts to solve a given problem. The philosophy behind the modular library was that wherever reasonable, these bespoke scripts should be broken down into generic components to be re-used on future projects. There is a trade-off here relative to bespoke per-project scripts in terms of readability, at least at first, but the modular library approach offers the benefit of allowing non-coders to design content using components with exposed parameters, as well as standardizing our organization and preventing redundant code. We got better at this over time, but the initial set of modular scripts started here.
NACTEC
My second project at Designori for NACTEC, a technical school in Nome, AK. The task was to create a VR module including a safety and tools orientation, and an accurate model of a small engine, which could be disassembled piece by piece by a student in VR, in order to learn the engine's components and the necessary sequence to follow during disassembly.
My second project at Designori for NACTEC, a technical school in Nome, AK. The task was to create a VR module including a safety and tools orientation, and an accurate model of a small engine, which could be disassembled piece by piece by a student in VR, in order to learn the engine's components and the necessary sequence to follow during disassembly.
Sequencer
During this process, I needed a non-headache-inducing way of directing the player from one task to another, like in Torchmate. This is not very complicated in a linear sequence, but when the player can potentially undo a prior step at any point in the sequence, we needed a way of pointing the player back to the first undone step.
I also needed a way of exposing or concealing elements of the small engine, as they were uncovered or covered up in during disassembly/reassembly.
This assignment gave rise to a simple tool we later ended up calling the Sequencer, which let designers set up sequences of step-objects which could either exist in a satisfied, or unsatisfied state. These relationships were defined entirely in the hierarchy, so step-order was easy changeable, and steps could be easily disabled or enabled for testing, just by setting the corresponding GameObject active or inactive.
Each step had a corresponding set of UnityEvents exposed to the editor, so different functionality could be attached to OnTargeted, OnSatisfied, OnUnsatisfied -- and when a step's status changed, the Sequencer would automatically reevaluate its loaded sequence to find the next appropriate step (the first active, unsatisfied step in its sequence).
New sequences could be loaded into the Sequencer, like playlists.
This system proved extremely flexible, particularly in combination with other simple scripts in our modular library, such as threshold trackers, timers, logic relays.
We ended up using this technique in nearly every Designori project, and the Sequencer was gradually refactored away from a stricter assembly/disassembly use-case and improved for readability in the editor, principally by Ronan Smith, one of the engineers under my supervision. Working together, we made this system far more useful than its initial implementation.
Other NACTEC Examples
We returned to NACTEC in Nome several times, and expanded upon this work. This included an augmented-reality version of the same small engine disassembly, as well as an aviation module, where you can see a more complete version of the Sequencer in use, and Ronan's awesome implementation of the tool-interactions.