# TTS Events

## Inherit from EasyManager.cs

```csharp
using EasyCodeForVivox;

public class VivoxManager : EasyManager
{

}
```

## Inject EasyEvents

```csharp
using EasyCodeForVivox.Events;
using UnityEngine;
using Zenject;

public class VivoxEvents : MonoBehaviour
{
    EasyEvents _events;

    [Inject]
    private void Initialize(EasyEvents events)
    {
        _events = events;
    }
}
```

## Dynamic Events

#### Make sure Dynamic Events are enabled

<figure><img src="https://3152232848-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MWHF2U_tfZEUaf_IsL-%2Fuploads%2FgNWd8mgjCB90w9n3fR8A%2FEnableDynamicEvents.png?alt=media&#x26;token=f9e1f6a3-8d21-49a1-9ff5-d1a8151efad1" alt=""><figcaption></figcaption></figure>

## How to Subscribe to TextToSpeech Events in EasyCode&#x20;

#### EasyManager

{% hint style="info" %}
Keeping the *<mark style="color:blue;">**base**</mark>* methods are not necessary. They are simply <mark style="color:blue;">**Debug.Logs()**</mark>. Feel free to delete them
{% endhint %}

```csharp
// Text-To-Speech Event Callbacks

protected override void OnTTSMessageAdded(ITTSMessageQueueEventArgs ttsArgs)
{
    base.OnTTSMessageAdded(ttsArgs);
}

protected override void OnTTSMessageRemoved(ITTSMessageQueueEventArgs ttsArgs)
{
    base.OnTTSMessageRemoved(ttsArgs);
}

protected override void OnTTSMessageUpdated(ITTSMessageQueueEventArgs ttsArgs)
{
    base.OnTTSMessageUpdated(ttsArgs);
}
```

#### EasyEvents

<pre class="language-csharp"><code class="lang-csharp"><strong>public void SubscribeToTTAEvents()
</strong>{
    _events.TTSMessageAdded += OnTTSMessageAdded;
    _events.TTSMessageRemoved += OnTTSMessageRemoved;
    _events.TTSMessageUpdated += OnTTSMessageUpdated;
}

public void UnsubscribeFromTTSEvents()
{
    _events.TTSMessageAdded -= OnTTSMessageAdded;
    _events.TTSMessageRemoved -= OnTTSMessageRemoved;
    _events.TTSMessageUpdated -= OnTTSMessageUpdated;
}


protected virtual void OnTTSMessageAdded(ITTSMessageQueueEventArgs ttsArgs)
{
    Debug.Log($"TTS Message Has Been Added : {ttsArgs.Message.Text}");
}

protected virtual void OnTTSMessageRemoved(ITTSMessageQueueEventArgs ttsArgs)
{
    Debug.Log($"TTS Message Has Been Removed : {ttsArgs.Message.Text}");
}

protected virtual void OnTTSMessageUpdated(ITTSMessageQueueEventArgs ttsArgs)
{
    Debug.Log($"TTS Message Has Been Updated : {ttsArgs.Message.Text}");
}
</code></pre>

#### Dynamic Events

Make sure the parameter in your method matches the event type. See what parameter is required for each [User Event here](https://fullstackindie.gitbook.io/easy-code-for-vivox/api-info/easyevents.cs#user-events). Dynamic events will dynamically invoke your method at runtime on every game object that has a dynamic event attribute. Because of this **there is no need to Subscribe/Unsubscribe from events** with the usual <mark style="color:red;">**+=/-=**</mark>

```csharp
[TextToSpeechEvent(TextToSpeechStatus.TTSMessageAdded)]
private void OnTTSMessageAdded(ITTSMessageQueueEventArgs ttsArgs)
{
    Debug.Log($"TTS Message Has Been Added : {ttsArgs.Message.Text}");
}

[TextToSpeechEvent(TextToSpeechStatus.TTSMessageRemoved)]
private void OnTTSMessageRemoved(ITTSMessageQueueEventArgs ttsArgs)
{
    Debug.Log($"TTS Message Has Been Removed : {ttsArgs.Message.Text}");
}

[TextToSpeechEvent(TextToSpeechStatus.TTSMessageUpdated)]
private void OnTTSMessageUpdated(ITTSMessageQueueEventArgs ttsArgs)
{
    Debug.Log($"TTS Message Has Been Updated : {ttsArgs.Message.Text}");
}
```

#### Dynamic Async Events

Make sure the parameter in your method matches the event type. See what parameter is required for each [User Event here](https://fullstackindie.gitbook.io/easy-code-for-vivox/api-info/easyevents.cs#user-events).  Dynamic events will dynamically invoke your method at runtime on every game object that has a dynamic event attribute. Because of this **there is no need to Subscribe/Unsubscribe from events** with the usual <mark style="color:red;">**+=/-=**</mark>

{% hint style="info" %}
**Remember to use&#x20;**<mark style="color:blue;">**async void**</mark>**&#x20;or&#x20;**<mark style="color:blue;">**async Task**</mark>**&#x20;or else the event may run synchronously**
{% endhint %}

{% hint style="warning" %}
**More information on the methods called in any async method can be found here.** [**Unity Gaming Services Examples**](https://fullstackindie.gitbook.io/easy-code-for-vivox/related-info/unity-gaming-services)**. They are direct copies from Unity's docs.&#x20;**<mark style="color:red;">**These are just examples and don't mimic real world use cases**</mark>
{% endhint %}

```csharp
[TextToSpeechEventAsync(TextToSpeechStatus.TTSMessageAdded)]
private async void  OnTTSMessageAddedAsync(ITTSMessageQueueEventArgs ttsArgs)
{
    Debug.Log($"TTS Message Has Been Added : {ttsArgs.Message.Text}");
    await SavePlayerData();
}

[TextToSpeechEventAsync(TextToSpeechStatus.TTSMessageRemoved)]
private async void  OnTTSMessageRemovedAsync(ITTSMessageQueueEventArgs ttsArgs)
{
    Debug.Log($"TTS Message Has Been Removed : {ttsArgs.Message.Text}");
    await SavePlayerData();
}

[TextToSpeechEventAsync(TextToSpeechStatus.TTSMessageUpdated)]
private async void  OnTTSMessageUpdatedAsync(ITTSMessageQueueEventArgs ttsArgs)
{
    Debug.Log($"TTS Message Has Been Updated : {ttsArgs.Message.Text}");
    await SavePlayerData();
}
```
