---
title: เลเยอร์การชนของกล้อง
slug: world-sdk-guide-th/Uqmld8ZYwlXB4GuRFjUFz
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

## ภาพรวม

ZepetoCamera ที่สร้างขึ้นผ่าน ZepetoPlayers สามารถควบคุมการชนทางกายภาพระหว่างกล้องและวัตถุในเกมได้ผ่านการตั้งค่าการชนของกล้อง.

การชนของกล้องคือเมื่อกล้องชนกับวัตถุในฉาก.

หากตั้งค่าการชนของกล้อง เมื่อกล้องชนกับวัตถุ มันจะไม่สามารถเคลื่อนที่ไปข้างหน้าของวัตถุได้ ทำให้กล้องอยู่ข้างหน้าของวัตถุแทนที่จะผ่านมันไป.

มาดูตัวอย่างสองตัวอย่างต่อไปนี้กันเถอะ.

- ในหน้าจอทางซ้าย การชนของกล้องไม่ได้ตั้งค่า ทำให้กล้องเคลื่อนที่ได้อย่างอิสระโดยไม่ถูกวัตถุรอบตัวละครหรือพื้นกระทบ.
- ทางขวา การชนของกล้องถูกเปิดใช้งาน ดังนั้นกล้องจะไม่สามารถทะลุผ่านกำแพงและพื้นเมื่อมันเคลื่อนที่.

โดยการเปิดใช้งานการชนของกล้อง การเคลื่อนไหวของกล้องจะได้รับผลกระทบทางกายภาพ ซึ่งหมายความว่าสถานที่ที่ผู้เล่นไม่สามารถมองเห็นจะไม่สามารถถูกส่องสว่างโดยกล้อง ซึ่งช่วยให้มีการแสดงผลที่สมจริงมากขึ้น.

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



## การตั้งค่าการชนของกล้อง ZepetoPlayers

1\) คุณสามารถตั้งค่าการชนที่กล้องตรวจจับต่อเลเยอร์ได้

- ในการตั้งค่าหรือเพิ่มเลเยอร์ผู้ใช้ ให้กดเมนูเลเยอร์ในหน้าต่าง Inspector และเลือก เพิ่มเลเยอร์
- เลเยอร์ที่ผู้ใช้สามารถเพิ่มได้สามารถมีหมายเลขเป็น Layer3 และ Layer6 หรือสูงกว่า  เลเยอร์0 \~ 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 {
 
     // ประกาศสมาชิกสาธารณะเพื่อเก็บอาร์เรย์ของหมายเลขเลเยอร์การชน
    public collisionLayer: number[];
 
    Start() {
        // สร้างผู้เล่นท้องถิ่น
        ZepetoPlayers.instance.CreatePlayerWithUserId(WorldService.userId, new SpawnInfo(), true);
 
        // เพิ่มผู้ฟังเหตุการณ์เมื่อผู้เล่นท้องถิ่นถูกเพิ่มลงในฉาก
        ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
 
            // ตั้งค่าเลเยอร์การชนของกล้องเป็นเลเยอร์มาสก์ใหม่
            ZepetoPlayers.instance.ZepetoCamera.CollisionLayer = this.SetNewLayerMask();
 
        });
    }
 
    // วิธีการสร้างและตั้งค่า LayerMask ใหม่ตามเลเยอร์การชน
    private SetNewLayerMask(): LayerMask {
        let layerMaskValue = 0;
 
        // ทำซ้ำผ่านอาร์เรย์เลเยอร์การชนและอัปเดตค่าเลเยอร์มาสก์
        this.collisionLayer.forEach(layerNumber => {
            layerMaskValue |= 1 << layerNumber;
        });
 
        // สร้าง LayerMask ใหม่และตั้งค่าค่าของมันเป็นค่าที่คำนวณได้
        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 เลเยอร์ Player จะไม่ถูกตั้งค่าเป็นเลเยอร์การชนของกล้องเพื่อป้องกันไม่ให้กล้องตัดกันกับตัวละคร.
:::

