---
name: ValueCurve
last_updated: 2026-06-10T23:09:12Z
inherits:
  - Instance
  - Object
type: class
memory_category: Instances
summary: "A sorted list of time-value pairs that define a curve. Used to animate a any type of value."
---

# Class: ValueCurve

> A sorted list of time-value pairs that define a curve. Used to animate a any
> type of value.

## Description

An instance representing a 1D value curve encoded via a sorted list of
[ValueCurveKeys](/docs/reference/engine/datatypes/ValueCurveKey.md). The shape of the interpolation curve
between two keys is determined by the [ValueCurveKey.Interpolation](/docs/reference/engine/datatypes/ValueCurveKey.md)
type.

Not all value types (for example, strings and other non-numerical types) may
perform [Linear](/docs/reference/engine/enums/KeyInterpolationMode.md) or
[Cubic](/docs/reference/engine/enums/KeyInterpolationMode.md) interpolation. These types will revert
to [Constant](/docs/reference/engine/enums/KeyInterpolationMode.md) interpolation if necessary.

## Properties

### Property: ValueCurve.Length

```json
{
  "type": "int",
  "access": "ReadWrite",
  "security": {
    "read": "None",
    "write": "None"
  },
  "serialization": {
    "can_load": false,
    "can_save": true
  },
  "thread_safety": "ReadSafe",
  "category": "Data",
  "capabilities": [
    "Basic"
  ]
}
```

Number of keys in the value curve.

### Property: ValueCurve.ValueType

```json
{
  "type": "string",
  "access": "ReadWrite",
  "security": {
    "read": "None",
    "write": "None"
  },
  "serialization": {
    "can_load": false,
    "can_save": true
  },
  "thread_safety": "ReadSafe",
  "category": "Data",
  "capabilities": [
    "Basic"
  ]
}
```

Read-only value indicating the type held in this curve, or the string
`"Nil"` if there are no keys.

## Methods

### Method: ValueCurve:GetKeyAtIndex

**Signature:** `ValueCurve:GetKeyAtIndex(index: int): ValueCurveKey`

Returns a copy of a key at a given index.

*Security: None · Thread Safety: Unsafe · Capabilities: Basic*

**Parameters:**

| Name | Type | Default | Description |
|------|------|---------|-------------|
| `index` | `int` |  | The index in the existing set of keys held by this [ValueCurve](/docs/reference/engine/classes/ValueCurve.md). |

**Returns:** `ValueCurveKey`

### Method: ValueCurve:GetKeyIndicesAtTime

**Signature:** `ValueCurve:GetKeyIndicesAtTime(time: float): Array`

The first item in the returned array is the index of the last key with
time less than or equal to `time` (or the lesser of either `1` or the
curve length if no key was found). The second item in the returned array
is the index of the first key with time greater than or equal to `time`
(or the curve length if no key was found satisfying the inequality).

*Security: None · Thread Safety: Unsafe · Capabilities: Basic*

**Parameters:**

| Name | Type | Default | Description |
|------|------|---------|-------------|
| `time` | `float` |  | A time during the animation. Inputs will be clamped between `0` and the time of the last key held by this [ValueCurve](/docs/reference/engine/classes/ValueCurve.md). |

**Returns:** `Array`

### Method: ValueCurve:GetKeys

**Signature:** `ValueCurve:GetKeys(): Array`

Returns a copy of all the keys in the [ValueCurve](/docs/reference/engine/classes/ValueCurve.md) as a Luau array
of [ValueCurveKeys](/docs/reference/engine/datatypes/ValueCurveKey.md).

*Security: None · Thread Safety: Unsafe · Capabilities: Basic*

**Returns:** `Array` — Array of [ValueCurveKeys](/docs/reference/engine/datatypes/ValueCurveKey.md).

### Method: ValueCurve:GetValueAtTime

**Signature:** `ValueCurve:GetValueAtTime(time: float): Variant?`

Samples the value curve at a given time passed as argument.

*Security: None · Thread Safety: Unsafe · Capabilities: Basic*

**Parameters:**

| Name | Type | Default | Description |
|------|------|---------|-------------|
| `time` | `float` |  | Time at which to sample the curve. |

**Returns:** `Variant?` — Value of the curve at the requested `time`.

### Method: ValueCurve:InsertKey

**Signature:** `ValueCurve:InsertKey(key: ValueCurveKey): Array`

Adds the key passed as an argument to this curve. If a key at the same
time is found, it will be replaced. In the returned array, the first value
is `true` if a key was added or `false` if a previous key was replaced;
the second value is the index at which the marker was added.

If there are not yet any keys, then the key may be added. If keys exist,
the type of the value must match those of existing keys; otherwise a
message is printed and `{false, -1}` is returned.

