Unity:OnCollisionEnter 仅在新条目时触发,但不会在具有相同名称的不同对象上的新条目时触发
Posted
技术标签:
【中文标题】Unity:OnCollisionEnter 仅在新条目时触发,但不会在具有相同名称的不同对象上的新条目时触发【英文标题】:Unity: OnCollisionEnter fires only on NEW entry, but not on NEW entry on different object with same name 【发布时间】:2019-02-07 12:48:34 【问题描述】:我正在构建一个带有出现框的平台游戏。一旦玩家击中它,盒子就会被渲染。这工作得很好:
public class AppearingBoxes : MonoBehaviour
public GameObject Block, RageFace;
bool showBlock = false;
void Start()
showBlock = false;
void OnCollisionEnter(Collision2D col)
if (col.gameObject.name == "Birdy")
showBlock = true;
void FixedUpdate()
Block.GetComponent<Renderer>().enabled = showBlock;
RageFace.GetComponent<Renderer>().enabled = showBlock;
这个脚本附在所有这些盒子上。每个盒子都是一个单独的盒子,但都具有相同的脚本、属性和名称:
但是问题来了。只有第一个 HIT 会触发一个框。正如你可以想象的那样,玩家跳到那些看不见的盒子上,然后触发他击中的那个。玩家现在向前移动到仍然不可见的其他框并进入那里的碰撞框。然而他们没有出现。我相信这是因为玩家仍然在“相同”的碰撞箱中,即使它是一个不同的预制对象。如果我跳到看不见的平台上,然后又回到它上面(我离开然后重新进入扳机),我降落的盒子会立即出现。
那么,即使玩家之前没有离开过盒子的碰撞箱,我该怎么做才能让盒子在玩家触摸它时立即出现?
谢谢! :)
【问题讨论】:
在您玩游戏时是否已将Block
和RageFace
分配给它们对应的gameobjects
?
为什么你不在 if 语句中将 Renderer
设置为 true 并使用 FixedUpdate
?你可以写if (col.gameObject.name == "Birdy") Block.GetComponent<Renderer>().enabled = true
你好,是的,他们当然都被分配了。如果他们没有,无论我是否跳到他们身上,他们都不会出现。但他们确实出现了,但不幸的是只有在第二次进入他们的碰撞箱后才出现。另外,我在fixedUpdate中这样做是因为只是检查碰撞有一点延迟,我这样做了......
直接启用渲染器导致的延迟通过在以后使用FixedUpdate
调用它来消除是没有意义的@^^
另请注意,使用您的脚本而不更改任何内容 worked for me 具有非常基本的设置 BoxCollider2D
和 RigidBody2D
(仅用于测试我将一些 AppearingBoxes 分开,其他重叠并使用不同高度)->没问题
【参考方案1】:
尝试将框碰撞器更改为 isTrigger 并改用 OnTriggerEnter2D
或者可能是因为您使用 OnCollisionEnter 而不是 OnCollisionEnter2D ?
【讨论】:
我不认为这只是一个错字,因为OP声称它在第二次进入时可以工作......在你的情况下它根本不起作用 抱歉,我的代码中有错字。 Ofc 它是 OnEnter2D。也将它们更改为触发器并没有改变任何东西:(【参考方案2】:您的代码有问题。我不知道您是错过了还是错字了,但是您不能将OnCollisionEnter
与Collision2D
参数一起使用。你的游戏会运行,但它一定会给你这个错误信息:
Script error: OnCollisionEnter
This message parameter has to be of type: Collision
The message will be ignored.
改用OnCollisionEnter2D
void OnCollisionEnter2D(Collision2D col)
if (col.gameObject.name == "Birdy")
showBlock = true;
【讨论】:
我不认为这只是一个错字,因为OP声称它在第二次进入时可以工作......在你的情况下它根本不起作用 谢谢,但这只是一个错字。它说Enter2D。否则 Unity 会给我错误:)【参考方案3】:大家,我确实找到了一个“解决方法”它仍然不能真正解释这个问题,但仍然有效......
我所做的是将每个盒子的 BoxCollider 的大小增加一点点。比玩家站立的实际盒子大 3 个像素。这解决了这个问题,但让我想知道:如果玩家没有“真正”与对撞机发生碰撞,他会摔倒。但他没有。现在对撞机稍微大了一点,一切都被完美地触发了。也许是引擎的错误?
感谢大家的帮助
【讨论】:
【参考方案4】:他没有摔倒,因为对撞机不是触发器,仅此而已。
【讨论】:
以上是关于Unity:OnCollisionEnter 仅在新条目时触发,但不会在具有相同名称的不同对象上的新条目时触发的主要内容,如果未能解决你的问题,请参考以下文章
Unity 在没有 IsTrigger 的情况下使用 OnCollisionEnter2D 检测碰撞
Unity3d游戏开发unity3D OnTriggerEnter和OnCollisionEnter的一点个人心得(转载)
Unity3d中 OnTriggerEnter(Collider other) 和OnCollisionEnter(Collision other)对比
Unity3d碰撞体刚体OnTriggerEnter和OnCollisionEnter用法与区别