Unity 2020.3.3f1
Packages
XR Interaction Subsystems
XR Interaction Toolkit
XR Legacy Input Helpers
XR Management
Oculus XR Plugin
PC VR Setup - Oculus Rift S
Hardware Configuration
AMD Ryzen 9 3900X
DDR4 64GB (4x16) 3200MHz
NVIDIA RTX 2080 Ti
Oculus Quest 2
with Oculus Link cable
Hand Tracking System
Hand tracking system allows user to turn on hand tracking feature inside application
Hardware support: Oculus Quest, Oculus Quest 2
Usage: user needs to first turn on hand tracking support in Oculus settings. In the app, hand tracking is off by default. User can open the menu and turn on hand tracking manually. After the hand models show up, put down the controllers to enable hand tracking
Hand tracking controls:
Teleportation -- pinch right hand index finger to start teleporting
Selection pointer -- pinch left hand index finger to start pointing
Open/close menu -- pinch left hand middle finger to open or close the menu
Hand tracking selection pointer
Hand tracking teleportation
M7_1 Site Update
We merged the previously separated inside and outside models of the M7_1 site into one environment
User can now travel from the outside mountain directly into the cave without loading a different model.
The overall complexity of our current m7-1 excavation model was reduced from 1M Triangles to 394k Triangles while maintaining detail in key areas.
Occlusion culling allows visibility to be precomputed inside the editor by dividing the environment into leafs that only perform rendering calculations when other leafs are visible.
The mesh was further divided into more elements to allow more culling using visibility occlusion.
The highlighted areas require the most geometric detail and were separated from the overall mesh to preserve them during the decimation process.
Occlusion Culling Off
Occulusion Culling On
Scene Separation
We separated the previously integrated scene into multiple scenes for individual sites, in order to get better performance and easier setup
Scenes:
Main: Main scene is the starting scene of the application. It has simple setup so the user can get familiar with the interactions and controls. From the main scene the user can enter different sites through the menu. Navigation system is disabled in Main scene.
Diablo: Diablo scene is the scene for the Diablo site. All features are enabled in the scene.
M71: M71 scene is the scene for the M7_1 site. The site has both outside and inside environment set up. All features are enabled in the scene.
Navigation System
Navigation system includes hologram minimap feature and waypoint feature, which can help the user navigate in the sites
Usage: navigation system is off by default, and can only be turned on in the sites. User can turn on navigation in the menu. When navigation is on, user can press the primary button on right controller to open/close the hologram minimap, and press the secondary button on right controller to turn on/off the waypoint feature
Hologram minimap:
Displays a down-scaled version of the site model as a hologram with transparent material
User's position is marked on the hologram by a red sphere, and will be updated in real time
Waypoint feature:
Displays a waypoint (yellow sphere) on the hologram. User can use the selection pointer to move the waypoint to any desired position on the hologram
A navigation arrow will be displayed in front of the user and points to the direction of the waypoint
Hologram minimap of Diablo site
Hologram with waypoint feature on
Creature System
We added creatures to the sites to make the experience more realistic
Creatures:
Spiders: spiders will move away from the user when user gets close to them. They can move on the walls and will disappear in a short amount of time after they start moving. Spiders will respawn after the preset respawn time delay.
Howler Monkeys: howler monkeys will stay on top of the trees outside the cave and continue making howling sounds when the user is close by
Controls for the animator that manipulate the position and orientation of the skeleton's joints.
The monkey's howls are then animated along side an audio clip.
Each bone comprising the skeleton influences it's neighboring vertices using a weighted average.
Texture Switching
We added texture switching functionality to allow user to see what the sites looked like in ancient time
Usage: user can touch the floating orange spheres in the sites to switch between textures
Red texture for a portion of Diablo site. In the past, Diablo site could reflect sunlight and turn into red color to intimidate the enemies.
Hand Tracking
To enable hand tracking, we use the OVR Camera Rig and OVR Hand in Oculus Integration package. The hand tracking can only be functional under the tracking space of OVR Camera Rig. We added the OVR Camera Rig to the existing XR Rig and disable the camera in OVR Camera Rig so it does not conflict with the XR setup. One challenge we faced was that Unity only supports hand tracking feature in the editor and disables it when building the app. It is fixed by adding user permission for hand tracking through modification of the Android Manifest file.
Scene Separation
Before scene separation, all the site prefabs are inside one main scene and only the current site is enabled. We remade the starting scene and separated the sites into individual scenes, and reworked the Site Manager class to handle scene loading. To add a new scene in the future, the easiest way is to duplicate an existing scene and replace the site prefab.
Navigation System
Navigation system setup is specific to each site. We created a hologram minimap by using the site collision mesh and downscale it to a smaller size. We also created a transparent material with emissions to make it look like a hologram. Player indicator is a red sphere and can be found as a prefab. For each frame, we access the local position of user's transform and apply it to the local position of the player indicator. Since player indicator is a child of the hologram, its position will reflect the user's position in the site and will be updated accordingly.
To set up waypoint feature, we created a yellow sphere as the waypoint indicator on the hologram. The waypoint indicator has a collider and can be selected by the selection pointer on user's hands. User can move the waypoint to any position on the hologram, and the position of the actual waypoint is updated in the site using similar logic as the player indicator. We also display an arrow in front of the camera, which points to the position of the actual waypoint. Its forward direction is updated every frame and always points to the waypoint.
Spider
We use the asset Animated Spider from asset store for spider model and animations. We created the class CreatureManager to handle the spawning and controls of the creatures in the site. For spider AI, we use ray-casting to help the spiders navigate on the mesh of the site. We shoot a ray from the camera's position to a point in front of the spider (a small distance in spider's forward direction), and check the intersection of the ray with the mesh collider of the site models. With the intersection point, we move the spider to the position of intersection, and rotate the spider by the normal direction of the intersection point. Therefore, the spiders can now move on the walls and meshes with any shape. We perform distance checks in CreatureManager, and let the spider move when user gets close. To set up spiders, first include the CreatureManager class and set up spider spawn positions and drag them into the manager. Then set the parameters of spider controls and the manager will handle the spawning and distance checks itself.
Animator
Provides a simple rotation and floating effect controlled by a timer.
Public Class Members:
float rotationRate = 1
Full rotations per second
float floatRate = 1
Full oscillations per second
float floatAmplitude = 0.1
Amplitude of float oscillations
Private Class Members:
float activeUntilTime
Time to animate until
Vector3 startingPos
Original starting position of GameObject
Public Class Methods:
void setActiveUntil(float time)
Specifies a time to use the active animation until
Time to animate until
void Stop()
Stop animating the GameObject
Private Class Methods:
void Start()
Initializes startingPos to current position
void Update()
Updates rotation and position of GameOjbect every frame, doubling when animated
AudioSphere
Provides functionality to interact with NarrationSystem.
Public Class Members:
string trackName
Name of audio track
Public Class Methods:
void OnRayInteract()
Play track from Narration System
Private Class Methods:
void OnTriggerEnter(Collider other)
Play track from Narration System and vibrate hand that touched it
CharacterControllerManager
Provides advanced control over CharacterController on the main XR Rig.
Public Class Members:
XRRig xrrig
Reference to the XR Rig
Transform cameraOffset
Reference to the Camera Offset in XR Rig
Camera mainCamera
Reference to the mainCamera in XR Rig
CharacterController characterController
Reference to the CharacterController in XR Rig
float movementScalar = 1f
Scalar on the rate the player moves
bool VirtualCrouch { get; private set; }
Virtual crouch enabled or not
Public Class Methods:
void JoystickMove(Vector2 joystick)
Move the character controller (and attached GameObject) with a joystick input (Vector2)
X and Y Axes of Joystick
void SnapTurn(float degrees)
Rotates Camera Offset by degrees, accounts for positional shift and updates accordingly
MoveAndRotate(Vector3 pos, Quaternion rot)
Rotate the Camera Offset to the specified direction then move XR Rig to the specified position
Position to move to
Rotation to face
void ToggleCrouch()
Toggle virtual crouching
Private Class Methods:
void Start()
Set the instance if null
void Update()
Update position and height of character controller
ConstantRotation
Provides a simple functionality to rotate constantly by specified rate.
Public Class Members:
float rotationRate = 1
Rotations per second
Private Class Methods:
void Update()
Updates rotation every frame
Fader
Using a Quad, provides functionality to fade the scene in and out.
Public Class Members:
GameObject FadeObj
Reference to the Quad in Scene
float defaultFadeTime
Default fade transition time
Color opaqueColor = Color.black
Colour to fade out to (black)
Color clearColor = Color.clear
Colour to fade into (transparant)
static Fader instance
Singleton instance
Private Class Members:
float startTime
Time of fade start
float fadeOutTime
Time to fade out until
float fadeInTime
Time to fade in until
float fadeTime
Total time for a fade
Public Class Methods:
void FadeTransition()
Fade transition with default time
void FadeTransition(float time)
Fade transition with specified timer
Time for fade
Private Class Methods:
void Start()
Set singleton instance
void Update()
If a fade is active, fade out and then in using a Linear Interpolation of colour
GrabbableObject
Allows an object to be interacted with a Grabber.
Public Class Members:
bool currentlyGrabbed { get; set; }
Field to specify if an GameObject is currently Grabbed
Grabber
Script enables any trigger Collider to have grab interaction with GrabbableObject.
Private Class Members:
GrabbableObject grabObj
The GameObject currently grabbed
GrabbableObject currentObj
The GameObject currently collided with
Vector3 velPosPrev
Previous position to calculate velocity after release
Vector3 velPosCurr
Previous position to calculate velocity after release
Hand.ID handID
Which hand is this Grabber on
Public Class Methods:
void GrabCurrentObject()
Grabs the current GameObject if it's valid and not grabbed and nothing is currently Grabbed
Also sets the Grabbed flag to true on the GameObject
void ReleaseCurrentObject()
Releases the current Grabbed GameOjbect
Sets the Grabbed flag and RigidBody veloicty on the Grabbed Object
Private Class Methods:
void Start()
Sets the Hand.ID based on the object the script is on
void Update()
Constantly updates velPosPrev and velPosCurr with positions of the grabbed object if it exists
void OnTriggerEnter(Collider other)
Sets currentObj to the current GrabbableObject if it is one
void OnTriggerExit(Collider other)
Sets currentObj to null
GuidedLevel
Contains fields necessary for use in GuidedSystem.
Public Class Members:
struct GuidedPoint
A struct to provide information on each point of interest
SiteManager.Site siteID
The site that this level is for
List<GuidedPoint> guidedPoints = new List<GuidedPoint>()
A list of points of interest
GuidedSystem
Provides a passive mode where the user can be brought to points of interest.
Audio clips will automatically play
Public Class Members:
int currentPoint { get; private set; }
The current point of interest
bool ModeEnabled { get; set; }
Whether the mode is enabled or not
static GuidedSystem instance
Singleton instance
GameObject diabloLevel
Reference to the Diablo Level
GameObject m7_1Level
Reference to the M7-1 Level
Private Class Members:
List<GuidedLevel.GuidedPoint> guidedPoints
List of all the points of interest
bool transitioning = false
(Using Fader) Whether the user is currently being moved
float transitionTime
(Using Fader) The time it takes for the user to move
Public Class Methods:
void LoadLevel(SiteManager.Site site)
Load the specified level
void NextPoint()
Increments the current point of interest if possible
void PreviousPoint()
Decrements the current point of interest if possible
void LoadPoint()
Tests to see if there is a valid point and starts the transition (Fader)
void LoadSelection()
Load the selection area (Currently Unused)
Private Class Methods:
void Start()
Sets the singleton instance
void Update()
Updates the scene after the transition time if the user if currently transitioning
Hand
Provides an enum and object type to identify a hand,
Public Class Members:
enum ID { Left, Right };
Enum type to differentiate hands
ID id
What hand this script is on
InputHandler
Handles the input for the XR system and currently is also the game system.
Public Class Members:
Grabber leftGrabber;
Reference to the left Grabber
Grabber rightGrabber;
Reference to the right grabber
static InputHandler instance;
Singleton Instance
Private Class Members:
InputDevice leftController;
Reference to the left controller
Vector2 lJoystick;
float lTrigger;
float lGrip;
bool lPrimary = false;
bool lSecondary = false;
bool lTriggerHeld = false;
bool lGripHeld = false;
bool lPrimaryHeld = false;
bool lSecondaryHeld = false;
InputDevice rightController;
Reference to the right controller
Vector2 rJoystick;
float rTrigger;
float rGrip;
bool rPrimary = false;
bool rSecondary = false;
bool rTriggerHeld = false;
bool rGripHeld = false;
bool rPrimaryHeld = false;
bool rSecondaryHeld = false;
bool rJoystickHeld = false;
Boolean to determine if the right joystick is held from last frame
bool backToSelectionExecuted = false;
Determine if user has returned to selection level
float backToSelectionTime;
Time to hold until the user returns to selection level
float backToSelectionTimer = 1;
Amount of time the user has to hold to return to selection
Public Class Methods:
void SendHaptic(float amplitude, float time, Hand.ID hand)
Sends haptic pulse to the specified hand
Amplitude of pulse (0-1)
Time of pulse (seconds)
Hand to send to
Private Class Methods:
void Start()
Acquires the controllers and sets the singleton instance
void Update()
Polls the controllers and then handles any input done
void LateUpdate()
Sends joystick input to CharacterControllerManager for updating player position
void PollControllers()
Polls controllers for input and tries to reacquire controllers if lost
void AcquireController(Hand.ID hand)
Tries to acquire the specified hand's controller
Hand to acquire
LinearLine
Renders a linear line and also provides collision functionality.
Required: LineRenderer
Public Class Members:
Transform origin
Origin of line
float maxLength = 10
Maximum length of line
Vector3 EndPosition { get; private set; }
The position at the end of the line rendered
bool ValidEnd { get; private set; }
Whether the line has a valid end (collision)
GameObject EndObject { get; private set; }
The object the line is colliding with
Private Class Members:
LineRenderer lr
Refernece to the LineRenderer on the GameObject
bool drawn
Whether the parabolic line is drawn or not
Public Class Methods:
void StartDrawing()
Enables drawn and LineRenderer
void StopDrawing()
Disables drawn and LineRenderer
Private Class Methods:
void Start()
Initializes variables
void Update()
If drawn, find the end position if possible and update the LineRenderer
bool CheckForCollision(Vector3 start, Vector3 end)
Uses Physics Raycast to check if the ray passes through a collider from start to end
Position to start detection
Position to end detection
MenuInteractable
Enables a GameObject to have functionality with MenuSystem.
Public Class Members:
public MenuSystem.MenuOption option
The option this GameObject invokes
Public Class Functions:
public void Interact()
Calls MenuSystem.instance.ProcessOption() with its function
Private Class Functions:
void OnCollisionEnter(Collision collision)
Upon collision, invoke option (currently not working)
void OnTriggerEnter(Collider other)
Upon trigger, invoke option (currently not working)
MenuSystem
Provides functionality to change options or locations with a toggleable menu.
Public Class Members:
enum MenuOption
Enum for availabe menu options
GameObject DiabloPrefab
Reference to the Diablo site panel
GameObject M7_1Prefab
Reference to the M7-1 site panel
enum Mode { Exploration, Guided };
Enum to specify whide mode the user is in
static MenuSystem instance
Singleton instance
GameObject menuObject
Reference to the menu object
GameObject Language_English_Button
Referenece to the Language : English button
GameObject Language_Spanish_Button
Reference to the Language : Spanish button
GameObject Mode_Exploration_Button
Reference to the Mode : Exploration button
GameObject Mode_Guided_Button
Reference to the Mode : Guided button
GameObject PreviousSite_Button
Reference to the Previous Site button
GameObject SelectSite_Button
Reference to the Select Site button
GameObject NextSite_Button
Reference to the Next Site button
Color ButtonActiveColor
Colour to set active buttons
Color ButtonInactiveColor
Colour to set inactive buttons
Private Class Members:
GameObject currentSitePanel
Reference to the currently rendered site panel
SiteManager.Site currentMenuSite
What site the menu is currently on
bool guidedMode = false
Whether the user is in Guided Mode
Public Class Methods:
void ShowMenu(Vector3 pos, Quaternion rot)
Enable the menu and place it pos facing rot
void HideMenu()
Hides the menu and destroys the currently rendered site panel
MenuActive()
Returns of the menu is active or not
void ProcessOption(MenuOption option)
Handles the command based on the option
Option to invoke
Private Class Methods:
void Start()
Sets singleton instance and turns on default buttons
void Update()
Checks if a site panel is rendered, creates one if not
void TurnOffButton(GameObject obj)
Sets the button colour to be inactive
Button to turn off
void TurnOnButton(GameObject obj)
Sets the button colour to be active
Button to turn on
void UpdateSitePanel()
Creates a panel of currentlySelectedSite if currentSitePanel doesn't exist
NarrationSystem
Provides functionality with an AudioSource for per-recorded audio tracks as a narrator.
Public Class Members:
AudioSource narrator
A reference to the audio source to use as the narrator
static NarrationSystem instance
Singleton instance
enum Langauge { English, Spanish } -
Enum of supported languages
Langauge language
Currently selected language
bool animated - whether to use animation on the spheres or not
(Animator) If the sphere is animating
struct AudioTrack - contains the trackName and a AudioClip (used for Unity)
Struct to hold details of an audio track
List<AudioTrack> tracks - the list of audio tracks supported by name and track
Inspector accessible list of AudioTracks
Private Class Members:
string currentTrack
The current track being played
GameObject playingSphere
Reference to sphere that's playing
Dictionary<string, AudioClip> trackDict = new Dictionary<string, AudioClip>()
Dictionary of tracks for faster lookup
Public Class Methods:
PlayTrack(GameObject obj)
Tries to play the audio track from obj, will stop any currently playing tracks
Object (AudioSphere) to read track name from
void StopTrack()
Stops the currently playing track
void ClearTrack()
Clears the currently playing track (doesn't stop)
Private Class Methods:
void Start()
Sets singleton and populates the dictionary
ParabolicCurve
Script to generate and draw a parabolic curve that is affected by gravity originating from a given position.
Required: LineRenderer
Public Class Members:
Transform origin;
Origin of curve
int maxSegments = 100;
Max line segments that can be rendered
float velocity = 5;
Initial velocity of curve
float deltaTime = 0.1f;
Time segments to use for calculation
Vector3 EndPosition { get; private set; }
Position of valid end point (collision)
bool ValidEndPosition { get; private set; }
Whether the end position is valid (collision)
Private Class Members:
LineRenderer lr
Reference to the LineRenderer on the GameObject
float g
Gravitational constant (~9.81)
bool drawn
Whether the parabolic line is drawn or not
Public Class Methods:
void StartDrawing()
Enables drawn and LineRenderer
void StopDrawing()
Disables drawn and LineRenderer, also clears LineRenderer segments
Private Class Methods:
void Start()
Initializes variables
void Update()
If drawn, then calculate and draw the parabolic curve until max segments or collision
bool CheckForCollision(Vector3 start, Vector3 end)
Check if a segment collides with anything between start and end
Position to start
Position to end
Vector3 GetParabolaPoint(float time, Vector3 start)
Calculates a parabola point using the original position, velocity, and time
Time since origin
Start position to calculate from
PlayerSpawn
Provides functionality to return the position and direction for the player spawn in a level.
Public Class Methods:
Vector3 GetSpawnPos()
Return the position
Quaternion GetSpawnRot()
Returns the rotation
PointSystem
Provides functionality to interact with objects using a liner line pointer.
Public Class Members:
LinearLine ll
Reference to the Line Renderer
GameObject pointerEndPrefab
Reference to the end of the pointer prefab
GameObject lHand
Reference to the left hand position
GameObject rHand
Reference to the right hand position
bool CurrentlyPointing { get; private set; }
Whether the system is currently pointing
static PointSystem instance
Singleton instance
Private Class Members:
GameObject pointerEnd
Reference the the copy of the pointer end prefab
Hand.ID currentHand
The current hand
Public Class Methods:
void StartPoint()
Enables the line renderer and checks for valid ends
void FinishPoint()
Finishes the point interaction, interacts with object if applicable
void StopPoint()
Cancel the current point
void SetHand(Hand.ID hand)
Set origin of the line to the specified hand
The Hand to originate from
Private Class Methods:
void Start()
Sets the singleton instance
void Update()
If currentlyPointing, place the pointer at a valid end if possible
SiteManager
Script to provide level management.
Public Class Members:
enum Site { Selection, Diablo, M7_1 }
List of available sites
Site currentSite
Number of sites available
int SiteCount { get; private set; }
Number of sites available
bool SiteEnabled { get; private set; }
Whether the site is enabled or not
GameObject SelectionPrefab
Reference the selection level
Material SelectionSkybox
Skybox to use in selection
Material ExcavationSkybox
Skybox to use in excavation
GameObject DiabloPrefab
Reference to Diablo site
GameObject M7_1Prefab
Reference to M7_1
GameObject currentSiteObject { get; private set; }
The current site GameObject
static SiteManager instance
Singleton instance
Private Class Members:
bool delayedChange = false
(Fader) Delay to change sites
float delayedChangeTime
(Fader) Time until change sites
Site delayedChangeSite
(Fader) Site to change to
Public Class Methods:
void ChangeSite(Site site)
Destroys the current level and creates a new one
The site to change to
void ChangeSite(Site site, float delay)
Destroys the current level and creates a new one after a delay done through Update
The site to change to
Delay until site change
void DisableSite()
Disable the current site from rendering
void EnableSite()
Enable the current site to render
void RotateSite(float angle)
Rotate the site around the camera by angle (Currently unused)
Private Class Methods:
void Start()
Sets single instance and counts the number of sites
void Update()
Creates a site if one doesn't exist, also handles delayed site changes
void CreateSite()
Create the site specified by currentSite
MoveToSpawn()
Move the player to the position provided by the site's PlayerSpawn
CreateSite()
Create the site specified by currentSite
SubtitleSystem
Provides functionality to update text that's placed in front of the user.
Public Class Members:
struct Subtitle
Stores subtitle details, text and time to display
struct SubtitleTrack
Stores the trackname and list of subtitles
Text subtitleText
The text object to change
static SubtitleSystem instance
Singleton instance
bool currentlyDisplaying { get; private set; }
Is the text currently displaying
bool currentlyVisisble { get; private set; }
Is the text object currently visible
bool overridedText { get; private set; }
Is there currently text overriding the system
List<SubtitleTrack> subtitleTracks = new List<SubtitleTrack>()
List of subtitle tracks
Private Class Members:
Dictionary<string, SubtitleTrack> subDict = new Dictionary<string, SubtitleTrack>();
Dictionary for faster lookup
Queue<Subtitle> subtitleQueue = new Queue<Subtitle>();
Subtitle queue to render
float subtitleExpirationTime;
Current subtitle's expiration time
string subtitleOverrideText;
The text to override with
float subtitleOverrideTime;
Time to override until
Public Class Methods:
void ClearText()
Clear the current subtitle
void ClearQueue()
Clear the subtitle queue
void Enqueue(string text, float time)
Place a new subtitle in the queue
Text to enqueue
Time to display
void Override(string text, float time)
Specifies the text and time to override with
Text to enqueue
Time to display
void ClearOverride()
Clear the overrided text
void PlayTrack(string trackName)
Play a track from the list of subtitle tracks
Trackname to play
void ToggleVisibility()
Toggle the visibility of the subtitles
Private Class Methods:
void Start()
Sets the visibility to true, sets the singleton, and populates the dictionary
void Update()
Renders the subtitles in the queue and overrides as necessary
void CreateSite()
Creates a site if one doesn't exist, also handles delayed site changes
MoveToSpawn()
Move the player to the position provided by the site's PlayerSpawn
CreateSite()
Create the site specified by currentSite
Teleportation
Provides functionality to teleport the player around a scene.
Public Class Members:
XRRig xrrig
Reference to the XR Rig in the scene
Camera mainCamera
Reference to the main camera in the scene
ParabolicCurve pc
ParabolicCurve drawn
GameObject TeleportDestPrefab
The prefab that will be drawn at the destination
bool CurrentlyTeleporting { get; set; }
Whether the system is currently teleporting
static Teleportation instance
Singleton instance
Private Class Members:
bool delayedTeleport = false
Whether there's a delayed teleport incoming
float delayedTeleportTime
Time until delayed teleport executes
Vector3 delayedTeleportPos
Position for delayed teleport
GameObject teleportDest
Reference to the prefab instance that will be used
Public Class Methods:
void startTeleport()
Starts the teleport system, enables parabolic curve and detects endpoints
void finishTeleport()
Finish teleport, disable the parabolic curve and teleports user
void FinishTeleport(float delay)
Finish teleport, disable the parabolic curve and teleports user
Delay until teleport
void CancelTeleport()
Cancel teleport, disable parabolic curve
Private Class Methods:
void Start()
Set singleton instance
void Update()
Update teleport dest prefab location, also handles delayed teleport
bool ValidTeleport()
Detects if there's ground (collider) below the end position of the parabolic curve
Audio
Diablo
English
CentralMaksNorth_MiddaySun
CentralMaskByEntrance_JaguarDeerAntlers
CornerMaskNE_MayaSunGod
ElDiabloGroup1
ElDiabloGroup2
Jaguar_OverTempleDoor_Westside
Northside_RainGod
NWCornerUpperJaguar_OceanSharkTooth
PyramadStructure
SanctuaryBuilding
TempleofNightSun_Exterior
TempleOfNightSun_Interior
M7-1
English
HoleTomb
LeftMask
M7-1
PyramidalStructure
RightMask
Spanish
HoleTomb_sp
LeftMask_sp
M7-1_sp
PyramidalStructure_sp
RightMask_sp
Materials
ColumnGlow
Used on AudioSpheres
DarkStone
Used on Menu backgrounds
FadeMaterial
Used for Fader system
LightStone
Used on Menu foregrounds
LineAlpha
Glowy line material for the ParabolicCurve / LinearLine
MenuText
Used for the menu text
Subtitle
Subtitle material - Uses custom shader
TeleportCrosshair
A material for the TeleportDest prefab
Menu Items
Diablo
Panel for the El Diablo excavation
Left
Texture for left controller
M7-1
Panel for the M7-1 excavation
Menu
Menu prefab
MenuButton
Prefab that's used for buttons (interactable)
MenuText
Panel that's used for text (non-interactable)
Right
Texture for right controller
Prefabs
AudioSphere
AudioSphere prefab for NarrationSystem
ForwardArrow
Arrow made out of cubes pointing forward used to orient player spawn locations
ovrLeftHand
UnityIntegration's base left hand model
ovrRightHand
UnityIntegration's base right hand model
PointerPrefab
Prefab for the end of the pointer
TeleportDest
Has a rotating cursor and light source built in
Site Assets
Materials - Folder for the materials used
diablo
m71
spidermonkeybowl
Meshes - Scanned meshes of the excavations
diablo
m71
spidermonkey bowl
Diablo Site - Prefab of the El Diablo excavation (player spawn included)
M7_1 Site - Prefab of the M7-1 excavation (player spawn included)
Spidermonkey Bowl - Prefab of the spider monkey bowl
Textures
Cursor - The crosshair used in the TeleportDest prefab
DarkStone - Texture used for menu background
LightStone - Texture used for the menu foreground