Unity CompositeCollider2D类笔记(2D复合碰撞器)
LuJack
2023年11月16日 01:05
收录于文集
共90篇

    CompositeCollide2D类是复合碰撞器,继承自Collider2D类,用于将多个相邻的碰撞器合并成一个整体。这样做之后,相邻碰撞器的范围会合并到一起,并且碰撞性能会有所提升。

    我们可以创建一个空的游戏对象A,然后在它身上添加CompositeCollider2D组件。

    创建若干个游戏对象作为A的子物体,在这些子物体身上都添加上2D碰撞器,并勾选碰撞器组件的Used By Composite属性。

    当我们把这些子物体靠近在一起时,游戏对象A的CompositeCollider2D组件就会生效,会将这些子物体的范围合并为一个整体,从而提升碰撞性能。

    此时我们可以选中游戏对象A,在Scene窗口查看到合并后的范围。

    将多个碰撞器合并到一个复合碰撞器后,原来碰撞器的范围会合并为一个整体的范围。但是与普通的碰撞器不同,此时合并为一个整体的这个范围只有边缘会参与碰撞检测或触发检测,范围的内部是不会参与的。

    而对于其它普通的碰撞器,范围的边缘和范围的内部都会参与碰撞检测或触发检测。

    添加了Composite Collider2D组件后会自动添加一个Rigidbody2D组件,Composite Collider2D组件必须配合Rigidbody2D组件使用,不能删除这个Rigidbody2D组件。

    当Composite Collider2D组件生效时,原来的碰撞器身上的多个参数都会失效。但我们可以通过CompositeCollider2D上的参数来调整效果。

CompositeCollide2D型对象.edgeRadius

    对应Inspector窗口的Edge Radius。当CompositeCollide2D型对象.geometryType为CompositeCollider2D.GeometryType.Outlines时,本变量才会出现和生效。

    float型。

    这个复合碰撞器的的范围的边缘的半径。

    调大本变量,则原来范围的每条边都会新增一个胶囊体的范围,这样会增大碰撞范围。

    本变量不影响它所附加的Rigidbody2D组件的质量。

     

CompositeCollide2D型对象.generationType

    对应Inspector窗口的Generation Type。当CompositeCollide2D型对象.geometryType为CompositeCollider2D.GeometryType.Outlines时,本变量才会出现和生效。

    CompositeCollider2D.generationType型枚举。

    合并到这个复合碰撞器的碰撞器发生改变时,这个复合碰撞器的范围如何进行更新。

    CompositeCollider2D.generationType.Synchronous表示只要合并到这个复合碰撞器的碰撞器发生改变,这个复合碰撞器的范围就会自动更新。

    CompositeCollider2D.generationType.Manual表示不自动更新这个复合碰撞器的范围,需要我们点击Inspector窗口的Regenerate Collider按钮才会更新。或者调用CompositeCollide2D型对象.GenerateGeometry方法,才会更新这个复合碰撞器的范围。

CompositeCollide2D型对象.geometryType

    对应Inspector窗口的Geometry Type。

    CompositeCollider2D.GeometryType型枚举。

    CompositeCollider2D.GeometryType.Outlines表示这个复合碰撞器的范围由轮廓的形状决定,范围的内部不会有连线。

    CompositeCollider2D.GeometryType.Polygons表示这个复合碰撞器的范围的内部会有若干条连线,将这个范围划分为若干个多边形。

CompositeCollide2D型对象.offsetDistance

    对应Inspector窗口的Offset Distance。

    float型。

    随着本变量增大,这个复合碰撞器的范围会向中心位置收缩。

    当本变量增大到达一定数值后,这个复合碰撞器的范围会完全消失。

CompositeCollide2D型对象.pathCount

    int型。

    这个复合碰撞器的路径的数量。即有多少块合并在一起的范围。

    每当一块区域中有若干个相邻的碰撞器通过这个复合碰撞器合并在一起,则视为一块合并在一起的范围。

CompositeCollide2D型对象.pointCount

    int型。

    这个复合碰撞器的范围中所有顶点的数量。

CompositeCollide2D型对象.useDelaunayMesh

    对应Inspector窗口的Use Delaunay Mesh。当CompositeCollide2D型对象.geometryType为CompositeCollider2D.GeometryType.Polygons时,本变量才会出现和生效。

    bool型。

    如果为true,则Unity会使用额外的Delaunay三角剖分步骤来计算这个复合碰撞器的范围。这样一来,范围的内部的连线会减少,从而提升碰撞性能。

    如果为false,则Unity不会使用额外的Delaunay三角剖分步骤来计算这个复合碰撞器的范围。

