カメラコリジョンレイヤー
7 分
概要
ZepetoCameraはZepetoPlayersを通じて作成され、Camera Collision設定を通じてカメラとゲームオブジェクト間の物理的衝突を制御できます。
Camera Collisionは、カメラがシーン内のオブジェクトと衝突することを指します。
Camera Collisionが設定されている場合、カメラがオブジェクトと衝突すると、そのオブジェクトの前に移動できず、カメラはオブジェクトの前に留まることになります。
次の2つの例を見てみましょう。
- 左側の画面では、Camera Collisionが設定されていないため、カメラはキャラクターや床の周りのオブジェクトに影響されずに自由に移動できます。
- 右側では、Camera Collisionが有効になっているため、カメラは移動中に壁や床を貫通することができません。
Camera Collisionを有効にすることで、カメラの動きが物理的に影響を受け、プレイヤーが見ることのできない場所はカメラによって照らされることがなく、よりリアルな描写が可能になります。

ZepetoPlayersカメラ衝突の設定
1) カメラがレイヤーごとに検出する衝突を設定できます。
- ユーザーレイヤーを設定または追加するには、インスペクタウィンドウのレイヤードロップダウンメニューを押して「レイヤーを追加」を選択します。
- ユーザーが追加できるレイヤーは、Layer3およびLayer6以上の番号が付けられます。Layer0〜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 {
// 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(2進数で00000101)の場合、レイヤー0とレイヤー2が含まれていると言えます。
- layerMaskValue |=: このビット演算は、既存のlayerMaskValueと新しく計算された値をOR演算で結合します。
- 既存のlayerMaskValueが2進数で00000001で、新しく計算された値が00000100の場合、2つの値をORすると2進数で00000101になります。
- これにより、レイヤー0とレイヤー2の両方がLayerMaskに含まれることが保証されます。
📘 Unity Layer Mask https://docs.unity3d.com/2020.3/Documentation/ScriptReference/LayerMask.html
- EnhancedCameraの場合、プレイヤーレイヤーはカメラの衝突レイヤーに設定されておらず、カメラがキャラクターと交差しないようにしています。