- Notifications
You must be signed in to change notification settings - Fork 51
Settings system
The settings system allows researchers to assign parameters (e.g. independent variables) to the Session, a Block, or a Trial. The settings system is handled with a dedicated class: Settings.
Instances of a Session, Block, or Trial each contain a .settings
field which is initially populated with an empty settings object.
When we begin the Session, we optionally pass a Settings object to be then used as the settings for the Session. If we are using the UI, the UI does this step for us - passing to the session the settings found in the selected .json file.
By default the Session is started using the UI, with a selected .json
file ("Experiment profile") is deserialized. The deserialization is performed by the popular MiniJSON
script. Example .json
file:
{ "a_number": 1, "a_string": "hello", "a_boolean": true, "an_array": [1, 2, 3], "another_array": ["hi", 1, false], "an_object": { "num": 1, "text": "hello" } }
Note: Even on systems where ,
is used as a decimal point (i.e. non English language locales) you should still use .
as a decimal separator. This is a limitation of the JSON spec.
When deserializing from .json
, care must be taken when converting the type of the objects in our settings file. JSON is just a string - so MiniJSON interprets each value and attempts to deserialize it into an appropriate C# type. As of March 2019, the syntax for getting and setting settings values uses .Get*
and .SetValue
methods.
// set the setting called "example" to the value 100 settings.SetValue("example", 100);
Example JSON | JSON type | Desired C# type | Access example |
---|---|---|---|
{"example": 123} | int | int | settings.GetInt("example") |
{"example": 123} | int | float | settings.GetFloat("example") |
{"example": 3.14} | float | float | settings.GetFloat("example") |
{"example": true} | bool | bool | settings.GetBool("example") |
{"example": {"sub_key": 1}} | object | Dictionary<string, object> | settings.GetDict("example") |
{"example": [1, "red", true]} | array | List<object> | settings.GetObjectList("example") |
{"example": [1, 2, 3]} | array | List<int> | settings.GetIntList("example") |
{"example": [1, 1.5, 2]} | array | List<float> | settings.GetFloatList("example") |
If you have issues you can check validity of your JSON files with an online validator tool.
An example getting a setting called size
from a trial, which you can use however you like (e.g. scale up an object):
float size = trial.settings.GetFloat("size");
The setting system is set up such that, if a settings is unavailable, the request will cascade up the experiment hierarchy. For example, if a settings is not available for the Trial, it will look inside the Block, and then inside the Session. This means you can easily apply, for example, a setting to a whole block but have specific trials within that block that have a different value for that setting.
Previous versions of UXF (before March 2019) required the use of the below syntax for accessing settings. Now the above method is recommended.
Example JSON | JSON type | C# cast example |
---|---|---|
{"example": "hello"} | string | (string) settings["example"] |
{"example": 123} | int | (long) settings["example"] |
{"example": 3.14} | float | (double) settings["example"] |
{"example": [1, 2, 3]} | array | (List<object>) settings["example"] |
{"example": {"a": 1, "b": "hello"}} | Dictionary<string, object> | (Dictionary<string, object>) settings["example"] |
{"example": true} | bool | (bool) settings["example"] |
Note: Add using System;
to the top of your script to gain access to the Convert.To*()
methods.
Example JSON | JSON type | Desired C# type | C# Conversion example |
---|---|---|---|
{"example": 123} | int | int | Convert.ToInt32(settings["example"]) |
{"example": 123} | int | float | Convert.ToSingle(settings["example"]) |
{"example": 3.14} | float | float | Convert.ToSingle(settings["example"]) |
๐ง Core topics
- ๐ Background
- โจ UXF 2.0
- โ๏ธ Compatibility
- ๐ถ๏ธ Oculus Quest Setup
- ๐ญ Concepts
- ๐ ๏ธ Get started
- ๐ Examples
- ๐ฅ๏ธ Built-in UI
- ๐ Session generation
- โฐ Events
- ๐ Data collection
- โ๏ธ Collect custom data
- ๐ Custom Data Handler
- ๐ Remote Data Collection
- ๐๏ธ WebGL DynamoDB setup
- ๐ Processing DynamoDB CSVs
- ๐ซ HTTP Post Setup
- ๐ง Settings system
- ๐๐ฝ Tracker system
- ๐ Logging system
โ ๏ธ Common issues- ๐ผ๏ธ Multi-scene experiments
- ๐บ Videos
- ๐จโ๐ Full written tutorial
- ๐ฆ Asset links
- ๐จโ๐ซ Unity tutorial links
- ๐ Useful code snippets
- ๐ก Programming ideas
- ๐งฎ Example R processing