> 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.kspredictor.md).

# Class ksPredictor

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

Base class for developers to write custom predictors for smoothing object movement and property data. Predictors are scriptable objects. You must create an asset from a predictor (Create > Reactor > PredictorClassName) to use it, then assign it to an entity component or the room type to make it the default predictor.

```csharp
public abstract class ksPredictor : ScriptableObject, ksIPredictor
```

#### Inheritance

[object](https://learn.microsoft.com/dotnet/api/system.object) â† Object â† ScriptableObject â† [ksPredictor](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.kspredictor.md)

#### Derived

[ksClientInputPredictorAsset](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.ksclientinputpredictorasset.md), [ksConvergingInputPredictorAsset](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.ksconverginginputpredictorasset.md), [ksLinearPredictorAsset](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.kslinearpredictorasset.md)

#### Implements

[ksIPredictor](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksipredictor.md)

#### Inherited Members

ScriptableObject.SetDirty(), ScriptableObject.CreateInstance(string), ScriptableObject.CreateInstance(Type), ScriptableObject.CreateInstance\<T>(), 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)

## Constructors

### ksPredictor() <a href="#ks_reactor_client_unity_kspredictor__ctor" id="ks_reactor_client_unity_kspredictor__ctor"></a>

Constructor

```csharp
public ksPredictor()
```

## Properties

### Controller <a href="#ks_reactor_client_unity_kspredictor_controller" id="ks_reactor_client_unity_kspredictor_controller"></a>

