The first time I used the MRTK configuration settings I was confused about how they work. Now that I understand it's not too bad, but they can still be quite cumbersome to change. This will be one of the first things that users experience with the MRTK and we should make this easier.
In my opinion, usability problems include:
See this video which demonstrates the steps which must be performed to change a setting, from the perspective of a new user:
ChangingMrtkSetting.zip
4 minutes. Dozens of clicks. Lots of opportunities for confusion. Just to change a setting from Gesture to Articulated.
Changing an MRTK configuration setting is obvious and easy. Preferably works in a way that will feel familiar to experienced Unity developers.
This may be related to #3545, but I think that's a larger issue. It looks like a fancy design patterns thing that I can't really fathom, so I wanted to open this issue just to focus on the usability aspect of changing configuration settings. But they may be interrelated.
This is something that many folks have raised already, and something that we're aware of. We're thinking about ways that we can address this going forward.
The issue linked above is designed to make things less painful, though obviously because there's still the single massive object and it's profile there's still that problem.
Here are some potential alternative ideas for addressing this:
Note: There may be a better solution. I'm just throwing out some options. Ideally, there's a way to simplify this so that the settings system itself can be easy to understand/maintain.
I think that going forward something that spawns out of #1 is probably where we want to go, as #2-4 are kinda just bandaids on top of the system. We could do a lot of work making inspectors nicer, or making cloning more understandable, but at the end of the day it's still such a foreign concept that new users will still need to pay that tax.
I just want to be transparent here that doing something like #1 would need to be thought through with perhaps a larger change in the way we make MRTK objects used (i.e. monolithic vs individual components), and is something we'd need to take significant time and due diligence in doing.
Thanks for the feedback @ForrestTrepte
I'm def not a fan of 1 as it's the breaking from the Monobehavior that's the goal here, and one of the key principles behind the original design. (Even newer Unity stuff is moving towards more ECS and DOTS which all try to break from this same thing) We tested and measured that it was a 60-70% increase in speed. Doing 1 goes back to the way things used to be.
2 is already doable, and is one of the two options on the MixedRealityToolkit GameObject when you first configure the system. Part of why we didn't just clone right away was we wanted to tell the story that everything should just work out of the box. Like magic. With a single click. I think that's a powerful story.
3 is kinda a stretch, as there's a lot of data being stored, even for a single profile. (Take a look at the mapping profiles, big arrays). Each profile is a ScriptableObject and gets serialized as such.
Now 4? Yes, love this idea. I think this is the most interesting and the best solution. I'm already thinking about how to accomplish this.
Thanks for explaining the thinking behind the original design, Stephen. I'll admit that #1 is my preference because it is more familiar and easy to use/understand. But I think the others could also be viable. You do raise a point, though, about game object overhead. When I developed a Unity game with tens of thousands of units I had to break with game objects for performance reasons. I am surprised that for settings and small numbers of monobehaviours, such as the widgets in a typical mixed reality scene, the overhead of game objects would be significant. Would it be viable to use monobehaviours for most parts of MRTK, while processing updates on large collections of objects via ECS/DOTS? I haven't tended to work on HoloLens applications that were CPU-bound, so I haven't profiled at this level.
Can you explain how to do #2? That sounds really great. I have been doing Add To Scene and Configure and then the options I found were Copy & Customize (only clones top level) or Create new profiles (creates empty profile--you'd have to fill everything in).
Read-only settings that must be cloned before they can be edited. (Combined with the nesting, this requires you to clone multiple times, with different subsections and subsubsections.)
This absolutely needs to go. I'm 100% comfortable with profiles at this point and I still find myself frustrated by this limitation daily.
@ForrestTrepte You're correct that #3545 is related to some of the issues you're raising.
Put settings on regular old Unity game objects in the scene. Everything would understand how this works
In the mrtk_development branch, if you open your config profile's Editor Settings - after cloning your read-only profile, natch 馃憤 - and check _Enable Service Inspectors_, MRTK will generate a set of game objects that mimic the kind of standalone objects we're all used to dealing with.
This doesn't change the way services actually work, nor does it change where config data is actually stored. So we should continue to explore some of the other options you mention. But it does provide a more familiar (and non-nested way) to view and interact with services / settings.
I wasn't a big fan of the Russian nesting dolls either.
Put settings on regular old Unity game objects in the scene. Everything would understand how this works
imho the way it's setup in the Project tab is essentially the same way. It's something you select in a folder hierarchy vs a scene hierarchy. Not much of a difference in workflow, just a different window you're selecting items in. That's why I don't agree with the Facades in any way. All of the services and systems don't exist in the scene, and don't require any sort of representation there.
Would it be viable to use monobehaviours for most parts of MRTK, while processing updates on large collections of objects via ECS/DOTS?
Yes, but then we'd loose out on that huge performance gain I mentioned earlier. Also Unity is moving most development to ECS/DOTS _very soon_, so it makes sense to go ahead and start nudging people that way. We thought of the toolkit as a stepping stone to ECS/DOTS workflows, and should be easily compatible as we've removed a lot of the Monobehaviour dependencies already.
Can you explain how to do 2? That sounds really great. I have been doing Add To Scene and Configure and then the options I found were Copy & Customize (only clones top level) or Create new profiles (creates empty profile--you'd have to fill everything in).
@railboy, didn't you update the clone tool to facilitate this already?
I think the idea was that the default profiles were enough, and that the toolkit is _already_ configured to meet 80% of most developers needs.
You should only have to clone a profile to meet a specific edge case. We envisioned that people wouldn't actually be editing the defaults too much unless they really wanted to get into customizing all the things.
Although there were other profiles (like the input actions) we thought people would customize a lot per application, based on all the different actions a user can take it it. That's mainly why we choose to only clone what you need, and leave the rest alone.
I've noticed people tend to want to just jump in and customize all the things without really understanding what it does 馃槄 which I'm the same way. Best way to learn, imho, but can quickly lead to confusion. Part of why most of the inspectors are heavily documented with notes and tooltips.
I think idea 4 is the most viable, having auto cloned the default makes it easier to also reset if you make a mistake, but I think the only hurdle there is preventing the clone method from selecting the newly cloned profile. I think the only downside is that it'd create a ton of new files immediately and it'll trigger an asset import. So it'd be something that needed to be done when the user Configure...s the toolkit, so there's no noticeable delay.
@StephenHodgson Yes I did some work on the profile clone tool but it could still use some work.
I've noticed people tend to want to just jump in and customize all the things without really understanding what it does 馃槄 which I'm the same way. Best way to learn, imho, but can quickly lead to confusion. Part of why most of the inspectors are heavily documented with notes and tooltips.
Agreed, that's how I learn too, poking around and breaking things. I get the need for a safety net but kneecapping that natural instinct and all the potential learning along with it really seems like the nuclear option. A better safety net might be a big fat RESET TO DEFAULTS button on default profiles. Then you can tweak whatever you want and roll back if it breaks.
All I know is the non-editable default profile just isn't working. For first-time users it's alienating and for regular users it's super obnoxious.
It wasn't supposed to be a safety net, per say. It was intended that the profiles would be the defaults for most people's use cases.
Every decision was intentional with a lot of thought behind it, and having the default profiles be locked down was a good idea as we wanted to ensure that the toolkit worked out of the box, like magic, and we didn't want people to edit them only to grab an update and get their edits stomped.
Although now that I've updated my fork to use the Unity Package Manager (upm), it's no longer needed to lock them down as the packages grey out/lock them down by default and upm also offers an easy way to make a copy of assets and prefabs into people's projects.
It's really not much of a difference in the workflow from what Unity is also doing with their packages.
All I know is the non-editable default profile just isn't working. For first-time users it's alienating and for regular users it's super obnoxious.
I think this statement is a bit dramatic, but automating this initial clone will go a long way to help ease the process.
@ForrestTrepte Just looping back to make it clear that we're hearing your feedback on this issue and on the setting discoverability issue in #4243. Keep posting this stuff, it's really valuable.
Completely agree with the identification of the source issues being identified here and have to say we do know.
But to explain slightly, you need to understand its history. The first major challenge was to break the old chains and make it work, deliver a solution that could be defined by a core set of configuration and break the old prefab / Go style of maintaining the Core solution. This doesn't relate to SDK / scene stuff, just the whole backend.
Additionally, we had the challenge to make it super easy to radically change the project at run-time, swapping abilities/capabilities to enable projects to work in a true Mixed Reality fashion.
However, this was all (and we're still there) in the "Making it work" phase. Now what we need to work towards "Making it easier to use", a few ideas have been mentioned above and a few haven't so here's my current thinking based off talking to devs, feedback and notes:
one pattern is to replicate the new Unity preferences screen, having a standalone editor window for managing all configuration. This is probably the ideal case but tricky to implement and make it dynamic. In the new editor UI, this would effectively be a complete rewrite of configuration screens.
Another is a custom editor window, similar to the above but more editor focused. has the benefit of being able to reuse a lot of the current inspectors.
Configuration asset navigator. Some devs dislike the idea of a single all master powerful config screen but do want a navigatable / breadcrumb approach when working with the individual configuration assets. Taking what is there but aligning it to modern standards used in web apps.
One underlying thing surrounds the "defaults" and I feel this we should be able to change easily now. Currently, we start with read-only defaults forcing you to clone to start configuring. So maybe we should flip this so that we START with a copy of the defaults and then give an option to reset (copy) the defaults should we want to go back. That gives an editable version straight away, keeping the comfort for being able to get back. The clone / new options should still stay for flexibility with working with multiple configurations.
Thoughts.
One underlying thing surrounds the "defaults" and I feel this we should be able to change easily now. Currently, we start with read-only defaults forcing you to clone to start configuring. So maybe we should flip this so that we START with a copy of the defaults and then give an option to reset (copy) the defaults should we want to go back. That gives an editable version straight away, keeping the comfort for being able to get back. The clone / new options should still stay for flexibility with working with multiple configurations.
Yes, 馃挴 definitely this
@SimonDarksideJ I remember us having a conversation about making our own preferences window as well.
Imho that's really the key I think and being able to enable the breadcrumb navigation is going to be key here.
I agree. Starting with already-cloned setting would go a long way.
By the way, if we kept settings in prefabs we'd get the revert functionality for free. Unity's new prefab features would even allow you so see each setting you have changed from the default and to revert changes individually. This works really great in MRTKv1.

Most helpful comment
Here are some potential alternative ideas for addressing this:
Note: There may be a better solution. I'm just throwing out some options. Ideally, there's a way to simplify this so that the settings system itself can be easy to understand/maintain.