序文
ユニティ衝突を2つに分割することが、現在の連絡先を検出しました。
1 OnTrigger、OnCollider
2、 Physics.Overlap
ここでは、アプリケーション・レコードの第二の方法に焦点を当てます。
Physics.Overlap
関数:その構成では、外側に、放出放射線の長さのサイズを設定。オブジェクトが検出された光線を取得してもよいです。
注意:
、取得したオブジェクトは、独自のが含まれています。
B、自身が衝突、剛体必要とされなくてもよいです。コード好ましい範囲か衝突の周り検出するように、設定されています。そして、それは剛体持っているコライダーをテストする必要はありません。
次のコードであるため、目視検査エリア衝突完全に使用することです。
提案:
衝突検出はに基づいていますが、視覚的な検査範囲を必要とされていないため。提案は、直接3Dオブジェクトの形状に対応したスクリプトをマウント。隠すMeshRenderer、衝突スタート。
以下のコードは、(その位置を検出する)ゲームオブジェクトを変換する前に、スクリプトは正しい位置と、他の物体に取り付けることができます。
1、Physics.OverlapCapsule
Collider[] outputCols = Physics.OverlapCapsule(pointTop, pointBottom, radius, LayerMask.GetMask("Ground"));
注意:
A、そのスケールのオブジェクト、衝撃検知の方向に注意。
方向はtransform.upで固定されています。
B、デフォルトの衝突方向に基づいて、この方向:Y軸、センター0
C、 CapsuleColliderスケーリング:
唯一の現在のコード全体のスケーリングオブジェクト、親オブジェクトもスケーリングされなければならない積分(Y軸スケーリング動作は、必要に応じて、増加し、その後コードを更新すると予想されます)。
調節可能な衝突半径、高さ、回転可能。
dが、視覚的検出はCapsuleCollider範囲です。
/// <summary>
/// 当前实时检测到的带 碰撞器、Vive_InteractableObject 的物体
/// </summary>
public List<Transform> skode_detectObjs = new List<Transform>();
CapsuleCollider capcol = null;
private void Start()
{
capcol = GetComponent<CapsuleCollider>();
}
private void Update()
{
Detection();
}
void Detection()
{
float offset = capcol.height * 0.5f;
float radius = capcol.radius;
float scale = capcol.transform.localScale.x;
Transform tempTrans = capcol.transform.parent;
while (tempTrans != null)
{
scale = scale * tempTrans.localScale.x;
tempTrans = tempTrans.parent;
}
Vector3 pointTop = capcol.transform.position + capcol.transform.up * (radius - offset) * scale;
Vector3 pointBottom = capcol.transform.position + (capcol.transform.up * (capcol.height - offset) - capcol.transform.up * radius) * scale;
Collider[] outputCols = Physics.OverlapCapsule(pointTop, pointBottom, radius * scale);
//只检测Ground层物体。
//outputCols = Physics.OverlapCapsule(pointTop, pointBottom, radius, LayerMask.GetMask("Ground"));
skode_detectObjs.Clear();
if (outputCols != null && outputCols.Length > 0)
{
foreach (var item in outputCols)
{
if (item.transform != transform && item.GetComponent<Vive_InteractableObject>())
{
skode_detectObjs.Add(item.transform);
}
}
}
}
2、Physics.OverlapBox
//模拟的盒子中心点,x、y、z轴长度的一半
Collider[] outputCols = Physics.OverlapBox(boxCol.transform.position, scale / 2,boxCol.transform.rotation);
注意:
、(オブジェクトが特定の点から放出される放射線を検出する)自体をスケーリングすることができ、親オブジェクトの割合を回転させることができます。
Bは、キューブの上にハングアップした場合、それはBoxCollider視覚的検出範囲です。
Cは、サイズ1サイズは、以下のコードを更新するために、変更された場合センターの下、0です。
/// <summary>
/// 当前实时检测到的带 碰撞器、Vive_InteractableObject 的物体
/// </summary>
public List<Transform> skode_detectObjs = new List<Transform>();
BoxCollider boxCol = null;
private void Start()
{
boxCol = GetComponent<BoxCollider>();
}
private void Update()
{
DetectionBox();
}
void DetectionBox()
{
Vector3 scale = boxCol.transform.localScale;
Transform tempTrans = boxCol.transform.parent;
while (tempTrans != null)
{
scale = Skode_Vec3Mul(scale, tempTrans.localScale);
tempTrans = tempTrans.parent;
}
//模拟的盒子中心点,x、y、z轴长度的一半
Collider[] outputCols = Physics.OverlapBox(boxCol.transform.position, scale / 2,boxCol.transform.rotation);
skode_detectObjs.Clear();
if (outputCols != null && outputCols.Length > 0)
{
foreach (var item in outputCols)
{
if (item.transform != transform && item.GetComponent<Vive_InteractableObject>())
{
skode_detectObjs.Add(item.transform);
}
}
}
}
Vector3 Skode_Vec3Mul(Vector3 value1, Vector3 value2)
{
return new Vector3(value1.x * value2.x, value1.y * value2.y, value1.z * value2.z);
}
2、Physics.OverlapSphere
Collider[] outputCols = Physics.OverlapSphere(sphereCol.transform.position, GetComponent<SphereCollider>().radius * scale);
注意:
A、検出対象の規模に及ぼす影響。
C、 CapsuleColliderスケーリング:
現在のコードしかでき、全体のオブジェクトをスケーリング、親オブジェクトも全体的にスケーリングする必要があります
調節可能な衝突半径
dが、視覚的検出はCapsuleCollider範囲です。
/// <summary>
/// 当前实时检测到的带 碰撞器、Vive_InteractableObject 的物体
/// </summary>
public List<Transform> skode_detectObjs = new List<Transform>();
SphereCollider sphereCol = null;
private void Start()
{
sphereCol = GetComponent<SphereCollider>();
}
private void Update()
{
DetectionSphere();
}
void DetectionSphere()
{
float scale = sphereCol.transform.localScale.x;
Transform tempTrans = sphereCol.transform.parent;
while (tempTrans != null)
{
scale = scale * tempTrans.localScale.x;
tempTrans = tempTrans.parent;
}
Collider[] outputCols = Physics.OverlapSphere(sphereCol.transform.position, GetComponent<SphereCollider>().radius * scale);
skode_detectObjs.Clear();
if (outputCols != null && outputCols.Length > 0)
{
foreach (var item in outputCols)
{
if (item.transform != transform && item.GetComponent<Vive_InteractableObject>())
{
skode_detectObjs.Add(item.transform);
}
}
}
}