CompositeCollide2D型对象.vertexDistance

    对应Inspector窗口的Vertex Distance。

    float型。

    这个复合碰撞器的范围的任意两个顶点之间的最小距离。

    如果本变量过大,则这个复合碰撞器的范围会完全消失。

CompositeCollide2D型对象.GenerateGeometry()

    重新生成这个复合碰撞器的范围。

    当CompositeCollide2D型对象.generationType为CompositeCollider2D.generationType.Manual,此时复合碰撞器的范围不会自动更新。我们可以调用本方法来更新这个复合碰撞器的范围。

CompositeCollide2D型对象.GetPath(int 路径的索引,Vector2[] 这条路径所有顶点的位置会存储到这个数组)

    返回int型。

    获取这个复合碰撞器指定索引的路径中所有顶点的位置,并存储到第二个参数的数组中,返回这些顶点的数量。

    如果第二个参数的数组的长度不够,则超过部分不会存储到该数组中。

    这里的索引是从0开始的。

    这里的路径就是CompositeCollide2D型对象.pathCount所指的路径。

CompositeCollide2D型对象.GetPath(int 路径的索引,List<Vector2> 这条路径所有顶点的位置会存储到这个列表)

    返回int型。

    获取这个复合碰撞器指定索引的路径中所有顶点的位置,并存储到第二个参数的列表中,返回这些顶点的数量。

    由于列表会自动扩容,所以这条路径所有顶点的位置都会存储到这个列表中。

    这里的索引是从0开始的。

    这里的路径就是CompositeCollide2D型对象.pathCount所指的路径。

CompositeCollide2D型对象.GetPathPointCount(int 路径的索引)

    返回int型。

    这个复合碰撞器指定索引的路径中所有顶点的数量。

    这里的索引是从0开始的。

    这里的路径就是CompositeCollide2D型对象.pathCount所指的路径。

CompositeCollide2D型对象.sharedMaterial

    对应Inspector窗口的Material。

    PhysicsMaterial2D型。

    这个碰撞器所使用的共享物理材质。

    如果将一个PhysicsMaterial2D的物理材质文件赋值给本变量,然后修改本变量,则修改会直接反映在该文件身上,相当于直接修改了该文件。

    如果本变量为null,则会使用附加了这个碰撞器的Rigidbody2D组件的Rigidbody2D型对象.sharedMaterial来作为物理材质。如果连这个Rigidbody2D型对象.sharedMaterial也为null,则会使用Project Settings窗口中Physics 2D选项卡下的Default Material作为物理材质。如果连这个Default Material也为null,则会使用一个摩擦力为0.4,弹力为0的物理材质。

CompositeCollide2D型对象.isTrigger

    对应Inspector窗口的Is Trigger。

    bool型。

    是否是触发器。true表示是,false表示不是。

CompositeCollide2D型对象.usedByComposite

    对应Inspector窗口的Used By Effector。

    bool型。

    如果为true,则这个碰撞器的碰撞范围既会作为原来的碰撞范围和触发范围,也会作为效应器的效果的范围。如果使用了效应器,则应确保本变量为true,效应器才会生效。

CompositeCollide2D型对象.usedByComposite

    对应Inspector窗口的Used By Composite。

    bool型。

    需要配合复合碰撞器使用。

    如果为true,则这个碰撞器将合并到2D的复合碰撞器中。而且此时原本的一部分属性将消失,这些属性可以在复合碰撞器中配置。

    如果不使用复合碰撞器,则应保证本变量为false。

CompositeCollide2D型对象.offset

    对应Inspector窗口的Offset。

    Vector2型。

    这个碰撞器中心的偏移量。X坐标表示向右偏多少,Y坐标表示向上偏多少。

CompositeCollide2D型对象.excludeLayers

    对应Inspector窗口的Exclude Layers。

    LayerMask型。

    这个碰撞器所依附的游戏对象不会与哪些Layer层的游戏对象发生碰撞。

    默认情况下,哪些Layer层的游戏对象可以发生碰撞是由碰撞矩阵决定的,碰撞矩阵可以在“Edit——Project Settings——Physics2D——Layer Collision Matrix”处设置。但如果设置了本变量,则这个碰撞器所依附的游戏对象不会与哪些Layer层的游戏对象发生碰撞,会以本变量为准。

