# SetCustomShape

> Sets a single shape and all associated shape vertices from the specified physicsShapeGroup into the Collider.

## Definition

* **Type:** Method
* **Namespace:** [UnityEngine](/engine/6000.0/script-reference/unityengine.md)
* **Assembly:** UnityEngine.Physics2DModule

## SetCustomShape(PhysicsShapeGroup2D, int, int)

Sets a single shape and all associated shape vertices from the specified physicsShapeGroup into the Collider.

```csharp
public void SetCustomShape(PhysicsShapeGroup2D physicsShapeGroup, int srcShapeIndex, int dstShapeIndex)
```

### Parameters

**** (\[PhysicsShapeGroup2D]\(/engine/6000.0/script-reference/unityengine/physicsshapegroup2d)): The [PhysicsShapeGroup2D](/engine/6000.0/script-reference/unityengine/physicsshapegroup2d.md) to use as the source of shapes and vertices.**** (\[int]\(https\://learn.microsoft.com/dotnet/api/system.int32)): The source shape index within the physicsShapeGroup used to assign to the Collider.**** (\[int]\(https\://learn.microsoft.com/dotnet/api/system.int32)): The destination shape index within the Collider to copy the source shape to.

### Remarks

Setting a single shape allows replacing individual shapes within the Collider. Where possible, the Collider will reduce the amount of work required to assign the shape. See [GetCustomShapes](/engine/6000.0/script-reference/unityengine/customcollider2d/getcustomshapes.md) for more information on this behaviour.

Any existing contacts for this Collider will be recalculated during the next simulation step.

### Examples

```csharp
using UnityEngine;
using UnityEngine.Assertions;

public class Example : MonoBehaviour
{
    void Start()
    {
        // Fetch the custom collider.
        var customCollider = GetComponent<CustomCollider2D>();

        // Create an input shape group.
        var inputShapeGroup = new PhysicsShapeGroup2D();

        // Add 5 Circles to the shape group.
        inputShapeGroup.AddCircle(center: Vector2.zero,  radius: 0.5f);
        inputShapeGroup.AddCircle(center: Vector2.zero,  radius: 0.6f);
        inputShapeGroup.AddCircle(center: Vector2.zero,  radius: 0.7f);
        inputShapeGroup.AddCircle(center: Vector2.zero,  radius: 0.8f);
        inputShapeGroup.AddCircle(center: Vector2.zero,  radius: 0.9f);

        // Assign our shapes.
        customCollider.SetCustomShapes(inputShapeGroup);

        // Validate the contents of the custom collider.
        Assert.AreEqual(5, customCollider.customShapeCount);

        // Transfer the last shape in the shape group to the first in the custom collider.
        customCollider.SetCustomShape(inputShapeGroup, srcShapeIndex: 4, dstShapeIndex: 0);

        // Create an output shape group.
        var outputShapeGroup = new PhysicsShapeGroup2D();

        // Get all the custom shapes.
        var shapeCount = customCollider.GetCustomShapes(outputShapeGroup);

        // Validate the results.
        Assert.AreEqual(5, shapeCount);
        Assert.AreEqual(5, customCollider.customShapeCount);
        Assert.AreApproximatelyEqual(0.9f, outputShapeGroup.GetShape(shapeIndex: 0).radius);
        Assert.AreApproximatelyEqual(0.6f, outputShapeGroup.GetShape(shapeIndex: 1).radius);
        Assert.AreApproximatelyEqual(0.7f, outputShapeGroup.GetShape(shapeIndex: 2).radius);
        Assert.AreApproximatelyEqual(0.8f, outputShapeGroup.GetShape(shapeIndex: 3).radius);
        Assert.AreApproximatelyEqual(0.9f, outputShapeGroup.GetShape(shapeIndex: 4).radius);
    }
}
```

## SetCustomShape(NativeArray\<PhysicsShape2D>, NativeArray\<Vector2>, int, int)

Sets a single shape and all associated shape vertices from the specified shape and vertices arrays into the Collider.

```csharp
public void SetCustomShape(NativeArray<PhysicsShape2D> shapes, NativeArray<Vector2> vertices, int srcShapeIndex, int dstShapeIndex)
```

### Parameters

**** (\[NativeArray\<PhysicsShape2D>]\(/engine/6000.0/script-reference/unity/collections/nativearray1)): The array to use as the source of shapes.**** (\[NativeArray\<Vector2>]\(/engine/6000.0/script-reference/unity/collections/nativearray1)): The array to use as the source of vertices.**** (\[int]\(https\://learn.microsoft.com/dotnet/api/system.int32)): The source shape index within the shapes array used to assign to the Collider.**** (\[int]\(https\://learn.microsoft.com/dotnet/api/system.int32)): The destination shape index within the Collider to copy the source shape to.

### Remarks

Setting a single shape allows replacing individual shapes within the Collider. Where possible, the Collider will reduce the amount of work required to assign the shape. See [GetCustomShapes](/engine/6000.0/script-reference/unityengine/customcollider2d/getcustomshapes.md) for more information on this behaviour.

Any existing contacts for this Collider will be recalculated during the next simulation step.

### Examples

```csharp
using Unity.Collections;
using UnityEngine;
using UnityEngine.Assertions;

public class Example : MonoBehaviour
{
    void Start()
    {
        // Create a native shapes array and populate it with a Circle and Capsule.
        var shapes = new NativeArray<PhysicsShape2D>(2, Allocator.Temp)
        {
            [0] = new PhysicsShape2D() { shapeType = PhysicsShapeType2D.Circle, radius = 0.5f, vertexStartIndex = 0, vertexCount = 1 },
            [1] = new PhysicsShape2D() { shapeType = PhysicsShapeType2D.Circle, radius = 0.6f, vertexStartIndex = 1, vertexCount = 1 },
            [2] = new PhysicsShape2D() { shapeType = PhysicsShapeType2D.Circle, radius = 0.7f, vertexStartIndex = 2, vertexCount = 1 },
            [3] = new PhysicsShape2D() { shapeType = PhysicsShapeType2D.Circle, radius = 0.8f, vertexStartIndex = 3, vertexCount = 1 },
            [4] = new PhysicsShape2D() { shapeType = PhysicsShapeType2D.Circle, radius = 0.9f, vertexStartIndex = 4, vertexCount = 1 },
        };

        // Create a native vertices array and populate it with the vertices for the shapes.
        var vertices = new NativeArray<Vector2>(3, Allocator.Temp)
        {
            [0] = Vector2.zero,
            [1] = Vector2.zero,
            [2] = Vector2.zero,
            [3] = Vector2.zero,
            [4] = Vector2.zero,
        };

        // Fetch the custom collider.
        var customCollider = GetComponent<CustomCollider2D>();

        // Assign all our test shapes.
        customCollider.SetCustomShapes(shapes, vertices);

        // Assign the last shape to the first shape.
        customCollider.SetCustomShape(shapes, vertices, srcShapeIndex: 4, dstShapeIndex: 0);

        // Get all the custom shapes.
        var outputShapeGroup = new PhysicsShapeGroup2D();
        var shapeCount = customCollider.GetCustomShapes(outputShapeGroup);

        // Validate the results.
        Assert.AreEqual(5, shapeCount);
        Assert.AreEqual(5, customCollider.customShapeCount);
        Assert.AreApproximatelyEqual(0.9f, outputShapeGroup.GetShape(shapeIndex: 0).radius);
        Assert.AreApproximatelyEqual(0.6f, outputShapeGroup.GetShape(shapeIndex: 1).radius);
        Assert.AreApproximatelyEqual(0.7f, outputShapeGroup.GetShape(shapeIndex: 2).radius);
        Assert.AreApproximatelyEqual(0.8f, outputShapeGroup.GetShape(shapeIndex: 3).radius);
        Assert.AreApproximatelyEqual(0.9f, outputShapeGroup.GetShape(shapeIndex: 4).radius);
    }
}
```
