【发布时间】:2020-11-28 13:41:13
【问题描述】:
在我的场景中,我在运行时实例化了一个预制件,它有一个动态 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;
但它所做的只是冻结 预制件上的位置,而不是实际的 gameObject 实例。而且我不明白这怎么可能,同时考虑到脚本上的 Rigidbody 字段被Ball(clone) 占据,这是场景中游戏对象的名称。
我也尝试在 Awake/Start 中使用 GetComponent 而不是在那里,但结果是一样的。
我已经在此处和 UnityAnswers 上查找了许多其他帖子,但没有一个可以帮助我。到底发生了什么?
【问题讨论】:
-
当我读到这篇文章“但它所做的只是冻结预制件上的位置,而不是实际的游戏对象实例”时,我不确定你在追求什么。当你说球在击中扳机时应该停止时,你到底在追求什么?
-
我不确定我是否理解您的问题。我有一个在我的场景中移动的游戏对象,我希望它停止移动,就是这样。实际发生的是脚本以预制文件(项目中存在的文件,而不是场景中的文件)为目标,而不是场景中的对象。看到
Constraints下拉菜单下的那些复选框了吗?当函数运行时,它们会在预制件中发生变化,但不会在场景对象上发生变化。
标签: unity3d rigid-bodies prefab