The player controller for the [Entity](#KS_Reactor_Client_Unity_ksPredictor_Entity). Null if the entity has no controller or the controller has [UseInputPrediction](/reactor/api-reference/ks.reactor/ks.reactor.ksplayercontroller.md#KS_Reactor_ksPlayerController_UseInputPrediction) set to false.

```csharp
public ksPlayerController Controller { get; }
```

#### Property Value

[ksPlayerController](/reactor/api-reference/ks.reactor/ks.reactor.ksplayercontroller.md)

### Entity <a href="#ks_reactor_client_unity_kspredictor_entity" id="ks_reactor_client_unity_kspredictor_entity"></a>

The entity we are predicting movement for. Null if predicting room or player properties.

```csharp
public ksEntity Entity { get; }
```

#### Property Value

[ksEntity](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.ksentity.md)

### Player <a href="#ks_reactor_client_unity_kspredictor_player" id="ks_reactor_client_unity_kspredictor_player"></a>

The player we are predicting properties for. Null if not predicting player properties.

```csharp
public ksPlayer Player { get; }
```

#### Property Value

[ksPlayer](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.ksplayer.md)

### RequiresController <a href="#ks_reactor_client_unity_kspredictor_requirescontroller" id="ks_reactor_client_unity_kspredictor_requirescontroller"></a>

Does the predictor require a player controller?

```csharp
public virtual bool RequiresController { get; }
```

#### Property Value

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

### Room <a href="#ks_reactor_client_unity_kspredictor_room" id="ks_reactor_client_unity_kspredictor_room"></a>

The room.

```csharp
public ksRoom Room { get; }
```

#### Property Value

[ksRoom](/reactor/api-reference/ks.reactor.client.unity/ks.reactor.client.unity.ksroom.md)

### Time <a href="#ks_reactor_client_unity_kspredictor_time" id="ks_reactor_client_unity_kspredictor_time"></a>

Server and local time data.

```csharp
public ksClientTime Time { get; }
```

#### Property Value

[ksClientTime](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksclienttime.md)

## Methods

### ClientUpdate(ksTransformState, Dictionary\<uint, ksMultiType>) <a href="#ks_reactor_client_unity_kspredictor_clientupdate_ks_reactor_kstransformstate_system_collections_gene" id="ks_reactor_client_unity_kspredictor_clientupdate_ks_reactor_kstransformstate_system_collections_gene"></a>

Called once per client render frame to update the client transform and smoothed properties.

```csharp
public virtual bool ClientUpdate(ksTransformState state, Dictionary<uint, ksMultiType> properties)
```

#### Parameters

`state` [ksTransformState](/reactor/api-reference/ks.reactor/ks.reactor.kstransformstate.md)

Client transform to update with new values. Null if not smoothing a transform.

`properties` [Dictionary](https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2)<[uint](https://learn.microsoft.com/dotnet/api/system.uint32), [ksMultiType](/reactor/api-reference/ks.reactor/ks.reactor.ksmultitype.md)>

Smoothed client properties to update with new values. Null if there are no smoothed properties.

#### Returns

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

If false, this function will not be called again until the server transform or a server property changes.

### CreateInstance() <a href="#ks_reactor_client_unity_kspredictor_createinstance" id="ks_reactor_client_unity_kspredictor_createinstance"></a>

Creates an instance of the predictor. Return null to disable prediction.

```csharp
public virtual ksIPredictor CreateInstance()
```

#### Returns

[ksIPredictor](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksipredictor.md)

Predictor instance.

### Detached() <a href="#ks_reactor_client_unity_kspredictor_detached" id="ks_reactor_client_unity_kspredictor_detached"></a>

Called when the predictor is removed. Clears the entity/room reference.

```csharp
public virtual void Detached()
```

### Disabled() <a href="#ks_reactor_client_unity_kspredictor_disabled" id="ks_reactor_client_unity_kspredictor_disabled"></a>

Called when the predictor is disabled. May be called zero or more times. Called before [Detached](#KS_Reactor_Client_Unity_ksPredictor_Detached). When an entity switches between the [NonInputPredictor](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseentity.md#KS_Reactor_Client_ksBaseEntity_NonInputPredictor) and [InputPredictor](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseentity.md#KS_Reactor_Client_ksBaseEntity_InputPredictor), this is called on the one that was switched off.

```csharp
public virtual void Disabled()
```

### Enabled() <a href="#ks_reactor_client_unity_kspredictor_enabled" id="ks_reactor_client_unity_kspredictor_enabled"></a>

Called when the predictor is enabled. May be called zero or more times. Called after Initialize(ksBaseRoom, ksBaseEntity). When an entity switches between the [NonInputPredictor](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseentity.md#KS_Reactor_Client_ksBaseEntity_NonInputPredictor) and [InputPredictor](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseentity.md#KS_Reactor_Client_ksBaseEntity_InputPredictor), this is called on the one that was switched to.

```csharp
public virtual void Enabled()
```

### Initialize(ksBaseRoom, ksBaseEntity, ksBasePlayer) <a href="#ks_reactor_client_unity_kspredictor_initialize_ks_reactor_client_ksbaseroom_ks_reactor_client_ksbase" id="ks_reactor_client_unity_kspredictor_initialize_ks_reactor_client_ksbaseroom_ks_reactor_client_ksbase"></a>

Initializes the predictor.

```csharp
public bool Initialize(ksBaseRoom room, ksBaseEntity entity, ksBasePlayer player)
```

#### Parameters

`room` [ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md)

The room object.

`entity` [ksBaseEntity](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseentity.md)

Entity the predictor is smoothing. Null if the predictor is smoothing room or player properties.

`player` [ksBasePlayer](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseplayer.md)

Player the predictor is smoothing properties for. Null if the predictor is not smoothing player properties.

#### Returns

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

False if the predictor could not be initialized and needs to be removed.

### Initialize() <a href="#ks_reactor_client_unity_kspredictor_initialize" id="ks_reactor_client_unity_kspredictor_initialize"></a>

Initializes the predictor.

```csharp
public virtual bool Initialize()
```

#### Returns

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

False if the predictor could not be initialized and needs to be removed.

### InputUpdate(ksInput) <a href="#ks_reactor_client_unity_kspredictor_inputupdate_ks_reactor_ksinput" id="ks_reactor_client_unity_kspredictor_inputupdate_ks_reactor_ksinput"></a>

Called when a new frame of input is generated. Only called for entities with player controllers.

```csharp
public virtual void InputUpdate(ksInput input)
```

#### Parameters

`input` [ksInput](/reactor/api-reference/ks.reactor/ks.reactor.ksinput.md)

Input

### IsPredictedProperty(uint) <a href="#ks_reactor_client_unity_kspredictor_ispredictedproperty_system_uint32" id="ks_reactor_client_unity_kspredictor_ispredictedproperty_system_uint32"></a>

Does the predictor predict the property value with the given `propertyId`?

```csharp
public virtual bool IsPredictedProperty(uint propertyId)
```

#### Parameters

`propertyId` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)

Property id

#### Returns

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

True if the predictor predicts the property value.

### ParentChange(ksBaseEntity, ksBaseEntity) <a href="#ks_reactor_client_unity_kspredictor_parentchange_ks_reactor_client_ksbaseentity_ks_reactor_client_ks" id="ks_reactor_client_unity_kspredictor_parentchange_ks_reactor_client_ksbaseentity_ks_reactor_client_ks"></a>

Invoked when the Entity parent changes. This method should correct predicted values by converting the positions back to world positions for the removal of the old parent and then to the local position for the new parent.

```csharp
public virtual void ParentChange(ksBaseEntity oldParent, ksBaseEntity newParent)
```

#### Parameters

`oldParent` [ksBaseEntity](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseentity.md)

Parent entity being removed.

`newParent` [ksBaseEntity](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseentity.md)

Parent entity being added.

### ServerUpdate(ksReadOnlyTransformState, Dictionary\<uint, ksMultiType>, bool, bool) <a href="#ks_reactor_client_unity_kspredictor_serverupdate_ks_reactor_ksreadonlytransformstate_system_collecti" id="ks_reactor_client_unity_kspredictor_serverupdate_ks_reactor_ksreadonlytransformstate_system_collecti"></a>

Called once per server frame. Perform any relevant calculations with server frame data here, and/or store the relevant server frame data to be used in calculating future client state in [ClientUpdate](#KS_Reactor_Client_Unity_ksPredictor_ClientUpdate_KS_Reactor_ksTransformState_2cSystem_Collections_Generic_Dictionary_7bSystem_UInt32_2cKS_Reactor_ksMultiType_7d_).

```csharp
public virtual bool ServerUpdate(ksReadOnlyTransformState state, Dictionary<uint, ksMultiType> properties, bool teleport, bool idle)
```

#### Parameters

`state` [ksReadOnlyTransformState](/reactor/api-reference/ks.reactor/ks.reactor.ksreadonlytransformstate.md)

Server transform data. Null if not smoothing a transform.

`properties` [Dictionary](https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2)<[uint](https://learn.microsoft.com/dotnet/api/system.uint32), [ksMultiType](/reactor/api-reference/ks.reactor/ks.reactor.ksmultitype.md)>

Smoothed properties whose values changed since the last frame. Null if no properties have changed.

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

Did the entity teleport?

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

True if there were no transform or property changes since the last frame.

#### Returns

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

If false and `idle` is true, this function will not be called again until the server transform or a server property changes.
