Custom Errors

Custom Error Configuration

A custom Error is defined by implementing the CustomErrorTypeDefinition class and attaching it to the UI. For example, the HeightLimitError triggers if the Target prefab exceeds the specified MaxHeight.

public class HeightLimitError : CustomErrorTypeDefinition
{
    public float MaxHeight { get; set; } = 2f;
    public GameObject Target { get; set; } = null;

    private GameObject spawnedPrefab = null;

    protected override void OnCreate()
    {
        Target = Resources.Load<GameObject>("TargetCube");
    }

    protected override void OnActionInitialize(BaseActionData baseActionData)
    {
        if (baseActionData.ActionName == ActionName)
        {
                spawnedPrefab = AnalyticsUtilities.Spawn(Target);

                spawnedPrefab.AttachCallback(AnalyticsUtilities.Hook.OnTranslation, () =>
                {
                if (spawnedPrefab.transform.position.y > MaxHeight)
                {
                    TriggerError();
                }
                });
        }
    }

    protected override void OnActionPerform(BaseActionData baseActionData, bool skipped)
    {
        if (baseActionData.ActionName == ActionName)
        {
                AnalyticsUtilities.Destroy(spawnedPrefab);
        }
    }

    protected override void OnActionUndo(BaseActionData baseActionData)
    {
        if (baseActionData.ActionName == ActionName)
        {
                AnalyticsUtilities.Destroy(spawnedPrefab);
        }
    }
}

Custom Objective Configuration

A custom Objective can be created by implementing the CustomObjectiveTypeDefinition class and attaching it to the UI. For example, the OperationTimeObjective class succeeds if GetRealTimeSinceStartUp() is less than the timeLimit value.

public class OperationTimeObjective : CustomObjectiveTypeDefinition
{
    float timeLimit = 20f;

    protected override void OnActionInitialize(BaseActionData baseActionData)
    {
        if (Hub.Instance.Get<SceneGraphModule>().GetActionCategory(baseActionData)
        == SceneGraphModule.ActionCategory.End)
        {
            bool success = Hub.Instance.
            Get<MAGESAnalytics>().GetRealTimeSinceStartUp() < timeLimit;

            riggerObjective(success);
        }
    }
}