1 Argos_Application - UnityEngine.Transform - AA Controller - UnityEngine.Transform - ArgosController EventSystem - UnityEngine.Transform - UnityEngine.EventSystems.EventSystem - UnityEngine.EventSystems.StandaloneInputModule - UnityEngine.EventSystems.TouchInputModule Model - UnityEngine.Transform - ArgosModel View - UnityEngine.Transform - ArgosView UserHead - UnityEngine.Transform ARCamera - UnityEngine.Transform - UnityEngine.AudioListener - Vuforia.VuforiaBehaviour - Vuforia.DigitalEyewearBehaviour - Vuforia.DatabaseLoadBehaviour - Vuforia.VideoBackgroundManager - Vuforia.SmartTerrainTrackerBehaviour - Vuforia.DeviceTrackerBehaviour - Vuforia.WebCamBehaviour - Vuforia.KeepAliveBehaviour - ViewModeManager - BackToAbout - Vuforia.ComponentFactoryStarterBehaviour StereoCameraLeft - UnityEngine.Transform - UnityEngine.Camera - Vuforia.VideoBackgroundBehaviour - UnityEngine.GUILayer - UnityEngine.FlareLayer - Vuforia.HideExcessAreaBehaviour BackgroundPlane - UnityEngine.Transform - UnityEngine.MeshRenderer - Vuforia.BackgroundPlaneBehaviour StereoCameraRight - UnityEngine.Transform - UnityEngine.Camera - Vuforia.VideoBackgroundBehaviour - UnityEngine.GUILayer - UnityEngine.FlareLayer - Vuforia.HideExcessAreaBehaviour BlackMask - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer - BlackMaskBehaviour GazeRay - UnityEngine.Transform - GazeRay Reticle - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer - Reticle ARG_FIB_Sphere - UnityEngine.Transform ARGOS_Fibonacci_0_0 - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer Argos_Sphere_Indexing - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.SphereCollider - UnityEngine.MeshRenderer - ArgosSphere_Indexing Echo_Canvas - UnityEngine.RectTransform - UnityEngine.Canvas - UnityEngine.UI.CanvasScaler - OVRRaycaster - OVRMousePointer - UnityEngine.UI.Mask - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.GraphicRaycaster UI_Control_Panel - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UI_Control Graph_Plate - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Graph_Base - UnityEngine.Transform Mic_Input_Plot_Origin - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.BoxCollider - UnityEngine.MeshRenderer - Vertical_Plot - MicrophoneInput - UnityEngine.AudioSource Mic_Input_Plot_Origin - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshCollider - UnityEngine.MeshRenderer Top_Icon_Buttons - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Back_Panel - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image UI_Switch - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.Button - UI_On_Off NAV_Overlay_Switch - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.Button Lock - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.Button Rotate - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.Button NavSphereRotate - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.Button CanvasPointerEcho - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image EchoParameters - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Echo_Gain - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Echo_Gain-Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField Echo_Gain-Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Echo_Gain-Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Echo_Gain_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider Echo_Gain_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Echo_Gain_Slider - UnityEngine.RectTransform Echo_Gain_Slider - UnityEngine.RectTransform Echo_Length - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Echo_Length_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField Echo_Length_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Echo_Length_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Echo_Length_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider Echo_Length_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Echo_Length_Slider - UnityEngine.RectTransform Echo_Length_Slider - UnityEngine.RectTransform Delay_Time - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Delay_Time_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField Delay_Time_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Delay_Time_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Delay_Time_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider Delay_Time_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Delay_Time_Slider - UnityEngine.RectTransform Delay_Time_Slider - UnityEngine.RectTransform Echo_Attenuation - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Echo_Attenuation_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField Echo_Attenuation_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Echo_Attenuation_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Echo_Attenuation_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider Echo_Attenuation_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Echo_Attenuation_Slider - UnityEngine.RectTransform Echo_Attenuation_Slider - UnityEngine.RectTransform BrushParameter_Panel - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image X_position - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text XPos-Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField XPos-Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text XPos-Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text XPos_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider XPos_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image XPos_Slider - UnityEngine.RectTransform XPos_Slider - UnityEngine.RectTransform Y_position - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text YPos_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField YPos_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text YPos_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text YPos_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider YPos_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image YPos_Slider - UnityEngine.RectTransform YPos_Slider - UnityEngine.RectTransform Z_position - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text ZPos_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField ZPos_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text ZPos_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text z_Pos_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider z_Pos_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image z_Pos_Slider - UnityEngine.RectTransform z_Pos_Slider - UnityEngine.RectTransform arrow_freq - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text AF-Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField AF-Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text AF-Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text AF_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider AF_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image AF_Slider - UnityEngine.RectTransform AF_Slider - UnityEngine.RectTransform brush_freq - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text BF_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField BF_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text BF_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text BF_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider BF_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image BF_Slider - UnityEngine.RectTransform BF_Slider - UnityEngine.RectTransform ab_ratio - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text AR_Ratio_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField AR_Ratio_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text AR_Ratio_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text AB_Ratio_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider AB_Ratio_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image AB_Ratio_Slider - UnityEngine.RectTransform AB_Ratio_Slider - UnityEngine.RectTransform phasor_len - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Phasor_Len_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField Phasor_Len_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Phasor_Len_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Phasor_Len_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider Phasor_Len_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Phasor_Len_Slider - UnityEngine.RectTransform Phasor_Len_Slider - UnityEngine.RectTransform line_width - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text line_width_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField line_width_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text line_width_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text line_width_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider line_width_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image line_width_Slider - UnityEngine.RectTransform line_width_Slider - UnityEngine.RectTransform fade_start - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text fade_start_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField fade_start_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text fade_start_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text fade_start_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider fade_start_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image fade_start_Slider - UnityEngine.RectTransform fade_start_Slider - UnityEngine.RectTransform Duration - UnityEngine.RectTransform Header - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Duration_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.InputField Duration_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Duration_Input - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Duration_Slider - UnityEngine.RectTransform - UnityEngine.UI.Slider Duration_Slider - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Duration_Slider - UnityEngine.RectTransform Duration_Slider - UnityEngine.RectTransform Music Player - UnityEngine.RectTransform Back_Panel - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Play - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.Button - UnityEngine.EventSystems.EventTrigger Pause - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.Button - UnityEngine.EventSystems.EventTrigger Stop - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.Button - UnityEngine.EventSystems.EventTrigger Argos_Logo - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Image - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Mic_Input_Button - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.Button Mic_Level - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Button - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Latency Button - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.Button Latency - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Button - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.Button Latency_Val_txt - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Graph_Canvas - UnityEngine.RectTransform - UnityEngine.Canvas - UnityEngine.UI.CanvasScaler - UnityEngine.UI.GraphicRaycaster - MenuManager - GearVRInput - GF_Manager - OVRRaycaster - OVRMousePointer GF_Accel_3_Axes - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.CanvasGroup - UnityEngine.Animator - Menu Title - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Graph_Panel - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - GraphFloat Max_y - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Min_y - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Num(Clone) - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Num(Clone) - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Num(Clone) - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Num(Clone) - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Num(Clone) - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Num(Clone) - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Num(Clone) - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Num(Clone) - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Num(Clone) - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Num(Clone) - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text Text - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text DEBUGTEXT - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text DEBUGTEXT (1) - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text TOG_1 - UnityEngine.RectTransform - UnityEngine.UI.Toggle Background - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Checkmark - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image TOG_2 - UnityEngine.RectTransform - UnityEngine.UI.Toggle Background - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Checkmark - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image TOG_3 - UnityEngine.RectTransform - UnityEngine.UI.Toggle Background - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Checkmark - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Group - UnityEngine.RectTransform - UnityEngine.UI.ToggleGroup TOG_4 - UnityEngine.RectTransform - UnityEngine.UI.Toggle Background - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Checkmark - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image CanvasPointerGraph - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image Vectrocity_Camera - UnityEngine.Transform - UnityEngine.Camera - UnityEngine.FlareLayer - UnityEngine.GUILayer - UnityEngine.AudioListener VRButton_Test_Outside - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshCollider - UnityEngine.MeshRenderer - ViewTrigger InitErrorHandler - UnityEngine.Transform - InitErrorHandler ErrorCanvas - UnityEngine.RectTransform - UnityEngine.Canvas - UnityEngine.UI.CanvasScaler - UnityEngine.UI.GraphicRaycaster ErrorPanel - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.VerticalLayoutGroup TitlePanel - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.HorizontalLayoutGroup - UnityEngine.UI.LayoutElement ErrorTitle - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text BodyPanel - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.HorizontalLayoutGroup - UnityEngine.UI.LayoutElement ErrorBodyText - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Text BottomPanel - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image - UnityEngine.UI.HorizontalLayoutGroup - UnityEngine.UI.LayoutElement Panel - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image ARTransitionManager - UnityEngine.Transform - TransitionManager VRWorld - UnityEngine.Transform ARPort - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshCollider - UnityEngine.MeshRenderer - Button3D - ViewTrigger Static Objects - UnityEngine.Transform floor - UnityEngine.Transform floor_005 - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer floor_006 - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer floor_007 - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer floor_008 - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer Plane - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshCollider walls - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer - UnityEngine.BoxCollider walls - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer - UnityEngine.BoxCollider walls - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer - UnityEngine.BoxCollider walls - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer - UnityEngine.BoxCollider Columns - UnityEngine.Transform Column - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer - UnityEngine.BoxCollider Column - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer - UnityEngine.BoxCollider Column - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer - UnityEngine.BoxCollider Column - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer - UnityEngine.BoxCollider Ceiling - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshCollider - UnityEngine.MeshRenderer Directional light - UnityEngine.Transform - UnityEngine.Light Point light - UnityEngine.Transform - UnityEngine.Light LightAnchor - UnityEngine.Transform Point light - UnityEngine.Transform - UnityEngine.Light - LightControl Cylinder - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.CapsuleCollider - UnityEngine.MeshRenderer StereoDivisionCanvas - UnityEngine.RectTransform - UnityEngine.Canvas - UnityEngine.UI.CanvasScaler - UnityEngine.UI.GraphicRaycaster DivisionArea - UnityEngine.RectTransform - UnityEngine.CanvasRenderer - UnityEngine.UI.Image VR Mouse Look (Rotation) - UnityEngine.Transform VR Mouse Look (Forward) - UnityEngine.Transform OVRCameraRig - UnityEngine.Transform - OVRCameraRig - OVRManager - VRMouseLook TrackingSpace - UnityEngine.Transform LeftEyeAnchor - UnityEngine.Transform CenterEyeAnchor - UnityEngine.Transform - UnityEngine.AudioListener - UnityEngine.Camera - Vuforia.HideExcessAreaBehaviour - Vuforia.VideoBackgroundBehaviour - VRIntegrationHelper CenterEyeAnchor - UnityEngine.Transform CenterEyeAnchor - UnityEngine.Transform - UnityEngine.MeshRenderer - Vuforia.BackgroundPlaneBehaviour - UnityEngine.MeshFilter RightEyeAnchor - UnityEngine.Transform TrackerAnchor - UnityEngine.Transform LeftHandAnchor - UnityEngine.Transform RightHandAnchor - UnityEngine.Transform CenterRightEyeAnchor - UnityEngine.Transform - UnityEngine.AudioListener - UnityEngine.Camera - VRIntegrationHelper - Vuforia.VideoBackgroundBehaviour - Vuforia.HideExcessAreaBehaviour CenterRightEyeAnchor - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer VuforiaCenterAnchor - UnityEngine.Transform 2 GraphTrace_0 - UnityEngine.RectTransform - Vectrosity.VectorObject3D - UnityEngine.MeshRenderer - UnityEngine.MeshFilter 3 GraphTrace_1 - UnityEngine.RectTransform - Vectrosity.VectorObject3D - UnityEngine.MeshRenderer - UnityEngine.MeshFilter 4 GraphTrace_2 - UnityEngine.RectTransform - Vectrosity.VectorObject3D - UnityEngine.MeshRenderer - UnityEngine.MeshFilter 5 TextureBufferCamera - UnityEngine.Transform - UnityEngine.Camera TextureBufferMesh - UnityEngine.Transform - UnityEngine.MeshFilter - UnityEngine.MeshRenderer 6 TickMarks - UnityEngine.RectTransform - Vectrosity.VectorObject3D - UnityEngine.MeshRenderer - UnityEngine.MeshFilter
Models
- Hold the application’s core data and state, such as user performance, statistics, vitals.
- Serialize, deserialize, and/or convert between types.
- Load/save data (locally or on the web).
- Notify Controllers of the progress of operations.
- Store the State for the Finite State Machine.
- Never access Views.
Views
- Can get data from Models in order to represent up-to-date game state to the user. For example, a View method
player.Run()
can internally usemodel.speed
to manifest the player abilities. - Should never mutate Models.
- Strictly implements the functionalities of its class. For example:
- A
PlayerView
should not implement input detection or modify the Game State. - A View should act as a black box that has an interface, and notifies of important events.
- Does not store core data (like speed, health, lives,…).
- A
Controllers
- Do not store core data.
- Can sometimes filter notifications from undesired Views.
- Update and use the Model’s data.
- Manages Unity’s scene workflow.
// BounceApplication.cs // Base class for all elements in this application. public class BounceElement : MonoBehaviour { // Gives access to the application and all instances. public BounceApplication app { get { return GameObject.FindObjectOfType<BounceApplication>(); }} } // 10 Bounces Entry Point. public class BounceApplication : MonoBehaviour { // Reference to the root instances of the MVC. public BounceModel model; public BounceView view; public BounceController controller; // Init things here void Start() { } }
// BounceModel.cs // Contains all data related to the app. public class BounceModel : BounceElement { // Data public int bounces; public int winCondition; }
// BounceView .cs // Contains all views related to the app. public class BounceView : BounceElement { // Reference to the ball public BallView ball; }
// BallView.cs // Describes the Ball view and its features. public class BallView : BounceElement { // Only this is necessary. Physics is doing the rest of work. // Callback called upon collision. void OnCollisionEnter() { app.controller.OnBallGroundHit(); } }
// BounceController.cs // Controls the app workflow. public class BounceController : BounceElement { // Handles the ball hit event public void OnBallGroundHit() { app.model.bounces++; Debug.Log(“Bounce ”+app.model.bounce); if(app.model.bounces >= app.model.winCondition) { app.view.ball.enabled = false; app.view.ball.GetComponent<RigidBody>().isKinematic=true; // stops the ball OnGameComplete(); } } // Handles the win condition public void OnGameComplete() { Debug.Log(“Victory!!”); } }
Notifications
As shown in the example above, when the ball hits the ground its view executes app.controller.OnBallGroundHit()
which is a method. It isn’t, by any means, “wrong” to do that for all notifications in the application. However, in my experience, I’ve achieved better results using a simple notification system implemented in the AMVCC Application class.
To implement that, let’s update the layout of the BounceApplication
to be:
// BounceApplication.cs class BounceApplication { // Iterates all Controllers and delegates the notification data // This method can easily be found because every class is “BounceElement” and has an “app” // instance. public void Notify(string p_event_path, Object p_target, params object[] p_data) { BounceController[] controller_list = GetAllControllers(); foreach(BounceController c in controller_list) { c.OnNotification(p_event_path,p_target,p_data); } } // Fetches all scene Controllers. public BounceController[] GetAllControllers() { /* ... */ } }
Next, we need a new script where all developers will add the notification event’s names, which can be dispatched during execution.
// BounceNotifications.cs // This class will give static access to the events strings. class BounceNotification { static public string BallHitGround = “ball.hit.ground”; static public string GameComplete = “game.complete”; /* ... */ static public string GameStart = “game.start”; static public string SceneLoad = “scene.load”; /* ... */ }
It is easy to see that, this way, the code legibility is improved because developers don’t need to search all over the source code for controller.OnSomethingComplexName
methods in order understand what kind of actions can happen during execution. By only checking one file, it is possible to understand the overall behaviour of the application.
Now, we only need to adapt the BallView
and BounceController
to handle this new system.
// BallView.cs // Describes the Ball view and its features. public class BallView : BounceElement { // Only this is necessary. Physics is doing the rest of work. // Callback called upon collision. void OnCollisionEnter() { app.Notify(BounceNotification.BallHitGround,this); } }
// BounceController.cs // Controls the app workflow. public class BounceController : BounceElement { // Handles the ball hit event public void OnNotification(string p_event_path,Object p_target,params object[] p_data) { switch(p_event_path) { case BounceNotification.BallHitGround: app.model.bounces++; Debug.Log(“Bounce ”+app.model.bounce); if(app.model.bounces >= app.model.winCondition) { app.view.ball.enabled = false; app.view.ball.GetComponent<RigidBody>().isKinematic=true; // stops the ball // Notify itself and other controllers possibly interested in the event app.Notify(BounceNotification.GameComplete,this); } break; case BounceNotification.GameComplete: Debug.Log(“Victory!!”); break; } } }
Bigger projects will have a lot of notifications. So, to avoid getting a big switch-case structure, it is advisable to create different controllers and make them handle different notification scopes.
AMVCC in the Real World
This example has shown a simple use case for the AMVCC pattern. Adjusting your way of thinking in terms of the three elements of MVC, and learning to visualize the entities as an ordered hierarchy, are the skills that ought to be polished.
In bigger projects, developers will be faced with more complex scenarios and doubts about whether something should be a View or a Controller, or if a given class should be more thoroughly separated in smaller ones.
Rules of Thumb
There isn’t any “Universal Guide for MVC sorting” anywhere. But there are some simple rules that I typically follow to help me determine whether to define something as a Model, View, or Controller, and also when to split a given class in smaller pieces.
Usually this happens organically while I think about the software architecture or during scripting.
https://www.toptal.com/unity-unity3d/unity-with-mvc-how-to-level-up-your-game-development