Unity3d 刚体2D不';停不下来

Unity3d 刚体2D不';停不下来,unity3d,rigid-bodies,prefab,Unity3d,Rigid Bodies,Prefab,在我的场景中,我在运行时实例化一个预置,它有一个动态Rigidbody2D和一个BoxCollizedR2D; 它还有一个带有OnTiggerEnter2D方法的脚本,该脚本运行以下函数: /* ... */ public Rigidbody2D rigidbody; private void StopMovement() { rigidbody = GetComponent<Rigidbody2D>(); rigidbody.velocity = Vector2.

在我的场景中,我在运行时实例化一个预置,它有一个动态Rigidbody2D和一个BoxCollizedR2D; 它还有一个带有OnTiggerEnter2D方法的脚本,该脚本运行以下函数:

/* ... */
public Rigidbody2D rigidbody;

private void StopMovement()
{
    rigidbody = GetComponent<Rigidbody2D>();
    rigidbody.velocity = Vector2.zero;
    Debug.Log(rigidbody.velocity);
}
但它所做的只是冻结预置上的位置,而不是实际的游戏对象实例上的位置。我不明白这是怎么可能的,同时考虑到脚本上的刚体字段被
Ball(clone)
占据,这是场景中游戏对象的名称。 我还尝试在Awake/Start中而不是在那里使用
GetComponent
,但结果是一样的


我已经在这里和UnityAnswers上查找了很多其他帖子,但是没有一个能帮到我。到底发生了什么?

您访问的是预设,而不是实际的游戏对象,因此是刚体。当您实例化球时,请使用

'GameObject ballClone=实例化(ballpref、pos、四元数);'


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

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


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

我不知道我读到这篇文章时你在想什么,“但它所做的只是冻结预置上的位置,而不是在实际的游戏对象实例上”。当你说球扣动扳机时应该停下来,你到底在追求什么?我不确定我是否理解你的问题。我有一个在我的场景中移动的游戏对象,我希望它停止移动,就是这样。实际上,脚本的目标是预设文件(项目中存在的文件,而不是场景),而不是场景中的对象。查看
约束
下拉列表下的复选框?当函数运行时,它们会在预设中更改,但不会在场景对象上更改。感谢您的回答和时间。是的,你的解决方案确实有效,但我还是不明白为什么我的不起作用。您的意思是,除非在实例化后立即将预制实例保存在字段中,否则无法在运行时影响预制实例?预设在实例化后不应该像普通游戏对象那样工作吗?不,因为如果你使用一个公共游戏对象,并在其中拖动一个预设,你将简单地控制该预设。预置和其他对象一样只是一个对象,但是当你实例化它时,你正在克隆它,但是如果你调用你实例化的变量,你正在访问预置本身。我有用吗?我认为,通过将一个预置分配给一个Inspector字段,它将自动针对从该预置创建的所有未来实例。我已经发现事实并非如此,不过还是要谢谢你!不,但如果您放置一个标记并使用GameObject[]copies=GameObject.FindGameObjectsSwithTag(),您可以找到实例化的每个对象和每个克隆;如果您愿意,请向上投票:)谢谢您的评论和时间,但我已经找到了一个解决方案,它不涉及在运行时查找引用,您可以从我自己对这个问题的回答中看到:)
rigidbody.constraints = RigidbodyConstraints2D.FreezeAll;