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# Type | JSON Prefix | Max Parameters |
|---|---|---|
string | s_param | 100 |
int | i_param | 100 |
double | f_param | 50 |
bool | b_param | 50 |
DateTime | ts_param | 50 |
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; }