CompositeCollide2D型对象.includeLayers

    对应Inspector窗口的Include Layers。

    LayerMask型。

    这个碰撞器所依附的游戏对象可以与哪些Layer层的游戏对象发生碰撞。

    默认情况下,哪些Layer层的游戏对象可以发生碰撞是由碰撞矩阵决定的,碰撞矩阵可以在“Edit——Project Settings——Physics2D——Layer Collision Matrix”处设置。但如果设置了本变量,则这个碰撞器所依附的游戏对象可以与哪些Layer层的游戏对象发生碰撞,会以本变量为准。

CompositeCollide2D型对象.layerOverridePriority

    对应Inspector窗口的Layer Override Priority。

    int型。

    在Unity检测两个碰撞器所依附的游戏对象是否会发生碰撞时,CompositeCollide2D型对象.includeLayers和CompositeCollide2D型对象.excludeLayers都会决定它们是否会发生碰撞。

    当没有出现矛盾时,这两个碰撞器的CompositeCollide2D型对象.includeLayers和CompositeCollide2D型对象.excludeLayers都会共同起作用。

    当出现矛盾时,则会以本变量较高的那个碰撞器为准。

CompositeCollide2D型对象.callbackLayers

    对应Inspector窗口的Callback Layers。

    LayerMask型。

    与哪些Layer层的物体发生碰撞时,会触发这个碰撞器所依附的游戏对象身上脚本的OnCollisionXXX2D方法和OnTriggerXXX2D方法。

    CompositeCollide2D型对象.contactCaptureLayers也会影响这个碰撞器所依附的游戏对象身上脚本的OnCollisionXXX2D方法和OnTriggerXXX2D方法是否执行。当本变量和CompositeCollide2D型对象.contactCaptureLayers都包含指定Layer层,这个碰撞器所依附的游戏对象身上脚本的OnCollisionXXX2D方法和OnTriggerXXX2D方法才会执行。

CompositeCollide2D型对象.contactCaptureLayers

    对应Inspector窗口的Contact Capture Layers

    LayerMask型。

    与哪些Layer层的物体发生碰撞时,这个碰撞器所依附的游戏对象身上脚本的以下指定的方法能生效。

    这些方法包括:OnCollisionXXX2D、OnTriggerXXX2D、Physics2D.IsTouching方法、Rigidbody2D型对象.IsTouching方法、Collider2D型对象.IsTouching方法、Physics2D.IsTouchingLayers方法、Rigidbody2D型对象.IsTouchingLayers方法、Collider2D型对象.IsTouchingLayers方法、Physics2D.GetContacts方法、Rigidbody2D型对象.GetContacts方法、Collider2D型对象.GetContacts方法。

    其中对于OnCollisionXXX2D方法和OnTriggerXXX2D方法,当本变量和CompositeCollide2D型对象.callbackLayers都包含指定Layer层,这个碰撞器所依附的游戏对象身上脚本的OnCollisionXXX2D方法和OnTriggerXXX2D方法才会执行。

CompositeCollide2D型对象.forceReceiveLayers

    对应Inspector窗口的Force Receive Layers。

    LayerMask型。

    发生碰撞时,会受到哪些Layer层的物体施加力的作用。

    即使设置了本变量,从而不受某些Layer层的物体施加力的作用,但是碰撞检测方法OnColliderXXX2D依然会执行。

    Joint2D组件施加的力和接收的力都不受本变量影响。

    如果这个碰撞器依附的Rigidbody2D组件的Rigidbody2D型对象.Kinematic为true,则无论本变量为true还是false,都不会受到其它物体施加的力的作用。

CompositeCollide2D型对象.forceSendLayers

    对应Inspector窗口的Force Send Layers。

    LayerMask型。

    发生碰撞时,会对哪些Layer层的物体施加力的作用。

    即使设置了本变量,从而不对某些Layer层的物体施加力的作用,但是碰撞检测方法OnColliderXXX2D依然会执行。

    Joint2D组件施加的力和接收的力都不受本变量影响。

    如果碰撞到的另一个物体的Rigidbody2D组件的Rigidbody2D型对象.Kinematic为true,则无论本变量为true还是false,都不会受到其它物体施加的力的作用。