c# - OnCollisionEnter2D 只被调用一次
问题描述
我的场景中有两个对象,一个只有一个BoxCollider2D
(Column 类),第二个对象有一个Rigibody2D
以及它自己的BoxCollider2D
(Player 类)。
我在第一个对象中添加了一个脚本以具有OnCollisionEnter2D
. 我看到当我的第二个对象与它碰撞时它会被触发,并且当它试图进入时它会将我的第二个对象弹回。
我确实看到我的OnCollisionEnter2D
方法被调用了。但是,如果我再次将我的第二个对象移动到我的第一个对象上,它会再次反弹回来,但是我没有看到我的OnCollisionEnter2D
方法第二次被调用。
这是预期的行为吗?如果是这样,每次这两个对象之间发生碰撞时会调用什么方法?
注意:我看到OnCollisionStay2D
被叫了几次,然后就停止了。我认为这是它弹起我的第二个物体的时候。我也看到OnCollisionExit2D
从未被调用过。我放大编辑器,清楚地看到 BoxCollider2D 的绿线在我的对象之间没有重叠,所以当它反弹回来时应该已经退出了碰撞。
public class Column : MonoBehaviour
{
private BoxCollider2D columnColl;
// Start is called before the first frame update
void Start()
{
columnColl = GetComponent<BoxCollider2D>();
}
// Update is called once per frame
void Update()
{
}
private void OnCollisionExit2D(Collision2D collision)
{
Debug.Log("Collision Exit");
}
void OnCollisionStay2D(Collision2D collision)
{
//Debug.Log("Collision Stayed");
}
void OnCollisionEnter2D(Collision2D collision)
{
Debug.Log("Collision Happened");
}
}
和
public class Player : MonoBehaviour
{
public float xMoveSpeed = 1f;
private Rigidbody2D rbody;
// Start is called before the first frame update
void Start()
{
rbody = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown("d"))
{
rbody.position = rbody.position + new Vector2(xMoveSpeed, 0);
}
}
}
解决方案
你不应该“手动”改变rbody.position
。
使用 Rigidbody.MovePosition 移动刚体,符合刚体的插值设置。
如果在刚体上启用刚体插值,则调用
Rigidbody.MovePosition
会导致渲染的任何中间帧中两个位置之间的平滑过渡。如果您想在每个FixedUpdate
.
Rigidbody.position
如果您想将刚体从一个位置传送到另一个位置,而不渲染中间位置,请改为设置。
你也应该这样做,FixedUpdate
其中用于物理而不是Update
void FixedUpdate()
{
if (Input.GetKeyDown("d"))
{
rbody.MovePosition(rbody.position + new Vector2(xMoveSpeed, 0);
}
}
还要确保至少有一个对象不是 kinematic
OnCollisionEnter :
仅当其中一个碰撞器还附加了非运动学刚体时,才会发送碰撞事件。
推荐阅读
- c# - 是否可以在 web api 中对响应进行硬编码?
- sql - SQL - 减去两个连续记录中的日期,然后找到平均值
- sql - Postgres 不会使用正确的索引
- ios - iOS 深色模式和主题
- node.js - 反应应用程序出错:拒绝连接到 postgre DB
- javascript - SAPUI5:如果我只有对象,如何从 sap.m.list 中找到该项目?
- javascript - 使用 $.get 方法分配数据属性
- python - 数据清理(地址)Python
- c - Cython:从类型化的 memoryview 数组中读取值的最快方法是什么?
- r - !包 inputenc 错误:Unicode 字符 λ (U+03BB) (inputenc) 未设置为与 LaTeX 一起使用。尝试在 RMD 中编织时