あなたの世界を作りなさい
プレイヤーとキャラクター: 上級
カメラコリジョンレイヤー
7min
ZepetoCameraはZepetoPlayersを通じて作成され、Camera Collision設定を通じてカメラとゲームオブジェクト間の物理的衝突を制御できます。
Camera Collisionは、カメラがシーン内のオブジェクトと衝突することを指します。
Camera Collisionが設定されている場合、カメラがオブジェクトと衝突すると、そのオブジェクトの前に移動できず、カメラはオブジェクトの前に留まることになります。
次の2つの例を見てみましょう。
- 左側の画面では、Camera Collisionが設定されていないため、カメラはキャラクターや床の周りのオブジェクトに影響されずに自由に移動できます。
- 右側では、Camera Collisionが有効になっているため、カメラは移動中に壁や床を貫通することができません。
Camera Collisionを有効にすることで、カメラの動きが物理的に影響を受け、プレイヤーが見ることのできない場所はカメラによって照らされることがなく、よりリアルな描写が可能になります。
1) カメラがレイヤーごとに検出する衝突を設定できます。
- ユーザーレイヤーを設定または追加するには、インスペクタウィンドウのレイヤードロップダウンメニューを押して「レイヤーを追加」を選択します。
- ユーザーが追加できるレイヤーは、Layer3およびLayer6以上の番号が付けられます。Layer0〜2およびLayer6〜7はUnityのデフォルトレイヤーです。
2) カメラが衝突判定を適用するオブジェクトを選択し、設定したレイヤーを選択します。
3) 現在、ZepetoPlayersのカメラ部分で、衝突として登録したいレイヤーを選択するには、衝突のドロップダウンボタンを押します。追加したレイヤーを確認してください。
4) 今、再生ボタンを押してランタイムを実行すると、Zepetoカメラが床や壁を突き破ることなく移動するのが見えます。
- 実行時にカメラの衝突を動的に指定できます。
- 以下は、実行時にレイヤーマスクとして公開変数として登録されたcollisionLayer番号を設定するスクリプトです。
- 重要なのは、ZepetoPlayers.instance.cameraData.layerで選択されるレイヤーマスクを指定することです。
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の場合、プレイヤーレイヤーはカメラの衝突レイヤーに設定されておらず、カメラがキャラクターと交差しないようにしています。