# SCharacterController

## Index

### Functions Index

| Function Name                                                                |
| ---------------------------------------------------------------------------- |
| SVector [**ClosestPointOnBounds** ](#closestpointonbounds)(SVector position) |
| SVector [**ClosestPoint** ](#closestpointonbounds)(SVector position)         |
| bool [**SimpleMove** ](#simplemove)(SVector speed)                           |
| int [**Move** ](#move)(SVector motion)                                       |

### Properties Index

| Property Name                                                        |
| -------------------------------------------------------------------- |
| SVector [**Center** ](#center)`get` `set`                            |
| bool [**DetectCollisions** ](#detectcollisions)`get` `set`           |
| bool [**EnableOverlapRecovery** ](#enableoverlaprecovery)`get` `set` |
| float [**Height** ](#height)`get` `set`                              |
| float [**MinMoveDistance** ](#minmovedistance)`get` `set`            |
| float [**Radius** ](#radius)`get` `set`                              |
| float [**SkinWidth** ](#skinwidth)`get` `set`                        |
| float [**SlopeLimit** ](#slopelimit)`get` `set`                      |
| float [**StepOffset** ](#stepoffset)`get` `set`                      |
| SVector [**Velocity** ](#velocity)`get`                              |

## Functions

### ClosestPointOnBounds

[SVector](https://docs.sine.space/scripting/client-scripting-api-reference/types/svector) **ClosestPointOnBounds** ([SVector](https://docs.sine.space/scripting/client-scripting-api-reference/types/svector) position)

*The closest point to the bounding box of the attached collider. This can be used to calculate hit points when applying explosion damage.*

| Parameter | Type | Description |
| --------- | ---- | ----------- |
|           |      |             |

{% tabs %}
{% tab title="Lua" %}

```lua
closestPoint = Space.Host.ExecutingObject.CharacterController.ClosestPointOnBounds(Vector.New(0,0,0))
```

{% endtab %}
{% endtabs %}

### ClosestPoint

[SVector](https://docs.sine.space/scripting/client-scripting-api-reference/types/svector) **ClosestPoint** ([SVector](https://docs.sine.space/scripting/client-scripting-api-reference/types/svector) position)

*The point on the collider that is closest to the specified location.*

| Parameter | Type | Description |
| --------- | ---- | ----------- |
|           |      |             |

{% tabs %}
{% tab title="Lua" %}

```lua
closestPoint = Space.Host.ExecutingObject.CharacterController.ClosestPoint = Vector.New(0,0,0)
```

{% endtab %}
{% endtabs %}

### SimpleMove

bool **SimpleMove** ([SVector](https://docs.sine.space/scripting/client-scripting-api-reference/types/svector) speed)

*Moves the character with speed. Velocity along the y-axis is ignored. Speed is in units/s. Gravity is automatically applied.*&#x20;

*Returns if the character is grounded.*&#x20;

*It is recommended that you make only one call to Move or SimpleMove per frame.*

| Parameter | Type | Description |
| --------- | ---- | ----------- |
|           |      |             |

{% tabs %}
{% tab title="Lua" %}

```lua
isGrounded = Space.Host.ExecutingObject.CharacterController.SimpleMove = Vector.New(100,0,0)
```

{% endtab %}
{% endtabs %}

### Move

int **Move** ([SVector](https://docs.sine.space/scripting/client-scripting-api-reference/types/svector) motion)

*Supplies the movement of a* [*SGameObject*](https://docs.sine.space/scripting/client-scripting-api-reference/types/sgameobject) *with an attached SCharacterController component.*

*The SCharacterController.Move motion moves the* [*SGameObject*](https://docs.sine.space/scripting/client-scripting-api-reference/types/sgameobject) *in the given direction. The given direction requires absolute movement delta values. A collision constrains the Move from taking place.*&#x20;

*Returns an int indicating the direction of a collision: None (0), Sides (1), Above (2), and Below (3). SCharacterController.Move does not use gravity.*

| Parameter | Type | Description |
| --------- | ---- | ----------- |
|           |      |             |

{% tabs %}
{% tab title="Lua" %}

```lua
collisionDirection = Space.Host.ExecutingObject.CharacterController.Move = Vector.New(100,0,0)
```

{% endtab %}
{% endtabs %}

## Properties

### Center

[SVector](https://docs.sine.space/scripting/client-scripting-api-reference/types/svector) **Center** `get` `set`

*Returns Center Vector value of the Character Controller.*

{% tabs %}
{% tab title="Lua" %}

```lua
Space.Host.ExecutingObject.CharacterController.Center = Vector.New(0,0,0) 
```

{% endtab %}
{% endtabs %}

### DetectCollisions

bool **DetectCollisions** `get` `set`

*Determines whether other rigidbodies or character controllers collide with this character controller (by default this is always enabled).*

*This method does not affect collisions detected during the character controller's movement but rather decides whether an incoming collider will be blocked by the controller's collider. For example, a box collider in the Scene will block the movement of the controller, but the box may still fall through the controller if detectCollisions is false. This property is useful to disable the character controller temporarily. For example, you might want to mount a character into a car and disable collision detection until it exits the car again.*

{% tabs %}
{% tab title="Lua" %}

```lua
Space.Host.CharacterController.DetectCollisions= false
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Lua" %}

```lua
--clicking this object will toggle a Character Controller's Detect Collisions property

thisObject = Space.Host.ExecutingObject
ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController --add Reference to Scripting Runtime


function OnClickFunction()
ccontroller.DetectCollisions = not ccontroller.DetectCollisions
end

thisObject.AddClickable()
thisObject.Clickable.OnClick(OnClickFunction)
```

{% endtab %}
{% endtabs %}

### EnableOverlapRecovery

bool **EnableOverlapRecovery** `get` `set`

*Enables or disables overlap recovery. Enables or disables overlap recovery. Used to depenetrate character controllers from static objects when an overlap is detected.*

*Overlap recovery can be used to depenetrate character controllers (CCTs) from static objects when an overlap is detected. This can happen in three main cases:*

*- when the CCT is directly spawned or teleported in another object*

*- when the CCT algorithm fails due to limited FPU accuracy*

*- when the "up vector" is modified, making the rotated CCT shape overlap surrounding objects*

*When activated, the CCT module will automatically try to resolve the penetration, and move the CCT to a safe place where it does*

*not overlap other objects anymore. This only concerns static objects, dynamic objects are ignored by overlap recovery.*

*When overlap recovery is not activated, it is possible for the CCTs to go through static objects. By default, overlap recovery is enabled.*

*Overlap recovery currently works with all geometries except heightfields.*

{% tabs %}
{% tab title="Lua" %}

```lua
Space.Host.CharacterController.EnableOverlapRecovery= false
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Lua" %}

```lua
--clicking this object will toggle a Character Controller's Enable Overlap Recovery property

thisObject = Space.Host.ExecutingObject
ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController --add Reference to Scripting Runtime


function OnClickFunction()
ccontroller.EnableOverlapRecovery = not ccontroller.EnableOverlapRecovery
end

thisObject.AddClickable()
thisObject.Clickable.OnClick(OnClickFunction)
```

{% endtab %}
{% endtabs %}

### Height

float **Height** `get` `set`

*The height of the character's capsule.*

{% tabs %}
{% tab title="Lua" %}

```lua
Space.Host.ExecutingObject.CharacterController.Height = 4
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Lua" %}

```lua
--the below script will make a slider change a Character Controller Height property
--[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component]

slider = Space.Host.GetReference("theslider").UISlider 
ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController 


OVC = function()
ccontroller.Height = (slider.Value * 10.0) -- from 0.0 to 10.0
end

slider.OnValueChanged(OVC)
```

{% endtab %}
{% endtabs %}

### MinMoveDistance

float **MinMoveDistance** `get` `set`

*Gets or sets the minimum move distance of the character controller.*

{% tabs %}
{% tab title="Lua" %}

```lua
Space.Host.ExecutingObject.CharacterController.MinMoveDistance = 3
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Lua" %}

```lua
--this script will make a slider change a Character Controller Min Move Distance property
--[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component]

slider = Space.Host.GetReference("theslider").UISlider 
ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController 


OVC = function()
ccontroller.MinMoveDistance= (slider.Value * 10.0) -- from 0.0 to 10.0
end

slider.OnValueChanged(OVC)
```

{% endtab %}
{% endtabs %}

### Radius

float **Radius** `get` `set`

*The radius of the character's capsule.*

{% tabs %}
{% tab title="Lua" %}

```lua
Space.Host.ExecutingObject.CharacterController.Radius = 5
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Lua" %}

```lua
--this script will make a slider change a Character Controller Radius property
--[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component]

slider = Space.Host.GetReference("theslider").UISlider 
ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController 


OVC = function()
ccontroller.Radius= (slider.Value * 10.0) -- from 0.0 to 10.0
end

slider.OnValueChanged(OVC)
```

{% endtab %}
{% endtabs %}

### SkinWidth

float **SkinWidth** `get` `set`

*The character's collision skin width.*

{% tabs %}
{% tab title="Lua" %}

```lua
Space.Host.ExecutingObject.CharacterController.SkinWidth = 4
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Lua" %}

```lua
--this script will make a slider change a Character Controller SkinWidth property
--[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component]

slider = Space.Host.GetReference("theslider").UISlider 
ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController 


OVC = function()
ccontroller.SkinWidth= (slider.Value * 10.0) -- from 0.0 to 10.0
end

slider.OnValueChanged(OVC)
```

{% endtab %}
{% endtabs %}

### SlopeLimit

float **SlopeLimit** `get` `set`

*The character controllers slope limit in degrees.*

{% tabs %}
{% tab title="Lua" %}

```lua
Space.Host.ExecutingObject.CharacterController.SlopeLimit= 2
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Lua" %}

```lua
--this script will make a slider change a Character Controller Slope Limit property
--[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component]

slider = Space.Host.GetReference("theslider").UISlider 
ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController 


OVC = function()
ccontroller.SlopeLimit= (slider.Value * 180.0) -- from 0.0 to 180.0
end

slider.OnValueChanged(OVC)
```

{% endtab %}
{% endtabs %}

### StepOffset

float **StepOffset** `get` `set`

*The character controllers step offset in meters.*

{% tabs %}
{% tab title="Lua" %}

```lua
Space.Host.ExecutingObject.CharacterController.StepOffset= 2
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Lua" %}

```lua
--this script will make a slider change a Character Controller Step Offset property
--[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component]

slider = Space.Host.GetReference("theslider").UISlider 
ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController 


OVC = function()
ccontroller.StepOffset= (slider.Value * 10.0) -- from 0.0 to 10.0
end

slider.OnValueChanged(OVC)
```

{% endtab %}
{% endtabs %}

### Velocity

[SVector](https://docs.sine.space/scripting/client-scripting-api-reference/types/svector) **Velocity** `get`

*The current relative velocity of the Character.*

{% tabs %}
{% tab title="Lua" %}

```lua
currentRelativeVelocity = Space.Host.ExecutingObject.CharacterController.Velocity
```

{% endtab %}
{% endtabs %}

### GameObject

[SGameObject](https://docs.sine.space/scripting/client-scripting-api-reference/types/sgameobject) **GameObject** `get`

*Returns a reference to the GameObject of this component.*

{% tabs %}
{% tab title="Lua" %}

```lua
theGameObject = Space.Host.ExecutingObject.CharacterController.GameObject
```

{% endtab %}
{% endtabs %}
