gpt4 book ai didi

c# - 使用多个碰撞器查找参与 GameObject 碰撞的两个碰撞器

转载 作者:行者123 更新时间:2023-12-05 04:05:50 28 4
gpt4 key购买 nike

总结如下:我想从 OnTriggerEnter2D 事件中找到参与碰撞的两个对撞机。我该怎么做?

我有两个游戏对象。两者都有一个碰撞器和一个触发器。

在对象 A 上,它被触发器包围。在对象 B 上,触发器仅围绕特定部分。

当对象 A 的触发器接触到对象 B 的任何碰撞器(无论是否触发)时:我希望对象 B 失去健康。反之亦然。

但是,当对象 A 的触发器接触到对象 B 的碰撞器(而非触发器)时,两个对象都会失去生命值。

我在控制台中得到了这个

Object A hit Object B
Object B hit Object A

我得出结论,对象 A 的触发器正在调用对象 B 的 Ontrigger2d 事件。

我认为解决这个问题的最好方法是找到哪个对撞机“发现”了碰撞,并据此:忽略碰撞..

如何找到哪个触发器“发现”了碰撞?

[也在 Unity 论坛上发布]

编辑:代码

private void OnTriggerEnter2D(Collider2D collision)
{
Consumeable con = collision.GetComponentInParent<Consumable>();

if (con != null && con.gameObject != gameObject)
{
Debug.Log(gameObject.name + " hit " + con.gameObject.name);

con.Damage(1);
}
}

最佳答案

To sum it up, I want to find both colliders involved in a collision

当您的脚本继承自 MonoBehaviour 时,会声明一个 gameObject 变量。这个变量指的是这个脚本附加到的游戏对象。您可以使用该 gameObject 变量获取一个 GameObject,并从 OnTriggerEnter 函数中的 Collider2D 参数获取另一个。

void OnTriggerEnter2D(Collider2D collision)
{
GameObject obj1 = this.gameObject;
GameObject obj2 = collision.gameObject;

Debug.Log("Triggered Obj1: :" + obj1.name);
Debug.Log("Triggered obj2: :" + obj2.name);
}

编辑:

The objects are useless to me. I need the colliders. And no, I can't use 'getcomponent' because they have more than one collider, and I need only the ones in the collision

碰撞器应该成为 GameObject 的子对象,并且脚本必须附加到每个子碰撞器,然后这个答案中的内容应该起作用。


如果出于某种原因您必须在不使碰撞器成为该游戏对象的子对象的情况下执行此操作,则使用 bool 变量仅检测碰撞一次

这是对来自 this 的答案的修改发布。

有一个名为 theOtherCollider 的本地 Collider2D 变量来存储调用 OnTriggerEnter2D 时首先报告的碰撞数据然后有另一个 bool 值 名为 detectedBefore 的变量以确定之前是否调用过 OnTriggerEnter2D

调用 OnTriggerEnter2D 时,检查 boolean 变量的 local/this 版本是否为 false。如果它不是 true,那么这是第一次调用 OnTriggerEnter2D。使用 GetComponent 获取其他脚本,然后将 other 脚本的 boolean 变量设置为 true。同时,还使用 ​​OnTriggerEnter2D 中的 Collider2D 值初始化 other 脚本上的 theOtherCollider 变量功能。

现在,如果 OnTriggerEnter2D 被调用并且 boolean 变量的 local/this 版本为 true,将其设置为 false 以重置它,然后使用 theOtherCollider 变量和 OnTriggerEnter2D 函数中的 Collider2D 变量获取碰撞器.

这可能会造成混淆,但通过查看代码,更容易理解。

注意:

YOURSCRIPTOnTriggerEnter2D 函数所在的脚本名称,它附加到 Colliders。您必须将其更改为该脚本的任何名称。

public bool detectedBefore = false;
public Collider2D theOtherCollider;

void OnTriggerEnter2D(Collider2D collision)
{
//Get both colliders then exit if we have already ran this code below
if (detectedBefore)
{
//Reset
detectedBefore = false;

//Get both Colliders once below
Collider2D col1 = theOtherCollider;
Collider2D col2 = collision;

Debug.Log("Triggered Obj1: " + col1.name);
Debug.Log("Triggered obj2: " + col2.name);

return; //EXIT the function
}

//Set the other detectedBefore variable to true then set get the first Collider
YOURSCRIPT myScript = collision.gameObject.GetComponent<YOURSCRIPT>();
if (myScript)
{
myScript.detectedBefore = true;
myScript.theOtherCollider = collision;
}

}

关于c# - 使用多个碰撞器查找参与 GameObject 碰撞的两个碰撞器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50658748/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com