创造你的世界
玩家及角色:进阶

摄像机碰撞层

7
概述 通过zepetoplayers创建的zepetocamera可以通过相机碰撞设置控制相机与游戏对象之间的物理碰撞。 相机碰撞是指相机与场景中的物体发生碰撞。 如果设置了相机碰撞,当相机与物体发生碰撞时,它将无法在该物体前面移动,导致相机停留在物体前面而不是穿过它。 让我们来看以下两个例子。 在左侧的屏幕上,未设置相机碰撞,允许相机自由移动而不受角色周围物体或地面的影响。 在右侧,启用了相机碰撞,因此相机在移动时无法穿透墙壁和地板。 通过启用相机碰撞,相机的移动受到物理影响,这意味着玩家无法看到的位置无法被相机照亮,从而实现更真实的表现。 设置 zepetoplayers 相机碰撞 1\) 您可以设置相机每个层检测的碰撞。 要设置或添加用户层,请在检查器窗口中按层下拉菜单并选择添加层。 用户可以添加的层可以编号为 layer3 和 layer6 或更高。 layer0 2 和 layer4 5 是 unity 的默认层。 2\) 选择您希望相机应用碰撞判断的对象,然后选择您设置的层。 3\) 现在,在 zepetoplayers 的相机部分,您可以通过按下碰撞的下拉按钮来选择要注册为碰撞的层。检查您添加的层。 4\) 现在按下播放按钮以运行运行时,您将看到 zepeto 相机穿过地板和墙壁而不破坏它们。 在运行时将其设置为脚本 您可以在运行时动态指定相机碰撞。 下面是一个脚本,用于在运行时将注册为公共变量的collisionlayer编号设置为层掩码。 关键是指定要在zepetoplayers instance cameradata layer中选择的层掩码。 cameracollisionmanager 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 中。 📘 unity layer mask https //docs unity3d com/2020 3/documentation/scriptreference/layermask html https //docs unity3d com/2020 3/documentation/scriptreference/layermask html 在 enhancedcamera 的情况下,玩家层未设置为相机的碰撞层,以防止相机与角色相交。