Documentation

Unity Engine


User Manual

Script Reference

Unity Engine


SetCustomShape

Sets a single shape and all associated shape vertices from the specified physicsShapeGroup into the Collider.
Read time 4 minutesLast updated 4 days ago

Definition

  • Type: Method
  • Namespace: UnityEngine
  • Assembly: UnityEngine.Physics2DModule

SetCustomShape(PhysicsShapeGroup2D, int, int)

Sets a single shape and all associated shape vertices from the specified physicsShapeGroup into the Collider.
public void SetCustomShape(PhysicsShapeGroup2D physicsShapeGroup, int srcShapeIndex, int dstShapeIndex)

Parameters

physicsShapeGroup

The PhysicsShapeGroup2D to use as the source of shapes and vertices.

srcShapeIndex

The source shape index within the physicsShapeGroup used to assign to the Collider.

dstShapeIndex

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 for more information on this behaviour.
Any existing contacts for this Collider will be recalculated during the next simulation step.

Examples

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.
public void SetCustomShape(NativeArray<PhysicsShape2D> shapes, NativeArray<Vector2> vertices, int srcShapeIndex, int dstShapeIndex)

Parameters

The array to use as the source of shapes.

The array to use as the source of vertices.

srcShapeIndex

The source shape index within the shapes array used to assign to the Collider.

dstShapeIndex

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 for more information on this behaviour.
Any existing contacts for this Collider will be recalculated during the next simulation step.

Examples

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); }}