origin | 2D 空間上のレイの原点 |
direction | レイの方向を示すベクトル |
distance | Raycast を行う最大距離 |
layerMask | 特定のレイヤーのコライダーのみを判別するためのフィルター |
minDepth | この値以上の Z 座標(深度)を持つオブジェクトのみを含みます。 |
maxDepth | この値以下の Z 座標(深度)を持つオブジェクトのみを含みます。 |
RaycastHit2D 投げかけた結果が返されます。
シーンのコライダーに対してレイを飛ばします
Raycast は例えるならば、空間上のある地点から特定方向へ発射されたセンサーのようなものです。センサーと接触したすべてのオブジェクトは検知され報告されます。
この関数はコライダーが Raycast によりヒットされた場合 RaycastHit オブジェクトを返し、何もヒットしない場合は null を返します。layerMask を使用することで特定レイヤーのオブジェクトのみ判定できます(例えば敵キャラのみヒットを判定できます)。
Raycast は視界の範囲の判定、銃弾によりターゲットの当たり判定、さらに多くのゲームシーンで役に立ちます。
さらにこの関数は線の開始地点のコライダーを検知します。この場合線がコライダーの中で開始していてコライダーの表面と交差していません。つまり返された衝突の法線がテストする線のベクトルの反対にセットされた場合、衝突の法線が計算できません。このような結果は RaycastHit2D の 0 地点で得られるため、これを検知するのは容易です。
関連項目: LayerMask クラス、RaycastHit2D クラス、RaycastAll、Linecast、DefaultRaycastLayers、IgnoreRaycastLayer、raycastsHitTriggers.
// Float a rigidbody object a set distance above a surface.
var floatHeight: float; // Desired floating height. var liftForce: float; // Force to apply when lifting the rigidbody. var damping: float; // Force reduction proportional to speed (reduces bouncing).
var rb2D: Rigidbody2D;
function Start() { rb2D = GetComponent.<Rigidbody2D>(); }
function FixedUpdate() { // Cast a ray straight down. var hit: RaycastHit2D = Physics2D.Raycast(transform.position, -Vector2.up); // If it hits something... if (hit.collider != null) { // Calculate the distance from the surface and the "error" relative // to the floating height. var distance = Mathf.Abs(hit.point.y - transform.position.y); var heightError: float = floatHeight - distance; // The force is proportional to the height error, but we remove a part of it // according to the object's speed. var force = liftForce * heightError - rb2D.velocity.y * damping; // Apply the force to the rigidbody. rb2D.AddForce(Vector3.up * force); } }
using UnityEngine; using System.Collections;
public class ExampleClass : MonoBehaviour { public float floatHeight; public float liftForce; public float damping; public Rigidbody2D rb2D; void Start() { rb2D = GetComponent<Rigidbody2D>(); } void FixedUpdate() { RaycastHit2D hit = Physics2D.Raycast(transform.position, -Vector2.up); if (hit.collider != null) { float distance = Mathf.Abs(hit.point.y - transform.position.y); float heightError = floatHeight - distance; float force = liftForce * heightError - rb2D.velocity.y * damping; rb2D.AddForce(Vector3.up * force); } } }