---
title: Camera Collision Layer
slug: world-sdk-guide-kr/camera-collision-layer
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

## 개요

ZepetoCamera는 ZepetoPlayers를 통해 생성되며, 카메라 충돌 설정을 통해 카메라와 게임 객체 간의 물리적 충돌을 제어할 수 있습니다.

카메라 충돌은 카메라가 장면의 객체와 충돌할 때 발생합니다.

카메라 충돌이 설정되면, 카메라가 객체와 충돌할 때 그 객체 앞에서 움직일 수 없게 되어 카메라가 객체를 통과하는 대신 그 앞에 머무르게 됩니다.

다음 두 가지 예를 살펴보겠습니다.

- 왼쪽 화면에서는 카메라 충돌이 설정되지 않아 카메라가 캐릭터 주변의 객체나 바닥에 영향을 받지 않고 자유롭게 움직일 수 있습니다.
- 오른쪽에서는 카메라 충돌이 활성화되어 있어 카메라가 이동할 때 벽과 바닥을 관통할 수 없습니다.

카메라 충돌을 활성화하면 카메라의 움직임이 물리적으로 영향을 받게 되어, 플레이어가 볼 수 없는 위치는 카메라에 의해 조명될 수 없으며, 이는 보다 현실적인 묘사를 가능하게 합니다.

![](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"}
**📘 유니티 레이어 마스크**
[https://docs.unity3d.com/2020.3/Documentation/ScriptReference/LayerMask.html](https://docs.unity3d.com/2020.3/Documentation/ScriptReference/LayerMask.html)
:::

:::hint{type="danger"}
- EnhancedCamera의 경우, 플레이어 레이어가 카메라의 충돌 레이어로 설정되지 않아 카메라가 캐릭터와 교차하지 않도록 합니다.
:::

