---
title: 摄像机碰撞层
slug: world-sdk-guide-ch/AYWYjCMpD-9b8tdJAJ-Pv
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

## 概述

通过ZepetoPlayers创建的ZepetoCamera可以通过相机碰撞设置控制相机与游戏对象之间的物理碰撞。

相机碰撞是指相机与场景中的物体发生碰撞。

如果设置了相机碰撞，当相机与物体发生碰撞时，它将无法在该物体前面移动，导致相机停留在物体前面而不是穿过它。

让我们来看以下两个例子。

- 在左侧的屏幕上，未设置相机碰撞，允许相机自由移动而不受角色周围物体或地面的影响。
- 在右侧，启用了相机碰撞，因此相机在移动时无法穿透墙壁和地板。

通过启用相机碰撞，相机的移动受到物理影响，这意味着玩家无法看到的位置无法被相机照亮，从而实现更真实的表现。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-TC9-06uQFRIS9udSLPYzv-20240904-102420.gif)



## 设置 ZepetoPlayers 相机碰撞

1\) 您可以设置相机每个层检测的碰撞。

- 要设置或添加用户层，请在检查器窗口中按层下拉菜单并选择添加层。
- 用户可以添加的层可以编号为 Layer3 和 Layer6 或更高。 Layer0 \~ 2 和 Layer4 \~ 5 是 Unity 的默认层。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-bWINrxYxvUmhX9uIw_2MA-20240904-102416.png)



2\) 选择您希望相机应用碰撞判断的对象，然后选择您设置的层。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-0fGCLecHz4calLE2GZ3nd-20240904-102416.png)



3\) 现在，在 ZepetoPlayers 的相机部分，您可以通过按下碰撞的下拉按钮来选择要注册为碰撞的层。检查您添加的层。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-IcJdP4B9ONHisBvZMfbMD-20240904-102416.png)



4\) 现在按下播放按钮以运行运行时，您将看到 Zepeto 相机穿过地板和墙壁而不破坏它们。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-hVF6T0MIbUVKr0zTfWLXP-20240904-102416.png)



## 在运行时将其设置为脚本

1. 您可以在运行时动态指定相机碰撞。
2. 下面是一个脚本，用于在运行时将注册为公共变量的collisionLayer编号设置为层掩码。

- 关键是指定要在ZepetoPlayers.instance.cameraData.layer中选择的层掩码。

:::CodeblockTabs
CameraCollisionManager

```javascript
import { LayerMask } from 'UnityEngine';
import { SpawnInfo, ZepetoPlayers } from 'ZEPETO.Character.Controller'
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
import { WorldService } from 'ZEPETO.World';
 
export default class CameraCollisionManager extends ZepetoScriptBehaviour {
 
     // Declare a public member to store an array of collision layer numbers
    public collisionLayer: number[];
 
    Start() {
        // Create Localplayer
        ZepetoPlayers.instance.CreatePlayerWithUserId(WorldService.userId, new SpawnInfo(), true);
 
        // Add an event listener for when the local player is added to the scene
        ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
 
            // Set the camera collision layer to the new layer mask
            ZepetoPlayers.instance.ZepetoCamera.CollisionLayer = this.SetNewLayerMask();
 
        });
    }
 
    // Method to create and set a new LayerMask based on the collision layers
    private SetNewLayerMask(): LayerMask {
        let layerMaskValue = 0;
 
        // Iterate through the collision layers array and update the layer mask value
        this.collisionLayer.forEach(layerNumber => {
            layerMaskValue |= 1 << layerNumber;
        });
 
        // Create a new LayerMask and set its value to the calculated layer mask value
        let newLayerMask: LayerMask = new LayerMask;
        newLayerMask.value = layerMaskValue;
 
        return newLayerMask;
    }
 
}
```
:::

3\. 脚本描述

- 为了编写一个层并将其应用于相机，我们需要使用 LayerMask。
- LayerMask 的值将通过按位操作输入。
  - LayerMask 表示为一个整数值，其中每一位表示该层是否被包含。
  - 例如，如果 LayerMask 的值为 5（在二进制中为 00000101），我们可以说层 0 和层 2 被包含。
- layerMaskValue |=: 这个按位操作将现有的 layerMaskValue 和新计算的值通过 OR 操作结合在一起。
  - 如果现有的 layerMaskValue 在二进制中为 00000001，而新计算的值为 00000100，则将这两个值进行 OR 操作将得到 00000101。
  - 这确保了层 0 和层 2 都包含在 LayerMask 中。

:::hint{type="info"}
**📘 Unity Layer Mask**
[https://docs.unity3d.com/2020.3/Documentation/ScriptReference/LayerMask.html](https://docs.unity3d.com/2020.3/Documentation/ScriptReference/LayerMask.html)
:::

:::hint{type="danger"}
- 在 EnhancedCamera 的情况下，玩家层未设置为相机的碰撞层，以防止相机与角色相交。
:::

