physicsShapeGroup | 用作形状和顶点来源的 PhysicsShapeGroup2D。 |
将碰撞体中的所有形状和顶点设置为指定 PhysicsShapeGroup2D 所表示的形状和顶点。
所有现有的形状和顶点都将被指定 PhysicsShapeGroup2D 中包含的形状和顶点替换。
在可能的情况下,碰撞体将减少分配指定形状和顶点所需的工作量。碰撞体检查每个形状索引处分配的 PhysicsShape2D,如果碰撞体已经包含相同的物理形状,则不执行任何操作。如果物理形状具有相同的 形状类型 和 顶点数量,则现有的物理引擎形状将仅更新其 半径 和 顶点。如果物理形状具有不同的 形状类型 或 顶点数量,则物理引擎形状将被重新创建。
此碰撞体的任何现有接触将在下一个模拟步骤中重新计算。
using UnityEngine;
public class Example : MonoBehaviour { void Start() { // Fetch the custom collider. var customCollider = GetComponent<CustomCollider2D>();
// Create a shape group. var shapeGroup = new PhysicsShapeGroup2D();
// Add a Circle to the shape group. shapeGroup.AddCircle ( center: new Vector2(-1f, 0f), radius: 0.5f );
// Add a box to the shape group. shapeGroup.AddBox ( center: new Vector2(1f, 0f), size: new Vector2(1f, 1f) );
// Assign the shapes and vertices. customCollider.SetCustomShapes(shapeGroup); } }
shapes | 包含用于分配给碰撞体的所有形状的数组。 |
vertices | 包含用于分配给碰撞体的所有顶点的数组。 |
将碰撞体中的所有形状和顶点设置为指定数组所表示的形状和顶点。
所有现有的形状和顶点都将被指定数组中包含的形状和顶点替换。
在可能的情况下,碰撞体将减少分配指定形状和顶点所需的工作量。碰撞体检查每个形状索引处分配的 PhysicsShape2D,如果碰撞体已经包含相同的物理形状,则不执行任何操作。如果物理形状具有相同的 形状类型 和 顶点数量,则现有的物理引擎形状将仅更新其 半径 和 顶点。如果物理形状具有不同的 形状类型 或 顶点数量,则物理引擎形状将被重新创建。
此碰撞体的任何现有接触将在下一个模拟步骤中重新计算。
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 = 1f, vertexStartIndex = 0, vertexCount = 1 }, [1] = new PhysicsShape2D() { shapeType = PhysicsShapeType2D.Capsule, radius = 0.5f, vertexStartIndex = 1, vertexCount = 2 } };
// Create a native vertices array and populate it with the vertices for the shapes. var vertices = new NativeArray<Vector2>(3, Allocator.Temp) { [0] = new Vector2(2f, 3f), [1] = Vector2.down, [2] = Vector2.up };
// Fetch the custom collider. var customCollider = GetComponent<CustomCollider2D>();
// Set custom collider to the shapes and vertices. customCollider.SetCustomShapes(shapes, vertices);
// Dispose of the native arrays. vertices.Dispose(); shapes.Dispose();
// Validate the collider. Assert.AreEqual(2, customCollider.customShapeCount); Assert.AreEqual(3, customCollider.customVertexCount);
// Get all the custom shapes. var shapeGroup = new PhysicsShapeGroup2D(); customCollider.GetCustomShapes(shapeGroup);
// Validate the first shape and vertex. var shape0 = shapeGroup.GetShape(0); Assert.AreEqual(PhysicsShapeType2D.Circle, shape0.shapeType); Assert.AreApproximatelyEqual(1f, shape0.radius); Assert.AreEqual(0, shape0.vertexStartIndex); Assert.AreEqual(1, shape0.vertexCount); Assert.AreEqual(new Vector2(2f, 3f), shapeGroup.GetShapeVertex(shapeIndex: 0, vertexIndex: 0));
// Validate the second shape and vertices. var shape1 = shapeGroup.GetShape(1); Assert.AreEqual(PhysicsShapeType2D.Capsule, shape1.shapeType); Assert.AreApproximatelyEqual(0.5f, shape1.radius); Assert.AreEqual(1, shape1.vertexStartIndex); Assert.AreEqual(2, shape1.vertexCount); Assert.AreEqual(Vector2.down, shapeGroup.GetShapeVertex(shapeIndex: 1, vertexIndex: 0)); Assert.AreEqual(Vector2.up, shapeGroup.GetShapeVertex(shapeIndex: 1, vertexIndex: 1)); } }