版本: Unity 6 (6000.0)
语言英语
  • C#

CustomCollider2D.SetCustomShape

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交的内容,但我们会阅读用户提出的每项更改建议,并在适用时进行更新。

关闭

提交失败

由于某些原因,您的更改建议无法提交。请 <a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public void SetCustomShape(PhysicsShapeGroup2D physicsShapeGroup, int srcShapeIndex, int dstShapeIndex);

参数

physicsShapeGroup 将用作形状和顶点来源的 PhysicsShapeGroup2D
srcShapeIndex physicsShapeGroup 中用于分配给碰撞器的源形状索引。
dstShapeIndex 在碰撞器中用于复制源形状的目标形状索引。

描述

从指定的 physicsShapeGroup 中将单个形状和所有关联的形状顶点设置到碰撞器中。

设置单个形状允许替换碰撞器中的单个形状。在可能的情况下,碰撞器将减少分配形状所需的工量。有关此行为的更多信息,请参阅 GetCustomShapes

此碰撞器的任何现有接触将在下一个模拟步骤中重新计算。

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

声明

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

参数

shapes 将用作形状来源的数组。
vertices 将用作顶点来源的数组。
srcShapeIndex shapes 数组中用于分配给碰撞器的源形状索引。
dstShapeIndex 在碰撞器中用于复制源形状的目标形状索引。

描述

从指定的形状和顶点数组中将单个形状和所有关联的形状顶点设置到碰撞器中。

设置单个形状允许替换碰撞器中的单个形状。在可能的情况下,碰撞器将减少分配形状所需的工量。有关此行为的更多信息,请参阅 GetCustomShapes

此碰撞器的任何现有接触将在下一个模拟步骤中重新计算。

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