c# - 如何在检查碰撞的同时将 RigidBody2D 移动到某个位置
问题描述
我目前正在 Unity 中创建一个游戏,您可以在其中使用OnMouseDrag()
、 aCircleCollider2D
和 a移动球RigidBody2D
。这就是我设置球的位置的方式:
private void OnMouseDrag()
{
Vector2 mouseInWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition);
playerRb.position = new Vector3(mouseInWorld.x, mouseInWorld.y, 0);
}
当鼠标四处移动时,我仍然希望球在碰撞时滑动。有没有办法做到这一点?
我试过RigidBody2D.MovePosition()
了,但是球从一个点跳到另一个点,Raycast
但也无法让它发挥作用。
编辑:这就是我现在得到的:
playerRb.velocity = new Vector3(mouseInWorld.x - playerRb.position.x, mouseInWorld.y - playerRb.position.y, 0);
现在的问题是,球落后于 mousePosition。
解决方案
当您使用 RigidBody.MovePosition 时,您不会调用物理引擎,因此它会忽略碰撞。如果你想发生碰撞,你需要使用 RigidBody.Velocity 来代替。
进行此更改将需要您对代码进行一些更改,因为您提供给 RigidBody.Velocity 的是速度而不是位置,因此您需要计算 x,y 所需的速度(如果您在 3d 中,则需要计算 z ) 到达目的地。
我邀请您阅读有关速度的 Unity 页面以获取更多信息 https://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html
推荐阅读
- neo4j - 如何在 Neo4j 中删除未连接的节点属性
- objective-c - 从 Objective-C 到 Swift 4 的一行代码
- linux - /tmp/sqlite-3.7.2-libsqlitejdbc.so:未定义符号:pthread_mutexattr_init
- java - Google Fit 查询手动启动的活动
- package - julia - 如何修复未知包错误?
- ajax - Laravel 基本 AJAX 请求不起作用?
- javascript - MongoDB mongoose 弃用警告
- excel - Excel VBA用户表单在服务器上使用用户名和密码登录
- php - 在 Yii2 中更新作曲家时,系统中缺少请求的 PHP 扩展 ext-soap *
- javascript - Promise.all 和 for-await-of 的表现