> For the complete documentation index, see [llms.txt](https://kinematicsoup.gitbook.io/reactor/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kinematicsoup.gitbook.io/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.ksnetstatsmonitor.md).

# Class ksNetStatsMonitor

Namespace: [KS.Reactor.Client.Unity](/reactor/api-reference/ks.reactor.client.unity.md)\
Assembly: KSUnity-Source.dll

Calculates and optionally logs bandwidth and other network counts per second at regular intervals. Which stats are calculated is configurable using [CounterTypes](#KS_Reactor_Client_Unity_ksNetStatsMonitor_CounterTypes). If attached to a room object, will calculate the stats for just that room from [NetStats](/reactor/api-reference/ks.reactor.client.md#KS_Reactor_Client_ksBaseRoom_602_NetStats). Otherwise it will calculate the total stats for all rooms from [NetStats](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksservice.md#KS_Reactor_Client_ksService_NetStats). If you have other code that clears the [ksNetStats](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksnetstats.md) counters, the calculate stats will be inaccurate.

```csharp
[DisallowMultipleComponent]
public class ksNetStatsMonitor : MonoBehaviour
```

#### Inheritance

[object](https://learn.microsoft.com/dotnet/api/system.object) â† Object â† Component â† Behaviour â† MonoBehaviour â† [ksNetStatsMonitor](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.ksnetstatsmonitor.md)

#### Inherited Members

MonoBehaviour.IsInvoking(), MonoBehaviour.CancelInvoke(), MonoBehaviour.Invoke(string, float), MonoBehaviour.InvokeRepeating(string, float, float), MonoBehaviour.CancelInvoke(string), MonoBehaviour.IsInvoking(string), MonoBehaviour.StartCoroutine(string), MonoBehaviour.StartCoroutine(string, object), MonoBehaviour.StartCoroutine(IEnumerator), MonoBehaviour.StartCoroutine\_Auto(IEnumerator), MonoBehaviour.StopCoroutine(IEnumerator), MonoBehaviour.StopCoroutine(Coroutine), MonoBehaviour.StopCoroutine(string), MonoBehaviour.StopAllCoroutines(), MonoBehaviour.print(object), MonoBehaviour.destroyCancellationToken, MonoBehaviour.useGUILayout, MonoBehaviour.runInEditMode, Behaviour.enabled, Behaviour.isActiveAndEnabled, Component.GetComponent(Type), Component.GetComponent\<T>(), Component.TryGetComponent(Type, out Component), Component.TryGetComponent\<T>(out T), Component.GetComponent(string), Component.GetComponentInChildren(Type, bool), Component.GetComponentInChildren(Type), Component.GetComponentInChildren\<T>(bool), Component.GetComponentInChildren\<T>(), Component.GetComponentsInChildren(Type, bool), Component.GetComponentsInChildren(Type), Component.GetComponentsInChildren\<T>(bool), Component.GetComponentsInChildren\<T>(bool, List\<T>), Component.GetComponentsInChildren\<T>(), Component.GetComponentsInChildren\<T>(List\<T>), Component.GetComponentInParent(Type, bool), Component.GetComponentInParent(Type), Component.GetComponentInParent\<T>(bool), Component.GetComponentInParent\<T>(), Component.GetComponentsInParent(Type, bool), Component.GetComponentsInParent(Type), Component.GetComponentsInParent\<T>(bool), Component.GetComponentsInParent\<T>(bool, List\<T>), Component.GetComponentsInParent\<T>(), Component.GetComponents(Type), Component.GetComponents(Type, List\<Component>), Component.GetComponents\<T>(List\<T>), Component.GetComponents\<T>(), Component.CompareTag(string), Component.SendMessageUpwards(string, object, SendMessageOptions), Component.SendMessageUpwards(string, object), Component.SendMessageUpwards(string), Component.SendMessageUpwards(string, SendMessageOptions), Component.SendMessage(string, object), Component.SendMessage(string), Component.SendMessage(string, object, SendMessageOptions), Component.SendMessage(string, SendMessageOptions), Component.BroadcastMessage(string, object, SendMessageOptions), Component.BroadcastMessage(string, object), Component.BroadcastMessage(string), Component.BroadcastMessage(string, SendMessageOptions), Component.transform, Component.gameObject, Component.tag, Object.GetInstanceID(), Object.GetHashCode(), Object.Equals(object), Object.Instantiate(Object, Vector3, Quaternion), Object.Instantiate(Object, Vector3, Quaternion, Transform), Object.Instantiate(Object), Object.Instantiate(Object, Transform), Object.Instantiate(Object, Transform, bool), Object.Instantiate\<T>(T), Object.Instantiate\<T>(T, Vector3, Quaternion), Object.Instantiate\<T>(T, Vector3, Quaternion, Transform), Object.Instantiate\<T>(T, Transform), Object.Instantiate\<T>(T, Transform, bool), Object.Destroy(Object, float), Object.Destroy(Object), Object.DestroyImmediate(Object, bool), Object.DestroyImmediate(Object), Object.FindObjectsOfType(Type), Object.FindObjectsOfType(Type, bool), Object.FindObjectsByType(Type, FindObjectsSortMode), Object.FindObjectsByType(Type, FindObjectsInactive, FindObjectsSortMode), Object.DontDestroyOnLoad(Object), Object.DestroyObject(Object, float), Object.DestroyObject(Object), Object.FindSceneObjectsOfType(Type), Object.FindObjectsOfTypeIncludingAssets(Type), Object.FindObjectsOfType\<T>(), Object.FindObjectsByType\<T>(FindObjectsSortMode), Object.FindObjectsOfType\<T>(bool), Object.FindObjectsByType\<T>(FindObjectsInactive, FindObjectsSortMode), Object.FindObjectOfType\<T>(), Object.FindObjectOfType\<T>(bool), Object.FindFirstObjectByType\<T>(), Object.FindAnyObjectByType\<T>(), Object.FindFirstObjectByType\<T>(FindObjectsInactive), Object.FindAnyObjectByType\<T>(FindObjectsInactive), Object.FindObjectsOfTypeAll(Type), Object.FindObjectOfType(Type), Object.FindFirstObjectByType(Type), Object.FindAnyObjectByType(Type), Object.FindObjectOfType(Type, bool), Object.FindFirstObjectByType(Type, FindObjectsInactive), Object.FindAnyObjectByType(Type, FindObjectsInactive), Object.ToString(), Object.name, Object.hideFlags, [object.Equals(object)](https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals\(system-object\)), [object.Equals(object, object)](https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals\(system-object-system-object\)), [object.GetHashCode()](https://learn.microsoft.com/dotnet/api/system.object.gethashcode), [object.GetType()](https://learn.microsoft.com/dotnet/api/system.object.gettype), [object.MemberwiseClone()](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone), [object.ReferenceEquals(object, object)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals), [object.ToString()](https://learn.microsoft.com/dotnet/api/system.object.tostring)

## Fields

### CounterTypes <a href="#ks_reactor_client_unity_ksnetstatsmonitor_countertypes" id="ks_reactor_client_unity_ksnetstatsmonitor_countertypes"></a>

Flags indicating which net stats to calculate.

```csharp
[Tooltip("Which net stats to calculate.Rx = Receive, Tx = Total.")]
public ksNetStatsMonitor.CounterType CounterTypes
```

#### Field Value

[ksNetStatsMonitor](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.ksnetstatsmonitor.md).[CounterType](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.ksnetstatsmonitor/ks.reactor.client.unity.ksnetstatsmonitor.countertype.md)

### Interval <a href="#ks_reactor_client_unity_ksnetstatsmonitor_interval" id="ks_reactor_client_unity_ksnetstatsmonitor_interval"></a>

Interval in seconds to calculate net stats. The calculated bandwidth/rate will be the average over this interval. If zero or less, will calculate every frame. If changed to a value less than or equal to the amount of time since the last calculation, new stats will be calculated on the next update.

```csharp
[Tooltip("Interval in seconds to calculate net stats. The calculated bandwidth/rate will be the average over this interval. If zero or less, will calculate every frame.")]
public float Interval
```

#### Field Value

[float](https://learn.microsoft.com/dotnet/api/system.single)

### LogStats <a href="#ks_reactor_client_unity_ksnetstatsmonitor_logstats" id="ks_reactor_client_unity_ksnetstatsmonitor_logstats"></a>

Should stats be logged? Changing this value at runtime does not reset the interval timer.

```csharp
[Tooltip("Should stats be logged?")]
public bool LogStats
```

#### Field Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### MultiLine <a href="#ks_reactor_client_unity_ksnetstatsmonitor_multiline" id="ks_reactor_client_unity_ksnetstatsmonitor_multiline"></a>

Should each stat be logged on a different line, or should all stats be on one line? Not used if [LogStats](#KS_Reactor_Client_Unity_ksNetStatsMonitor_LogStats) is false.

```csharp
[Tooltip("Should each stat be logged on a different line, or should all stats be on one line?")]
public bool MultiLine
```

#### Field Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### OnUpdate <a href="#ks_reactor_client_unity_ksnetstatsmonitor_onupdate" id="ks_reactor_client_unity_ksnetstatsmonitor_onupdate"></a>

Invoked when stats are recalculated. You can use this to update network stats in your UI. The parameter is a dictionary containing the calculated counters and their values. For bandwidth types the value is in kB/s where 1 kB = 1024 bytes. For other types the value is in count/s.

```csharp
[Tooltip("Invoked when stats are recalculated. You can use this to update network stats in your UI. The parameter is a dictionary containing the calculated counters and their values. For bandwidth types the value is in kB/s where 1 kB = 1024 bytes. For other types the value is in count/s.")]
public UnityEvent<Dictionary<ksNetStatsMonitor.CounterType, float>> OnUpdate
```

#### Field Value

UnityEvent<[Dictionary](https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2)<[ksNetStatsMonitor](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.ksnetstatsmonitor.md).[CounterType](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.ksnetstatsmonitor/ks.reactor.client.unity.ksnetstatsmonitor.countertype.md), [float](https://learn.microsoft.com/dotnet/api/system.single)>>

## Properties

### IsGlobal <a href="#ks_reactor_client_unity_ksnetstatsmonitor_isglobal" id="ks_reactor_client_unity_ksnetstatsmonitor_isglobal"></a>

Is this script calculating the total statistics for all rooms?

```csharp
public bool IsGlobal { get; }
```

#### Property Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

## Methods

### UpdateStats() <a href="#ks_reactor_client_unity_ksnetstatsmonitor_updatestats" id="ks_reactor_client_unity_ksnetstatsmonitor_updatestats"></a>

Calculates updated stats, logs them if [LogStats](#KS_Reactor_Client_Unity_ksNetStatsMonitor_LogStats) is true, and invokes [OnUpdate](#KS_Reactor_Client_Unity_ksNetStatsMonitor_OnUpdate).

```csharp
public void UpdateStats()
```
