Skip to content

Attribute Reference

Analytics event attributes

[TactileAnalytics.EventAttribute(string name, bool validationRequired = true)]

Target: Class

Required on every analytics event class. name is the event name as it appears in the data warehouse and dashboard. validationRequired defaults to true — set to false to skip server-side schema validation.

[TactileAnalytics.EventAttribute("levelCompleted")]
public class LevelCompleteEvent { ... }

[EventCategory(string category)]

Target: Class Required: No

Groups events in the PlayOps dashboard UI. Helps organise large event schemas by feature area.

[EventCategory("Progression")]

Common categories: "Progression", "Monetisation", "Social", "Debug", "Performance".

[EventDescription(string description)]

Target: Class Required: No, but strongly recommended

Human-readable description of when this event fires. Shown in the schema viewer and used for auto-generated documentation. Write it as a sentence: “Fired when the player successfully finishes a level.”

[EventChangeReason(string reason, string developer, string stakeholder)]

Target: Class Required: Yes, when modifying an existing event schema

Tracks why an event schema changed, who made the change, and who requested it. All three parameters are required and cannot be empty.

[EventChangeReason("Add elapsed time property", "dev@studio.com", "pm@studio.com")]

[UnregisteredDeviceEvent]

Target: Class Required: No

Marks an event as being sent for unregistered devices — devices that have not yet completed the full registration flow with the backend.

[EventPropertyDescription(string description)]

Target: Property Required: Yes (to include the property in the schema)

Documents a property in the generated schema. Properties without this attribute are ignored by the schema generator. Write a description of what the value represents.

[EventPropertyDescription("Stars earned on completion (0–3).")]
private TactileAnalytics.RequiredParam<int> starsEarned { get; set; }

[PersonalData]

Target: Property Required: No

Marks a property as containing personal or sensitive data. Used for data governance and compliance.

[PersonalData]
[EventPropertyDescription("Player email if provided.")]
private TactileAnalytics.OptionalParam<string> email { get; set; }

Analytics parameter types

RequiredParam<T>

Wrapper struct for required event properties. The schema generator marks these as required.

private TactileAnalytics.RequiredParam<string> levelName { get; set; }

OptionalParam<T>

Wrapper struct for optional event properties. The schema generator marks these as optional.

private TactileAnalytics.OptionalParam<double> localPrice { get; set; }

Both types have implicit conversion operators, so you can assign values directly:

this.levelName = "world1_level3";
this.localPrice = 4.99;

Supported types for T

C# TypeJSON PrefixMax Parameters
strings_param100
inti_param100
doublef_param50
boolb_param50
DateTimets_param50

float is not supported — use double instead.

Configuration attributes

[Tactile.ConfigProvider(string key)]

Target: Class

Maps a C# class to a top-level key in the server-side configuration JSON. key must exactly match the key as defined in the PlayOps dashboard configuration editor.

[Tactile.ConfigProvider("IAPConfig")]
public class IAPConfig { ... }

[JsonSerializable(string name)]

Target: Property

Maps a property to a JSON field name for deserialization.

[JsonSerializable("FeaturedProductId")]
public string FeaturedProductId { get; set; }

[JsonSerializable(string name, Type elementType)]

Target: Property

For List<T> properties. Specifies the element type for deserialization.

[JsonSerializable("InAppProducts", typeof(InAppProductInfo))]
public List<InAppProductInfo> InAppProducts { get; set; }