- Aのライントレース(レイキャスト)による物体検知
- Aのライントレース(レイキャスト)がBに当たったときに得られる情報
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RaycastSample : MonoBehaviour
{
public float maxDistance = 10.0f;
Ray ray;
void Start()
{
ray = new Ray( transform.position,
transform.TransformDirection(Vector3.forward));
Debug.DrawRay( gameObject.transform.position,
ray.direction * maxDistance,
Color.red);
if(Physics.Raycast(ray, out RaycastHit hit))
{
//var target = ray.origin + ray.direction * maxDistance;
Debug.Log(hit.collider.gameObject.name);
}
}
}RaycastSampleコンポーネントをSphereAのゲームオブジェクトに追加します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class RaycastAll : MonoBehaviour
{
public float maxDistance = 10.0f;
Ray ray;
RaycastHit[] hits;
void Start()
{
ray = new Ray( transform.position,
transform.forward);
hits = Physics.RaycastAll( ray,
maxDistance);
Debug.DrawRay( transform.position,
ray.direction * maxDistance,
Color.red,
1.0f);
if(hits.Length > 0)
{
Array.Sort(hits, (RaycastHit x, RaycastHit y) => x.distance.CompareTo(y.distance));
foreach(var hit in hits)
{
Debug.Log(hit.collider.gameObject.name);
}
}
}
}RaycastAllコンポーネントをSphereAのゲームオブジェクトに追加します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class RaycastDetection : MonoBehaviour
{
public float maxDistance = 10.0f;
Ray ray;
RaycastHit[] hits;
void Start()
{
ray = new Ray( transform.position,
transform.forward);
hits = Physics.RaycastAll( ray,
maxDistance,
1 << 7);
Debug.DrawRay( transform.position,
ray.direction * maxDistance,
Color.red,
1.0f);
if(hits.Length > 0)
{
Array.Sort(hits, (RaycastHit x, RaycastHit y) => x.distance.CompareTo(y.distance));
foreach(var hit in hits)
{
Debug.Log(hit.collider.gameObject.name);
}
}
}
}RaycastDetectionコンポーネントをSphereAのゲームオブジェクトに追加します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class RaycastMultiDetection : MonoBehaviour
{
public float maxDistance = 10.0f;
Ray ray;
RaycastHit[] hits;
void Start()
{
ray = new Ray( transform.position,
transform.forward);
hits = Physics.RaycastAll( ray,
maxDistance,
1 << 0 | 1 << 7);
Debug.DrawRay( transform.position,
ray.direction * maxDistance,
Color.red,
1.0f);
if(hits.Length > 0)
{
Array.Sort(hits, (RaycastHit x, RaycastHit y) => x.distance.CompareTo(y.distance));
foreach(var hit in hits)
{
Debug.Log(hit.collider.gameObject.name);
}
}
}
}playを実行して、SphereAから発射されるレイキャストが指定したゲームオブジェクトを複数検知していることがわかります。
| articulationBody | The ArticulationBody of the collider that was hit. If the collider is not attached to an articulation body then it is null. |
| barycentricCoordinate | ヒットした三角形の重心座標 |
| collider | ヒットしたコライダー |
| colliderInstanceID | Instance ID of the Collider that was hit. |
| distance | レイの原点から衝突点までの距離 |
| lightmapCoord | 衝突点の UV ライトマップ座標 |
| normal | レイがヒットしたサーフェスの法線 |
| point | レイがコライダーにヒットした位置 (ワールド空間)。 |
| rigidbody | ヒットしたコライダーの Rigidbody。コライダーに Rigidbody がアタッチされていない場合は null になります。 |
| textureCoord | The uv texture coordinate at the collision location. |
| textureCoord2 | 衝突したセカンダリ UV テクスチャの座標 |
| transform | 衝突したコライダーまたは Rigidbody の Transform |
| triangleIndex | 衝突したメッシュの三角形におけるインデックス |
| Aのライントレースによる物体検知 | LineTraceByChannelノード | 相手のアクターはCollisionコンポーネントが必要 | 指定したトレースチャンネルに最初にヒットした物体を検知するライントレース |
| LineTraceForObjectsノード | 指定したオブジェクトチャンネルに最初にヒットした物体を検知するライントレース | ||
| Aのライントレースで複数のアクターを検知する、Aのライントレースで指定したアクターを検知する | MultiLineTraceForObjectsノード、MultiLineTraceByChannelノード(※) | Unityのレイキャストと同じ動きをする、指定したオブジェクトチャンネルのすべての物体を検知するライントレース |
LineTraceByChannelを使った物体検知
Aから発射するライントレースの対象トレースチャンネルをBのトレースチャンネルに設定した相手アクターにCollisionコンポーネントを追加して、相手のトレースチャンネルトレース応答がBlockかをみて検知します。LineTraceByChannelノードの相互作用の有無についての確認
次にSphereBに対してHitイベントが発生しているかについて確認します。LineTraceForObjectsノードを使った物体検知
今度はLineTraceByChannelノードの代わりにLineTraceForObjectsを使います。LineTraceForObjectsノードの相互作用の有無についての確認
次にSphereBに対してHitイベントが発生しているかについて確認します。MultiLineTraceForObjectsノードの相互作用の有無についての確認
次にSphereCに対してHitイベントが発生しているかについて確認します。MultiLine Trace By Channelノードを使った物体検知
MultiLine Trace By ChannelはSphereAから発射したライントレースから一番近くに当たった該当のトレースチャンネルがBlockのアクターを検知します。発射したアクターとBlockで検知されたアクターの間に、別のアクターが存在したとき、該当のトレースチャンネルがOverlapに設定している場合はそれらも含めて取得します。| Location | トレースの形状に応じて修正されるヒットのワールド空間の位置。 |
| Impact Point | ヒットの絶対位置。ヒットのポイントだけでトレースの形状は含みません。 |
| Normal | トレースの方向です。 |
| Impact Normal | ヒットしたサーフェスの法線です。 |
| Phys Mat | ヒットしたサーフェスの 物理マテリアル です。 |
| Hit Actor | ヒットした アクタ |
| Hit Component | ヒットした特定の コンポーネント |
| Hit Bone Name | スケルタルメッシュ に対してトレースする場合にヒットしたボーン名 |
| Bone Name | トレース ボーン ヒットの名前。 スケルタルメッシュにヒットした場合にのみ有効です。 |
| Hit Item | プリミティブのどのアイテムにヒットしたかを記録するプリミティブ固有のデータ |
| Element Index | 複数のパーツを持つプリミティブと衝突した場合にヒットしたパーツのインデックス。 |
| Face Index | 三角メッシュやランドスケープと衝突する場合に、ヒットした面のインデックスです。 |
| Trace Start | トレースの開始位置です。 |
| Trace End | トレースの終了位置です。 |