C# OnCollisionInter2D只调用一次
我的场景中有两个对象,一个只有一个C# OnCollisionInter2D只调用一次,c#,unity3d,C#,Unity3d,我的场景中有两个对象,一个只有一个BoxCollider2D(列类),第二个对象有一个Rigibody2D,以及它自己的BoxCollider2D(播放器类) 我向第一个对象添加了一个脚本,使其具有OnCollisionInter2D。当我的第二个对象与它碰撞时,它会被触发,当它试图进入时,它会将我的第二个对象反弹回来 我确实看到调用了我的OnCollisionInter2D方法。但是,如果我将第二个对象再次移动到第一个对象,它将再次被反弹,但是我没有看到第二次调用我的OnCollisionIn
BoxCollider2D
(列类),第二个对象有一个Rigibody2D
,以及它自己的BoxCollider2D
(播放器类)
我向第一个对象添加了一个脚本,使其具有OnCollisionInter2D
。当我的第二个对象与它碰撞时,它会被触发,当它试图进入时,它会将我的第二个对象反弹回来
我确实看到调用了我的OnCollisionInter2D
方法。但是,如果我将第二个对象再次移动到第一个对象,它将再次被反弹,但是我没有看到第二次调用我的OnCollisionInter2D
方法
这是故意的行为吗?如果是这样的话,每次这两个对象之间发生碰撞时会调用什么方法
注意:我看到OnCollisionStay2D
又被呼叫了几次,然后它就停止了。我想这是当它把我的第二个物体弹出来的时候。我还看到,OnCollisionExit2D
从未被调用。我放大编辑器,清楚地看到BoxCollidater2D的绿线在我的对象之间没有重叠,因此它应该在反弹时退出碰撞
公共类列:MonoBehavior
{
私人专栏;
//在第一帧更新之前调用Start
void Start()
{
columnColl=GetComponent();
}
//每帧调用一次更新
无效更新()
{
}
私有空心OnCollisionExit2D(碰撞2D碰撞)
{
Log(“冲突退出”);
}
无效碰撞Stay2D(碰撞2D碰撞)
{
//Debug.Log(“冲突停止”);
}
空心OnCollisionInter2D(碰撞2D碰撞)
{
Log(“发生冲突”);
}
}
及
公共类玩家:单行为
{
公共浮点数xMoveSpeed=1f;
私有刚体2-d-rbody;
//在第一帧更新之前调用Start
void Start()
{
rbody=GetComponent();
}
//每帧调用一次更新
无效更新()
{
if(Input.GetKeyDown(“d”))
{
rbody.position=rbody.position+新矢量2(xMoveSpeed,0);
}
}
}
您不应该“手动”更改
宁可使用
使用Rigidbody.MovePosition移动刚体,符合刚体的插值设置
如果在刚体上启用刚体插值,则调用刚体.MovePosition
会在渲染的任何中间帧中的两个位置之间产生平滑过渡。如果要在每个FixedUpdate
中连续移动刚体,则应使用此选项
如果希望将刚体从一个位置传送到另一个位置,而不渲染中间位置,请改为设置刚体.position
你也应该在物理中使用它,而不是Update
void FixedUpdate()
{
if(Input.GetKeyDown(“d”))
{
rbody.MovePosition(rbody.position+新矢量2(xMoveSpeed,0);
}
}
还应确保至少有一个对象是非运动学的
:
仅当其中一个碰撞器还连接了非运动学的刚体时,才会发送碰撞事件
你不应该“手动”改变
宁可使用
使用Rigidbody.MovePosition移动刚体,符合刚体的插值设置
如果在刚体上启用刚体插值,则调用Rigidbody.MovePosition
会在渲染的任何中间帧中的两个位置之间产生平滑过渡。如果要在每个FixedUpdate
中连续移动刚体,则应使用此选项
如果希望将刚体从一个位置传送到另一个位置,而不渲染中间位置,请改为设置刚体.position
你也应该在物理中使用它,而不是Update
void FixedUpdate()
{
if(Input.GetKeyDown(“d”))
{
rbody.MovePosition(rbody.position+新矢量2(xMoveSpeed,0);
}
}
还应确保至少有一个对象是非运动学的
:
仅当其中一个碰撞器还连接了非运动学的刚体时,才会发送碰撞事件
你能给我们看一下你的代码吗?我用代码更新了原始帖子。你能给我们看一下你的代码吗?我用代码更新了原始帖子谢谢你的反馈。我按照建议将移动改为MovePosition(),现在移动看起来更平滑了。但是,问题仍然存在于OnCollisionInter2d()尽管框碰撞线没有重叠,但仍然只调用了一次,并且从未调用Exit。我的播放器对象在列重叠时没有运动学。这可能是精灵的问题吗?我附上了项目文件以了解详细信息:感谢反馈。我将移动更改为MovePosition()正如所建议的那样,现在的趋势似乎更加平稳了。然而,问题仍然存在于OnCollisionInter2d()中仍然只调用一次,并且永远不会调用Exit,即使我发现框碰撞线没有重叠。我的播放器对象在列处于运动状态时不是运动学的。这可能是精灵的问题吗?有关详细信息,请参阅我的项目文件: