C# 检测来自不同对象的碰撞?
我想不出一个合适的题目来回答这个问题,但我会解释的 我有一个碰撞框,里面有一个脚本。此脚本有一个if语句,用于检测来自对象“Cube001”的冲突,并将Debug.Log发送到控制台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
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吗