*Security: None · Thread Safety: Unsafe · Capabilities: Basic*

**Parameters:**

| Name | Type | Default | Description |
|------|------|---------|-------------|
| `key` | `ValueCurveKey` |  | [ValueCurveKey](/docs/reference/engine/datatypes/ValueCurveKey.md) to insert. |

**Returns:** `Array` — (see description)

### Method: ValueCurve:InsertKeyValue

**Signature:** `ValueCurve:InsertKeyValue(time: float, value: Variant, Interpolation: KeyInterpolationMode): Array`

Creates a [ValueCurveKey](/docs/reference/engine/datatypes/ValueCurveKey.md) from the given arguments and inserts it
in this curve. If a key at the same time is found, it will be replaced. In
the returned array, the first value is `true` if a key was added or
`false` if a previous key was replaced; the second value is the index at
which the marker was added.

If there are not yet any keys, then the key may be added. If keys exist,
the type of the value must match those of existing keys; otherwise a
message is printed and `{false, -1}` is returned.

*Security: None · Thread Safety: Unsafe · Capabilities: Basic*

**Parameters:**

| Name | Type | Default | Description |
|------|------|---------|-------------|
| `time` | `float` |  | Time at which to insert the new [ValueCurveKey](/docs/reference/engine/datatypes/ValueCurveKey.md). - type: number |
| `value` | `Variant` |  | Value of the inserted [ValueCurveKey](/docs/reference/engine/datatypes/ValueCurveKey.md). - type: any |
| `Interpolation` | `KeyInterpolationMode` |  | Interpolation mode of the inserted [ValueCurveKey](/docs/reference/engine/datatypes/ValueCurveKey.md). - type: KeyInterpolationMode |

**Returns:** `Array` — (see description)

### Method: ValueCurve:RemoveKeyAtIndex

**Signature:** `ValueCurve:RemoveKeyAtIndex(startingIndex: int, count?: int): int`

Removes a given number (`count`) of keys starting from the `startingIndex`
index and returns the number of keys that were removed.

*Security: None · Thread Safety: Unsafe · Capabilities: Basic*

**Parameters:**

| Name | Type | Default | Description |
|------|------|---------|-------------|
| `startingIndex` | `int` |  | Starting index from which to remove keys. |
| `count` | `int` | `1` | Number of keys to remove. |

**Returns:** `int` — Number of keys removed.

### Method: ValueCurve:SetKeys

**Signature:** `ValueCurve:SetKeys(keys: Array): int`

Resets this curve's keys using the [ValueCurveKey](/docs/reference/engine/datatypes/ValueCurveKey.md) array passed
as an argument. Keys in the `keys` array are sorted in ascending time
order before insertion, and keys at duplicated times are removed in a
stable manner.

Returns the number of keys actually inserted. Keys previously stored in
this curve are removed before the keys passed as arguments are added.

The keys must all contain values of the same type. And that type must
match any existing keys. Otherwise a message is printed, the keys are not
added, and `0` is returned.

*Security: None · Thread Safety: Unsafe · Capabilities: Basic*

**Parameters:**

| Name | Type | Default | Description |
|------|------|---------|-------------|
| `keys` | `Array` |  | Array of [ValueCurveKeys](/docs/reference/engine/datatypes/ValueCurveKey.md). |

**Returns:** `int` — Number of keys inserted.

## Inherited Members

### From [Instance](/docs/reference/engine/classes/Instance.md)

