0

在我的场景中,我在运行时实例化了一个预制件,它有一个动态 Rigidbody2D 和一个 BoxCollider2D;它还有一个带有 OnTriggerEnter2D 方法的脚本,它运行以下函数:

/* ... */
public Rigidbody2D rigidbody;

private void StopMovement()
{
    rigidbody = GetComponent<Rigidbody2D>();
    rigidbody.velocity = Vector2.zero;
    Debug.Log(rigidbody.velocity);
}

基本上我希望对象在与触发器发生碰撞时停止。问题是它不会停止,即使控制台消息说(0.0, 0.0)刚体的检查器看起来像这样:

在此处输入图像描述

正如你所看到的,它的速度实际上并不为零。我尝试添加

rigidbody.constraints = RigidbodyConstraints2D.FreezeAll;

但它所做的只是冻结 prefab 上的位置而不是实际的 gameObject 实例。而且我不明白这怎么可能,还考虑到脚本上的 Rigidbody 字段被 占据Ball(clone),这是场景中游戏对象的名称。我也尝试GetComponent在 Awake/Start 中使用,但结果是一样的。

我已经在此处和 UnityAnswers 上查找了许多其他帖子,但没有一个可以帮助我。究竟发生了什么?

4

2 回答 2

0

您正在访问预制件,而不是实际的 gameObjecy 和刚体。当你实例化球时,使用

'GameObject ballClone = Instantiate(ballpref, pos, quaternion);'

通过这种方式,您可以访问 ballClone.getcomponent() 并且它可以正常工作

于 2020-11-28T17:40:29.967 回答
0

事实证明,导致这种奇怪行为的原因与自定义事件系统有关,这就是为什么花了这么长时间才弄清楚的原因。基本上,我将预制件指定为事件侦听器检查器中的目标对象,认为它的效果会自动应用于该预制件的所有实例,但最终它不会那样工作。如果有人有同样的问题,我通过将 Event Listener 组件放在不同的目标对象上来解决它,所以基本上它引用了自己并导致预期的行为。

在此处输入图像描述

感谢大家的时间,现在可以关闭了。

于 2020-11-28T20:01:00.190 回答