unity3d
レイキャスト
サーチ…
パラメーター
パラメータ | 詳細 |
---|---|
原点 | 世界座標における光線の始点 |
方向 | 光線の方向 |
maxDistance | レイが衝突するかどうかをチェックする最大距離 |
レイヤーマスク | rayをキャストするときにColliderを選択的に無視するために使用されるLayerマスク。 |
queryTriggerInteraction | このクエリがトリガーに当たる場所を指定します。 |
物理レイキャスト
この関数は、シーン内のすべてのコライダーに対して、長さmaxDistance
方向direction
に点origin
からの光線をキャストします。
この関数は、 maxDistance
のorigin
direction
maxDistance
、 maxDistance
前にコライダーがあるかどうかを計算します。
Physics.Raycast(origin, direction, maxDistance);
例えば、ゲームGameObject
10ユニット内に何かある場合、 Hello World
がコンソールに出力されます:
using UnityEngine;
public class TestPhysicsRaycast: MonoBehaviour
{
void FixedUpdate()
{
Vector3 fwd = transform.TransformDirection(Vector3.forward);
if (Physics.Raycast(transform.position, fwd, 10))
print("Hello World");
}
}
Physics2D Raycast2D
レイキャストを使用して、aiがレベルの端から落ちることなく歩くことができるかどうかを確認できます。
using UnityEngine;
public class Physics2dRaycast: MonoBehaviour
{
public LayerMask LineOfSightMask;
void FixedUpdate()
{
RaycastHit2D hit = Physics2D.Raycast(raycastRightPart, Vector2.down, 0.6f * heightCharacter, LineOfSightMask);
if(hit.collider != null)
{
//code when the ai can walk
}
else
{
//code when the ai cannot walk
}
}
}
この例では、方向は正しいです。変数raycastRightPartは文字の右部分であるため、レイキャストは文字の右部分で行われます。距離はキャラクターの高さの0.6倍であるので、レイキャストは地面に当たったときにヒットしません。現時点で立っている地面よりも低いです。 Layermaskが地面のみに設定されていることを確認します。そうでない場合は、他の種類のオブジェクトも検出します。
RaycastHit2D自体は構造体であり、クラスではないため、ヒットはnullにはなりません。つまり、RaycastHit2D変数のコライダーを確認する必要があります。
レイキャストコールのカプセル化
あなたのスクリプトがRaycast
直接呼び出すと、将来のコリジョン行列を変更する必要がある場合、変更に対応するためにすべてのLayerMask
フィールドを追跡する必要があるため、問題につながる可能性があります。あなたのプロジェクトの規模によっては、これは大きな仕事になるかもしれません。
Raycast
コールをカプセル化することで、あなたの人生が楽になるかもしれません。
SoCの原則から見ると、ゲームオブジェクトは実際にはレイヤマスクを知らない、または気にすべきではありません。周囲をスキャンする方法だけが必要です。レイキャストの結果がこれを返すのか、それともゲームオブジェクトにとって重要でないのか。それはそれが受け取る情報にのみ作用し、それが存在する環境について何ら前提を作らない。
これにアプローチする1つの方法は、LayerMask値をScriptableObjectインスタンスに移動し、それらをスクリプトに挿入するレイキャストサービスのフォームとして使用することです。
// RaycastService.cs
using UnityEngine;
[CreateAssetMenu(menuName = "StackOverflow")]
public class RaycastService : ScriptableObject
{
[SerializeField]
LayerMask layerMask;
public RaycastHit2D Raycast2D(Vector2 origin, Vector2 direction, float distance)
{
return Physics2D.Raycast(origin, direction, distance, layerMask.value);
}
// Add more methods as needed
}
// MyScript.cs
using UnityEngine;
public class MyScript : MonoBehaviour
{
[SerializeField]
RaycastService raycastService;
void FixedUpdate()
{
RaycastHit2D hit = raycastService.Raycast2D(Vector2.zero, Vector2.down, 1f);
}
}
これにより、すべてのレイアキャストサービスを作成できます。レイアキャストサービスはすべて、さまざまな状況に応じてレイヤーマスクの組み合わせが異なります。あなたは唯一の地上の衝突に遭遇するものと、地上の衝突と片道のプラットフォームに衝突するものを持つことができます。
LayerMask設定を大幅に変更する必要がある場合は、これらのRaycastServiceアセットを更新するだけで済みます。