เลเยอร์การชนของกล้อง
ZepetoCamera ที่สร้างขึ้นผ่าน ZepetoPlayers สามารถควบคุมการชนทางกายภาพระหว่างกล้องและวัตถุในเกมได้ผ่านการตั้งค่าการชนของกล้อง.
การชนของกล้องคือเมื่อกล้องชนกับวัตถุในฉาก.
หากตั้งค่าการชนของกล้อง เมื่อกล้องชนกับวัตถุ มันจะไม่สามารถเคลื่อนที่ไปข้างหน้าของวัตถุได้ ทำให้กล้องอยู่ข้างหน้าของวัตถุแทนที่จะผ่านมันไป.
มาดูตัวอย่างสองตัวอย่างต่อไปนี้กันเถอะ.
- ในหน้าจอทางซ้าย การชนของกล้องไม่ได้ตั้งค่า ทำให้กล้องเคลื่อนที่ได้อย่างอิสระโดยไม่ถูกวัตถุรอบตัวละครหรือพื้นกระทบ.
- ทางขวา การชนของกล้องถูกเปิดใช้งาน ดังนั้นกล้องจะไม่สามารถทะลุผ่านกำแพงและพื้นเมื่อมันเคลื่อนที่.
โดยการเปิดใช้งานการชนของกล้อง การเคลื่อนไหวของกล้องจะได้รับผลกระทบทางกายภาพ ซึ่งหมายความว่าสถานที่ที่ผู้เล่นไม่สามารถมองเห็นจะไม่สามารถถูกส่องสว่างโดยกล้อง ซึ่งช่วยให้มีการแสดงผลที่สมจริงมากขึ้น.
1) คุณสามารถตั้งค่าการชนที่กล้องตรวจจับต่อเลเยอร์ได้
- ในการตั้งค่าหรือเพิ่มเลเยอร์ผู้ใช้ ให้กดเมนูเลเยอร์ในหน้าต่าง Inspector และเลือก เพิ่มเลเยอร์
- เลเยอร์ที่ผู้ใช้สามารถเพิ่มได้สามารถมีหมายเลขเป็น Layer3 และ Layer6 หรือสูงกว่า เลเยอร์0 ~ 2 และ Layer6 ~ 7 เป็นเลเยอร์เริ่มต้นของ Unity
2) เลือกวัตถุที่คุณต้องการให้กล้องใช้การตัดสินใจเกี่ยวกับการชน และจากนั้นเลือกเลเยอร์ที่คุณตั้งค่าไว้
3) ตอนนี้ในส่วนกล้องของ ZepetoPlayers คุณสามารถเลือกเลเยอร์ที่ต้องการลงทะเบียนเป็นการชนโดยการกดปุ่มดรอปดาวน์สำหรับการชน ตรวจสอบเลเยอร์ที่คุณได้เพิ่มเข้าไปแล้ว.
4) ตอนนี้กดปุ่มเล่นเพื่อเรียกใช้งานและคุณจะเห็นว่ากล้อง Zepeto เคลื่อนที่ผ่านพื้นและผนังโดยไม่ทำลายมัน.
- คุณสามารถกำหนดการชนของกล้องแบบไดนามิกในระหว่างการทำงานได้
- ด้านล่างนี้คือสคริปต์เพื่อกำหนดหมายเลข collisionLayer ที่ลงทะเบียนเป็นตัวแปรสาธารณะในฐานะเลเยอร์มาสก์ในระหว่างการทำงาน
- กุญแจคือการกำหนดเลเยอร์มาสก์ที่จะเลือกใน ZepetoPlayers.instance.cameraData.layer
3. คำอธิบายสคริปต์
- เพื่อที่จะเขียนสคริปต์เลเยอร์และนำไปใช้กับกล้อง เราจำเป็นต้องใช้ LayerMask.
- LayerMask จะมีค่าที่ป้อนผ่านการดำเนินการแบบบิตไวส์.
- LayerMask แสดงเป็นค่าจำนวนเต็ม โดยที่แต่ละบิตบ่งบอกว่าเลเยอร์นั้นรวมอยู่ด้วยหรือไม่.
- ตัวอย่างเช่น หาก LayerMask มีค่าเป็น 5 (00000101 ในฐานสอง) เราสามารถพูดได้ว่าเลเยอร์ 0 และเลเยอร์ 2 รวมอยู่ด้วย.
- layerMaskValue |=: การดำเนินการแบบบิตไวส์นี้รวมค่า layerMaskValue ที่มีอยู่และค่าที่คำนวณใหม่ในปฏิบัติการ OR.
- หากค่า layerMaskValue ที่มีอยู่เป็น 00000001 ในฐานสอง และค่าที่คำนวณใหม่เป็น 00000100 การ OR ค่าทั้งสองจะส่งผลให้ได้ 00000101 ในฐานสอง.
- สิ่งนี้ทำให้แน่ใจว่าเลเยอร์ 0 และเลเยอร์ 2 รวมอยู่ใน LayerMask.
📘 Unity Layer Mask https://docs.unity3d.com/2020.3/Documentation/ScriptReference/LayerMask.html
- ในกรณีของ EnhancedCamera เลเยอร์ Player จะไม่ถูกตั้งค่าเป็นเลเยอร์การชนของกล้องเพื่อป้องกันไม่ให้กล้องตัดกันกับตัวละคร.