在 2D 物理引擎中,Physics2D-CompositeOperation(2D 物理复合操作) 是针对复合碰撞体(Composite Collider) 的核心配置项,用于定义多个子碰撞体(Sub-collider)如何组合形成一个统一的碰撞区域,进而影响碰撞检测的逻辑和性能。
Merge 对两个图形进行混合操作。该操作跟图形的顺序无关。A op B 与 B op A的结果是一样的。
Intersect对两个图形进行相交操作。该操作跟图形的顺序无关。A op B 与 B op A的结果是不一样的。
Difference 对两个图形进行相减操作。该操作跟图形的顺序相关。A op B 与 B op A的结果是不一样的。
Flip 对两个图形进行异或操作。该操作跟图形的顺序无关。A op B 与 B op A的结果是一样的。
该值是个整数值。
该选项可以指定物体的层级。比如A op B。想要A在前面,请填写A的CompositeLayer < B的CompositeLayer
比如对于Difference这个操作。
半径为1的圆 op 半径为0.5的圆 的结果如下
半径为0.5的圆 op 半径为1的圆 的结果如下
如果在1.6.x版本以及以前的引擎,生成带Collider2D以及Collider2D子类(BoxCollider2D/CapsuleCollider2D/CircleCoolider2D等等)组件的AssetBundle, 需要在代码中设置CompositeOperation 属性,以达到原有的效果。
示例代码:(1.6.x版本->1.7.x)版本属性重新设置
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using UnityEngine;
public class LoadAssetBundle : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
StartCoroutine(fromMemory());
Debug.Log("LoadAssetBundle Finish");
}
IEnumerator fromMemory()
{
// 1.6.7 AssetBundle
string path = @"D:\UnityProject\transfer167\AB\box167.u3d";
byte[] bytes = File.ReadAllBytes(path);
AssetBundle assetBundle = AssetBundle.LoadFromMemory(bytes);
// Load AssetBundle && Instantiate GameObject
GameObject PrefabGo = assetBundle.LoadAsset("GameObject") as GameObject;
GameObject go = GameObject.Instantiate(PrefabGo);
// because gameobject create by Instantiate, the property may be random,
// so copy value from prefab
Collider2D[] collidersPrefab = PrefabGo.GetComponents<Collider2D>();
Collider2D[] collidersGo = go.GetComponents<Collider2D>();
for (int i = 0; i < collidersPrefab.Length; i++)
{
collidersGo[i].usedByComposite = collidersPrefab[i].usedByComposite;
}
// change `usedByComposite` to `CompositeOperation`
Collider2D[] colliders = go.GetComponents<CapsuleCollider2D>();
foreach (var collider in colliders)
{
if (collider.usedByComposite == true)
{
collider.compositeOperation = Collider2D.CompositeOperation.Merge;
}
else
{
collider.compositeOperation = Collider2D.CompositeOperation.None;
}
}
yield return null;
}
// Update is called once per frame
void Update()
{
}
}
usedByComposite 属性将在1.7.0版本以后被弃用
| 引擎1.6.x及以前的版本 | 引擎1.7.x及以后的版本 |
|---|---|
| usedByComposite(false) | CompositeOpeation.None |
| usedByComposite(true) | CompositeOpeation.Merge |