Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OnCollisionInter2D只调用一次_C#_Unity3d - Fatal编程技术网

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,即使我发现框碰撞线没有重叠。我的播放器对象在列处于运动状态时不是运动学的。这可能是精灵的问题吗?有关详细信息,请参阅我的项目文件: