Version: 1.7
语言 : 中文
Substep
SimulationLayers

Composite

在 2D 物理引擎中,Physics2D-CompositeOperation(2D 物理复合操作) 是针对复合碰撞体(Composite Collider) 的核心配置项,用于定义多个子碰撞体(Sub-collider)如何组合形成一个统一的碰撞区域,进而影响碰撞检测的逻辑和性能。

选项说明

Composite Operation

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的结果是一样的。

Composite Layer

该值是个整数值。

该选项可以指定物体的层级。比如A op B。想要A在前面,请填写A的CompositeLayer < B的CompositeLayer

比如对于Difference这个操作。

半径为1的圆 op 半径为0.5的圆 的结果如下

半径为0.5的圆 op 半径为1的圆 的结果如下

AssetBundle 注意事项

如果在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
Substep
SimulationLayers