- **Property `Archivable`** (`boolean`): Determines if an Instance and its descendants can be cloned using
- **Property `archivable`** (`boolean`):  *(deprecated, hidden)*
- **Property `Capabilities`** (`SecurityCapabilities`): The set of capabilities allowed to be used for scripts inside this
- **Property `Name`** (`string`): A non-unique identifier of the Instance.
- **Property `Parent`** (`Instance`): Determines the hierarchical parent of the Instance.
- **Property `PredictionMode`** (`PredictionMode`): 
- **Property `RobloxLocked`** (`boolean`): A deprecated property that used to protect CoreGui objects. *(hidden)*
- **Property `Sandboxed`** (`boolean`): When enabled, the instance can only access abilities in its `Capabilities`
- **Property `UniqueId`** (`UniqueId`): A unique identifier for the instance.
- **Method `AddTag(tag: string): ()`**: Applies a tag to the instance.
- **Method `children(): Instances`**: Returns an array of the object's children. *(deprecated)*
- **Method `ClearAllChildren(): ()`**: This method destroys all of an instance's children.
- **Method `Clone(): Instance`**: Create a copy of an instance and all its descendants, ignoring instances
- **Method `clone(): Instance`**:  *(deprecated)*
- **Method `Destroy(): ()`**: Sets the Instance.Parent property to `nil`, locks the
- **Method `destroy(): ()`**:  *(deprecated)*
- **Method `FindFirstAncestor(name: string): Instance?`**: Returns the first ancestor of the Instance whose
- **Method `FindFirstAncestorOfClass(className: string): Instance?`**: Returns the first ancestor of the Instance whose
- **Method `FindFirstAncestorWhichIsA(className: string): Instance?`**: Returns the first ancestor of the Instance for whom
- **Method `FindFirstChild(name: string, recursive?: boolean): Instance?`**: Returns the first child of the Instance found with the given name.
- **Method `findFirstChild(name: string, recursive?: boolean): Instance`**:  *(deprecated)*
- **Method `FindFirstChildOfClass(className: string): Instance?`**: Returns the first child of the Instance whose
- **Method `FindFirstChildWhichIsA(className: string, recursive?: boolean): Instance?`**: Returns the first child of the Instance for whom
- **Method `FindFirstDescendant(name: string): Instance?`**: Returns the first descendant found with the given Instance.Name.
- **Method `GetActor(): Actor?`**: Returns the Actor associated with the Instance, if any.
- **Method `GetAttribute(attribute: string): Variant`**: Returns the value which has been assigned to the given attribute name.
- **Method `GetAttributeChangedSignal(attribute: string): RBXScriptSignal`**: Returns an event that fires when the given attribute changes.
- **Method `GetAttributes(): Dictionary`**: Returns a dictionary of the instance's attributes.
- **Method `GetChildren(): Instances`**: Returns an array containing all of the instance's children.
- **Method `getChildren(): Instances`**:  *(deprecated)*
- **Method `GetDebugId(scopeLength?: int): string`**: Returns a coded string of the debug ID used internally by Roblox.
- **Method `GetDescendants(): Instances`**: Returns an array containing all of the descendants of the instance.
- **Method `GetFullName(): string`**: Returns a string describing the instance's ancestry.
- **Method `GetStyled(name: string, selector: string?): Variant`**: Returns the styled or explicitly modified value of the specified property,
- **Method `GetStyledPropertyChangedSignal(property: string): RBXScriptSignal`**: 
- **Method `GetTags(): Array`**: Gets an array of all tags applied to the instance.
- **Method `HasTag(tag: string): boolean`**: Check whether the instance has a given tag.
- **Method `IsAncestorOf(descendant: Instance): boolean`**: Returns true if an Instance is an ancestor of the given
- **Method `IsDescendantOf(ancestor: Instance): boolean`**: Returns `true` if an Instance is a descendant of the given
- **Method `isDescendantOf(ancestor: Instance): boolean`**:  *(deprecated)*
- **Method `IsPropertyModified(property: string): boolean`**: Returns `true` if the value stored in the specified property is not equal
- **Method `QueryDescendants(selector: string): Instances`**: 
- **Method `Remove(): ()`**: Sets the object's `Parent` to `nil`, and does the same for all its *(deprecated)*
- **Method `remove(): ()`**:  *(deprecated)*
- **Method `RemoveTag(tag: string): ()`**: Removes a tag from the instance.
- **Method `ResetPropertyToDefault(property: string): ()`**: Resets a property to its default value.
- **Method `SetAttribute(attribute: string, value: Variant): ()`**: Sets the attribute with the given name to the given value.
- **Method `WaitForChild(childName: string, timeOut: double): Instance`**: Returns the child of the Instance with the given name. If the
- **Event `AncestryChanged`**: Fires when the Instance.Parent property of this object or one of
- **Event `AttributeChanged`**: Fires whenever an attribute is changed on the Instance.
- **Event `ChildAdded`**: Fires after an object is parented to this Instance.
- **Event `childAdded`**:  *(deprecated)*
- **Event `ChildRemoved`**: Fires after a child is removed from this Instance.
- **Event `DescendantAdded`**: Fires after a descendant is added to the Instance.
- **Event `DescendantRemoving`**: Fires immediately before a descendant of the Instance is removed.
- **Event `Destroying`**: Fires immediately before (or is deferred until after) the instance is
- **Event `StyledPropertiesChanged`**: Fires whenever any style property is changed on the instance, including

### From [Object](/docs/reference/engine/classes/Object.md)

- **Property `ClassName`** (`string`): A read-only string representing the class this Object belongs to.
- **Property `className`** (`string`):  *(deprecated)*
- **Method `GetPropertyChangedSignal(property: string): RBXScriptSignal`**: Get an event that fires when a given property of the object changes.
- **Method `IsA(className: string): boolean`**: Returns true if an object's class matches or inherits from a given class.
- **Method `isA(className: string): boolean`**:  *(deprecated)*
- **Event `Changed`**: Fires immediately after a property of the object changes, with some