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

การตั้งค่าการชนของกล้อง ZepetoPlayers
1) คุณสามารถตั้งค่าการชนที่กล้องตรวจจับต่อเลเยอร์ได้
- ในการตั้งค่าหรือเพิ่มเลเยอร์ผู้ใช้ ให้กดเมนูเลเยอร์ในหน้าต่าง Inspector และเลือก เพิ่มเลเยอร์
- เลเยอร์ที่ผู้ใช้สามารถเพิ่มได้สามารถมีหมายเลขเป็น Layer3 และ Layer6 หรือสูงกว่า เลเยอร์0 ~ 2 และ Layer4 ~ 5 เป็นเลเยอร์เริ่มต้นของ Unity

2) เลือกวัตถุที่คุณต้องการให้กล้องใช้การตัดสินใจเกี่ยวกับการชน และจากนั้นเลือกเลเยอร์ที่คุณตั้งค่าไว้

3) ตอนนี้ในส่วนกล้องของ ZepetoPlayers คุณสามารถเลือกเลเยอร์ที่ต้องการลงทะเบียนเป็นการชนโดยการกดปุ่มดรอปดาวน์สำหรับการชน ตรวจสอบเลเยอร์ที่คุณได้เพิ่มเข้าไปแล้ว.

4) ตอนนี้กดปุ่มเล่นเพื่อเรียกใช้งานและคุณจะเห็นว่ากล้อง Zepeto เคลื่อนที่ผ่านพื้นและผนังโดยไม่ทำลายมัน.

ตั้งค่าเป็นสคริปต์ในระหว่างการทำงาน
- คุณสามารถกำหนดการชนของกล้องแบบไดนามิกในระหว่างการทำงานได้
- ด้านล่างนี้คือสคริปต์เพื่อกำหนดหมายเลข collisionLayer ที่ลงทะเบียนเป็นตัวแปรสาธารณะในฐานะเลเยอร์มาสก์ในระหว่างการทำงาน
- กุญแจคือการกำหนดเลเยอร์มาสก์ที่จะเลือกใน ZepetoPlayers.instance.cameraData.layer
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.
📘 Unity Layer Mask https://docs.unity3d.com/2020.3/Documentation/ScriptReference/LayerMask.html
- ในกรณีของ EnhancedCamera เลเยอร์ Player จะไม่ถูกตั้งค่าเป็นเลเยอร์การชนของกล้องเพื่อป้องกันไม่ให้กล้องตัดกันกับตัวละคร.