Mixedrealitytoolkit-unity: MRTK uses OnValidate to initialize when it shouldn't be loaded

Created on 7 May 2019  Â·  6Comments  Â·  Source: microsoft/MixedRealityToolkit-Unity

OnValidate is being called, when a blank scene is loaded without MRTK even enabled.

OnValidate should not be using to initialize objects:

NullReferenceException: Object reference not set to an instance of an object
Microsoft.MixedReality.Toolkit.Core.Definitions.MixedRealityCameraProfile.ApplySettingsForOpaqueDisplay () (at Assets/Libraries/Core/Assets/Core/MRTK/MixedRealityToolkit/Definitions/MixedRealityCameraProfile.cs:89)​
Microsoft.MixedReality.Toolkit.Core.Services.MixedRealityToolkit.InitializeServiceLocator () (at Assets/Libraries/Core/Assets/Core/MRTK/MixedRealityToolkit/Services/MixedRealityToolkit.cs:181)​
Microsoft.MixedReality.Toolkit.Core.Services.MixedRealityToolkit.InitializeInstance () (at Assets/Libraries/Core/Assets/Core/MRTK/MixedRealityToolkit/Services/MixedRealityToolkit.cs:458)​
Microsoft.MixedReality.Toolkit.Core.Services.MixedRealityToolkit.OnValidate () (at Assets/Libraries/Core/Assets/Core/MRTK/MixedRealityToolkit/Services/MixedRealityToolkit.cs:548)​

0 - Backlog Bug ISV Release Blocker Services

All 6 comments

What version / branch produces these errors?

@Railboy This one is a migration from our internal bug tracker to GitHub. It was originally filed in February, so it's possible much of this has been mitigated by your work since then.

If I'm remembering correctly, this issue only occurred in a specific project where, after a build, Unity reloaded the scene in the editor and a Toolkit script was trying to reference the camera before it had been reloaded, causing Unity to crash. I've never been able to repro it though.

I don't believe this will be a problem moving forward but for good measure we ought to remove the OnValidate call altogether. I'll do so in PR #4035

Sounds good @Railboy! Will assign this issue to you

That was only one specific instance, but to clarify further. The issue is that OnValidate is being used incorrectly for all of these scripts. Remove them and use Awake() or OnEnable(). OnValidate are running too often and cause editor performance problems especially if the object takes dependencies on other gameobjects

If the intent is to validate an object inspector properties, you should be using editor scripts. Additionally, if you are checking Ranges for properties, ensure the appropriate tags are being used.

here is the list of of where we are still using OnValidate:
Find all "OnValidate", Subfolders, Find Results 1, Entire Solution, ""
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit\Utilities\ClippingPrimitive.cs(116): protected void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit\Utilities\Lines\DataProviders\BaseMixedRealityLineDataProvider.cs(307): protected virtual void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit\Utilities\Lines\DataProviders\ParabolaConstrainedLineDataProvider.cs(53): protected override void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit\Utilities\Lines\DataProviders\ParabolaConstrainedLineDataProvider.cs(60): base.OnValidate();
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit\Utilities\Lines\DataProviders\ParabolaLineDataProvider.cs(24): protected override void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit\Utilities\Lines\DataProviders\ParabolaLineDataProvider.cs(26): base.OnValidate();
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit\Utilities\Lines\DataProviders\RectangleLineDataProvider.cs(79): protected override void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit\Utilities\Lines\DataProviders\SimpleLineDataProvider.cs(37): protected override void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit\Utilities\Lines\DataProviders\SimpleLineDataProvider.cs(39): base.OnValidate();
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit\Utilities\Lines\LineFollower.cs(72): private void OnValidate() => EnsureSetup();
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit\Utilities\Lines\Renderers\MeshLineRenderer.cs(92): private void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\Audio\Influencers\AudioInfluencerController.cs(207): private void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\Audio\Influencers\AudioLoFiEffect.cs(94): private void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\Utilities\Solvers\InBetween.cs(55): protected override void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\Utilities\Solvers\InBetween.cs(57): base.OnValidate();
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\Utilities\Solvers\Solver.cs(138): protected virtual void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\Utilities\Solvers\SurfaceMagnetism.cs(165): protected override void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\Utilities\Solvers\SurfaceMagnetism.cs(167): base.OnValidate();
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\UX\Scripts\Collections\TileGridObjectCollection.cs(98): protected virtual void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\UX\Scripts\Cursors\CursorModifier.cs(245): private void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\UX\Scripts\Pointers\LinePointer.cs(84): protected virtual void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\UX\Scripts\Pointers\ParabolicTeleportPointer.cs(29): protected override void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\UX\Scripts\Pointers\ParabolicTeleportPointer.cs(31): base.OnValidate();
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\UX\Scripts\Pointers\PokePointer.cs(36): protected void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\UX\Scripts\Pointers\SpherePointerVisual.cs(34): public void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.SDK\Features\UX\Scripts\Tooltips\ToolTip.cs(339): protected virtual void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.Services\InputSystem\GazeProvider.cs(335): private void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.Services\InputSystem\NearInteractionTouchable.cs(167): protected void OnValidate()
C:\dev\Unity\Finger Pointer\Assets\MRTK\MixedRealityToolkit.Examples\Demos\Gltf\Scripts\TestGltfLoading.cs(24): private void OnValidate()

Was this page helpful?
0 / 5 - 0 ratings

Related issues

StephenHodgson picture StephenHodgson  Â·  3Comments

amfdeluca picture amfdeluca  Â·  3Comments

reillydonovan picture reillydonovan  Â·  3Comments

jimstack picture jimstack  Â·  3Comments

MatteoFantasy picture MatteoFantasy  Â·  3Comments