C# 检测来自不同对象的碰撞?

C# 检测来自不同对象的碰撞?,c#,unity3d,collision-detection,C#,Unity3d,Collision Detection,我想不出一个合适的题目来回答这个问题,但我会解释的 我有一个碰撞框,里面有一个脚本。此脚本有一个if语句,用于检测来自对象“Cube001”的冲突,并将Debug.Log发送到控制台 using System.Collections; using System.Collections.Generic; using UnityEngine; public class cubeDetect : MonoBehaviour { void OnCollisionEnter(Coll

我想不出一个合适的题目来回答这个问题,但我会解释的

我有一个碰撞框,里面有一个脚本。此脚本有一个if语句,用于检测来自对象“Cube001”的冲突,并将Debug.Log发送到控制台

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

 public class cubeDetect : MonoBehaviour {

     void OnCollisionEnter(Collision collision) {

         if (collision.gameObject.name == "Cube001")
         {
             Debug.Log("Cube001 hit!");
         }
     }

 }
有了这个方法,盒子碰撞器就知道是什么立方体碰到它了,正如我用这个方法所指示的那样

collision.gameObject.name == "Cube001"
但是,如果我有10个立方体与碰撞框发生碰撞,我如何更改if语句呢?这样,我就可以只使用1个if语句,它首先检测到另一个立方体的碰撞,知道哪个立方体撞到了碰撞框,而不是编写另外9个if语句来检查碰撞框,有了这些知识,就能够执行Debug.Log,以显示命中框的多维数据集的名称


我已尝试浏览了
OnCollisionCenter
的文档,但找不到任何帮助。

一个选项是用相同的名称标记所有要碰撞的相似对象。假设我们给他们贴上“隔间”的标签。然后,我们可以执行以下操作:

Gameobject myCube;
void OnCollisionEnter(Collision collision) {

     if (collision.collider.tag == "Cubicle")
     {
         Debug.Log(collision.gameObject.name + " hit!");
         myCube = collision.gameObject; // store colliding gameobject info for use elsewhere
     }
 }

一个选项是用相同的名称标记所有要碰撞的相似对象。假设我们给他们贴上“隔间”的标签。然后,我们可以执行以下操作:

Gameobject myCube;
void OnCollisionEnter(Collision collision) {

     if (collision.collider.tag == "Cubicle")
     {
         Debug.Log(collision.gameObject.name + " hit!");
         myCube = collision.gameObject; // store colliding gameobject info for use elsewhere
     }
 }

对我来说,最有效的方法是使用接口和组件并检查它们。如果您对冲突有一定的逻辑,这是非常有效的,但是如果您没有,您可以使用
标记
,并将其设置为类似
的“可冲突的”

接口解决方案:

就像这样使用它:

void OnCollisionEnter(Collision collision) 
{
    ICollidableObject collidedWith = collision.gameObject.GetComponent<ICollidableObject>();
    if ( collidedWith != null )
        collidedWith.CollidedWith(this);
}
void OnCollisionEnter(碰撞)
{
ICollidableObject CollidateWith=collision.gameObject.GetComponent();
if(collidedWith!=null)
与(这个)碰撞;
}

对我来说最有效的方法是使用接口和组件并检查它们。如果您对冲突有一定的逻辑,这是非常有效的,但是如果您没有,您可以使用
标记
,并将其设置为类似
的“可冲突的”

接口解决方案:

就像这样使用它:

void OnCollisionEnter(Collision collision) 
{
    ICollidableObject collidedWith = collision.gameObject.GetComponent<ICollidableObject>();
    if ( collidedWith != null )
        collidedWith.CollidedWith(this);
}
void OnCollisionEnter(碰撞)
{
ICollidableObject CollidateWith=collision.gameObject.GetComponent();
if(collidedWith!=null)
与(这个)碰撞;
}

您需要使用
字典
。这样就不需要所有
if
语句

这就是
词典
的外观:

public static Dictionary<GameObject, System.Action> objToAction = new Dictionary<GameObject, Action>();
字典中的关键是游戏对象(立方体),你也可以使用字符串(游戏对象的名称),但使用游戏对象更好。
字典中的值存储调用
OnCollisionCenter
时要执行的操作。所以应该在
if
语句中的代码应该放在这里。这是通过
操作
委托
完成的。您可以添加任意数量的游戏对象(立方体)

必须使用上述函数将这些多维数据集对象添加到字典中:

public GameObject prefab;

void Start()
{
    //Create new Cube
    GameObject obj = Instantiate(prefab);
    obj.name = "Cube001";

    //Add it to the Dictionary
    registerObject(obj, delegate { Debug.Log("Hit: " + obj.name); });
}
您的新
OnCollisionCenter
代码如下所示。如果需要声明,则无
。如果对象存在于
字典
中,则为每个关键游戏对象执行我们存储在
字典
值中的代码

void OnCollisionEnter(Collision collision)
{
    Action action;

    if (objToAction.TryGetValue(collision.gameObject, out action))
    {
        //Execute the approprite code
        action();
    }
}

请注意,
objToAction
variabel应该设置为
static
,或者放置在附加到空游戏对象的另一个脚本中,以便您可以访问它。应该只有一个实例。

您需要使用
字典。这样就不需要所有
if
语句

这就是
词典
的外观:

public static Dictionary<GameObject, System.Action> objToAction = new Dictionary<GameObject, Action>();
字典中的关键是游戏对象(立方体),你也可以使用字符串(游戏对象的名称),但使用游戏对象更好。
字典中的值存储调用
OnCollisionCenter
时要执行的操作。所以应该在
if
语句中的代码应该放在这里。这是通过
操作
委托
完成的。您可以添加任意数量的游戏对象(立方体)

必须使用上述函数将这些多维数据集对象添加到字典中:

public GameObject prefab;

void Start()
{
    //Create new Cube
    GameObject obj = Instantiate(prefab);
    obj.name = "Cube001";

    //Add it to the Dictionary
    registerObject(obj, delegate { Debug.Log("Hit: " + obj.name); });
}
您的新
OnCollisionCenter
代码如下所示。如果需要声明,则无
。如果对象存在于
字典
中,则为每个关键游戏对象执行我们存储在
字典
值中的代码

void OnCollisionEnter(Collision collision)
{
    Action action;

    if (objToAction.TryGetValue(collision.gameObject, out action))
    {
        //Execute the approprite code
        action();
    }
}

请注意,
objToAction
variabel应该设置为
static
,或者放置在附加到空游戏对象的另一个脚本中,以便您可以访问它。应该只有一个实例。

使用标记而不是对象名称进行检查(并且只将
名称
放入
Debug.Log
)@UnholySheep标记仍然需要许多
if
语句。我认为OP希望删除执行此操作所需的许多
if
语句hi@UnholySheep,如果我使用标记,那么每个多维数据集本质上都是同一个对象,这会将我的问题扩散到多个多维数据集objects@toadflax每个对象都有唯一的名称吗?@toadflax如果给它们相同的标记,您仍然可以打印对象的唯一名称,正如我下面的解决方案所述。。。从而确定发生碰撞的唯一对象。游戏对象的所有信息都存储在碰撞对象中,该碰撞对象被传递到OnCollisionCenter函数Use tags,而不是对象名称进行检查(并且只将
名称
放入
调试.Log
)@UnholySheep Tag仍然需要许多
if
语句。我认为OP希望删除执行此操作所需的许多
if
语句hi@UnholySheep,如果我使用标记,那么每个多维数据集本质上都是同一个对象,这会将我的问题扩散到多个多维数据集objects@toadflax是ea吗