OverlapSphereとSphereCast
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 38/63。
レイは線について調べます。Physics.OverlapSphere(center, radius)は球状の領域について調べます。centerを中心とする球に触れているすべてのコライダーの配列を返し、方向も距離もありません。この爆弾は爆発すると、3 units以内にあるすべての木箱を破壊します。
void Explode()
{
Collider[] hits = Physics.OverlapSphere(transform.position, 3f);
foreach (Collider c in hits)
{
if (c.CompareTag("Crate"))
{
Destroy(c.gameObject);
}
}
Destroy(gameObject);
}配列には範囲内のすべてのものが含まれます。床、壁、そして爆弾自身のコライダーも含まれます。これは、重なり判定では開始位置に含まれているコライダーを除外しないためです。そのため、ループでは処理を行う前にタグを確認しています。各コライダーのattachedRigidbodyは、そのコライダーが属するRigidbodyです。床のような静的なものの場合はnullです。
Physics.SphereCast(origin, radius, direction, out hit, maxDistance)は太さのあるレイです。球を線に沿って動かし、その球が最初にぶつかるコライダーを報告します。半径1の岩が、幅1.5の2本の支柱の間にある隙間に向かって転がるとき、通り抜けられるかどうかを調べるのに使えます。隙間の中央に細いレイを通しても何にも当たりませんが、球のキャストでは支柱に当たります。レイと同様に、球のキャストも開始位置ですでに触れているコライダーを無視します。
チャレンジ
中級大きなビームで大砲を武装させましょう。Beamスクリプトは大砲に設定し、インスペクターでradiusを0.5、rangeを12にします。左右の矢印キーで大砲を回転させます。
- Spaceキーを押すと、大砲から前方に
radiusの半径を持つ球体を、rangeの距離まで飛ばします。 - 何かに当たったら、当たったものの名前とともに
Hit Poleをログに出力し、そのオブジェクトを破棄します。 - 何にも当たらなかったら、
Missをログに出力します。
細いPoleは、大砲の中心線から少し横に立っています。Playを押して発射し、次にCheckを押してください。
自分で試してみよう
using UnityEngine;
public class Beam : MonoBehaviour
{
public float radius = 0.5f;
public float range = 12f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// 半径 radius の球を前方にスイープし、最初に衝突したものを破壊する。
}
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。