C# 检查两个碰撞器是否与光线投射重叠?

C# 检查两个碰撞器是否与光线投射重叠?,c#,unity3d,collision-detection,raycasting,C#,Unity3d,Collision Detection,Raycasting,尝试使用距离很小或没有距离的光线投射球体来检测一个对象是否与另一个对象重叠。我的相关代码如下: //Check at location using Stationary Spherecast, apply damage effect if its a unit if (Physics.SphereCast (transform.position, 3, Vector3.up, out hit, 1)) { Debug.Log ("In Spherecast

尝试使用距离很小或没有距离的光线投射球体来检测一个对象是否与另一个对象重叠。我的相关代码如下:

//Check at location using Stationary Spherecast, apply damage effect if its a unit
        if (Physics.SphereCast (transform.position, 3, Vector3.up, out hit, 1)) {
            Debug.Log ("In Spherecast");
            if (hit.transform.CompareTag ("Enemy unit") || hit.transform.CompareTag ("Player Unit")) {
                Debug.Log ("In Spherecast's If");
                int Dmg = MM.MoveStat (Ours, SM.selected.GetComponent<EidolonClass> (), hit.transform.gameObject.GetComponent<EidolonClass> ());
                hit.transform.gameObject.GetComponent<EidolonClass> ().TakeDamage (Dmg);
            }
        }
//使用静止Spherecast检查位置,如果是一个单元,则应用损坏效果
if(Physics.SphereCast(transform.position,3,Vector3.up,out-hit,1)){
Log(“在Spherecast中”);
if(hit.transform.CompareTag(“敌方单位”)| | hit.transform.CompareTag(“玩家单位”)){
Log(“在Spherecast的If中”);
int Dmg=MM.MoveStat(我们的,SM.selected.GetComponent(),hit.transform.gameObject.GetComponent());
hit.transform.gameObject.GetComponent().TakeDamage(Dmg);
}
}
但是,目前,这些Debug.Log语句都没有输出到控制台。我对spherecast或其构造函数有什么误解吗

尝试检测一个对象是否与另一个对象重叠

使用其中一个函数。它们有很多,但如果球体是您要寻找的,那么就应该使用
物理。overlapphere

为了提高性能,请使用以
NonAlloc
结尾的

Physics.overlappherenonalloc
应该可以。只需检查它返回的值是否为>
0

Collider[] colliders = new Collider[5];

void Update()
{
    if (Physics.OverlapSphereNonAlloc(transform.position, 3, colliders) > 0)
    {
       //Overlaps!
    }
}
注意

确保collier已连接到两个游戏对象,以检查它们是否相互重叠

编辑

如果您也需要访问
碰撞器

Collider[] colliders = new Collider[5];

void Update()
{
    int hitCount = Physics.OverlapSphereNonAlloc(transform.position, 3, colliders);

    if (hitCount > 0)
    {
        Debug.Log("Touching!");

        for (int i = 0; i < hitCount; i++)
        {
            Collider C = colliders[i];

            Debug.Log("In Foreach for: " + C.name.ToString());
            if (C.transform.CompareTag("Enemy Unit"))
            {
                Debug.Log(C.name.ToString() + " Is an enemy");

                //...
            }
        }
    }
    else
    {
        Debug.Log("Not Touching!");
    }
}
Collider[]colliders=新的碰撞器[5];
无效更新()
{
int hitCount=Physics.overlappherenonalloc(transform.position,3,对撞机);
如果(命中率>0)
{
Log(“触摸!”);
对于(int i=0;i
尝试检测一个对象是否与另一个对象重叠

使用其中一个函数。它们有很多,但如果球体是您要寻找的,那么就应该使用
物理。overlapphere

为了提高性能,请使用以
NonAlloc
结尾的

Physics.overlappherenonalloc
应该可以。只需检查它返回的值是否为>
0

Collider[] colliders = new Collider[5];

void Update()
{
    if (Physics.OverlapSphereNonAlloc(transform.position, 3, colliders) > 0)
    {
       //Overlaps!
    }
}
注意

确保collier已连接到两个游戏对象,以检查它们是否相互重叠

编辑

如果您也需要访问
碰撞器

Collider[] colliders = new Collider[5];

void Update()
{
    int hitCount = Physics.OverlapSphereNonAlloc(transform.position, 3, colliders);

    if (hitCount > 0)
    {
        Debug.Log("Touching!");

        for (int i = 0; i < hitCount; i++)
        {
            Collider C = colliders[i];

            Debug.Log("In Foreach for: " + C.name.ToString());
            if (C.transform.CompareTag("Enemy Unit"))
            {
                Debug.Log(C.name.ToString() + " Is an enemy");

                //...
            }
        }
    }
    else
    {
        Debug.Log("Not Touching!");
    }
}
Collider[]colliders=新的碰撞器[5];
无效更新()
{
int hitCount=Physics.overlappherenonalloc(transform.position,3,对撞机);
如果(命中率>0)
{
Log(“触摸!”);
对于(int i=0;i
最终找到了一个有效的解决方案,采纳了解决方案程序员和rutter的建议,并在本网站和官方Unity论坛上四处寻找,以找到一个满足我需要的解决方案。以下是完成的代码段:

Collider[]collisions=Physics.OverlapSphere(transform.position,.75f);
foreach(碰撞中的碰撞器C){
Log(“在Foreach中输入:”+C.name.ToString());
如果(C.transform.CompareTag(“敌军单位”)){
Log(C.name.ToString()+“是敌人”);
int Dmg=MM.MoveStat(我们的,SM.selected.GetComponent(),C.transform.gameObject.GetComponent());
C.transform.gameObject.GetComponent().TakeDamage(Dmg);
}

}
最终找到了一个有效的解决方案,采纳了解决方案程序员和rutter的建议,并在本网站和官方Unity论坛上四处寻找,以找到一个满足我需要的解决方案。以下是完成的代码段:

Collider[]collisions=Physics.OverlapSphere(transform.position,.75f);
foreach(碰撞中的碰撞器C){
Log(“在Foreach中输入:”+C.name.ToString());
如果(C.transform.CompareTag(“敌军单位”)){
Log(C.name.ToString()+“是敌人”);
int Dmg=MM.MoveStat(我们的,SM.selected.GetComponent(),C.transform.gameObject.GetComponent());
C.transform.gameObject.GetComponent().TakeDamage(Dmg);
}

}
如果将Debug.Log放在顶级if语句之外,它会工作吗?是的,它包含在另一个函数中。将Debug.log放在第一个if之前或之后都有效如果将radius和maxDistance设置得很高会怎么样?“在Spherecast中”是否打印过?
Raycast
Spherecast
通常不会返回重叠碰撞器的命中率。
OverlapSphere
会满足您的需要吗?不会,仍然没有调用。如果将Debug.Log放在顶级if语句之外,它会工作吗?是的,它包含在另一个函数中。将Debug.log放在第一个if之前或之后都有效如果将radius和maxDistance设置得很高会怎么样?“在Spherecast中”是否打印过?
Raycast
Spherecast
通常不会返回重叠碰撞器的命中率。
OverlapSphere
会满足您的需求吗?不会,仍然没有调用。我也无法让这个实现工作。我要试试看