Unity3d 应用高速跟踪一个目标时忽略Unity 2D碰撞

Unity3d 应用高速跟踪一个目标时忽略Unity 2D碰撞,unity3d,2d,Unity3d,2d,我的游戏基本上是关于多个玩家对象,这些对象跟随鼠标位置,每个对象都有CircleCollider组件,但当玩家彼此如此接近时,它们不会碰撞并开始重合 有没有办法在每个玩家面前检测游戏对象,使其速度为零,如果玩家的视线是空的,它可以直接向前移动 我认为这可以通过在玩家的上方向向量中获得第一次接触并比较GameObject的标签来实现,然后如果它是player,则自我速度设置为零 假设您的对象使用RigidBody2D组件,您可以尝试将碰撞检测模式从“离散”更改为“连续” 要阻止对象相互推压,请将此

我的游戏基本上是关于多个玩家对象,这些对象跟随鼠标位置,每个对象都有
CircleCollider
组件,但当玩家彼此如此接近时,它们不会碰撞并开始重合

有没有办法在每个玩家面前检测
游戏对象
,使其速度为零,如果玩家的视线是空的,它可以直接向前移动

我认为这可以通过在玩家的上方向向量中获得第一次接触并比较
GameObject
的标签来实现,然后如果它是
player
,则自我速度设置为零


假设您的对象使用
RigidBody2D
组件,您可以尝试将碰撞检测模式从“离散”更改为“连续”

要阻止对象相互推压,请将此代码置于移动对象的代码之前:

    Vector2 difference = target - (Vector2)transform.position;
    RaycastHit2D[] hit = new RaycastHit2D[1];
    if (Physics2D.CircleCast(transform.position, radius, difference.normalized, new ContactFilter2D(), hit, difference.magnitude) > 0) {
        // Something is in the way
        float firstObstacleDistance = hit[0].distance;
        target = difference.normalized * firstObstacleDistance;
    }

变量
target
应该是鼠标位置,
radius
圆环镜组件的半径。

假设您的对象使用
刚体2D
组件,您可以尝试将碰撞检测模式从“离散”更改为“连续”

要阻止对象相互推压,请将此代码置于移动对象的代码之前:

    Vector2 difference = target - (Vector2)transform.position;
    RaycastHit2D[] hit = new RaycastHit2D[1];
    if (Physics2D.CircleCast(transform.position, radius, difference.normalized, new ContactFilter2D(), hit, difference.magnitude) > 0) {
        // Something is in the way
        float firstObstacleDistance = hit[0].distance;
        target = difference.normalized * firstObstacleDistance;
    }

变量
target
应该是鼠标位置,
radius
CircleCollider
组件的半径。

您的对象设置为连续物理还是离散物理?@Draco18s设置为离散为什么?您的对象设置为连续物理还是离散物理?@Draco18s设置为离散为什么?原因是什么区别?我相信“离散”会检查每个
FixedUpdate
上的冲突,但“连续”会确保检查之间的点。假设一个对象每秒运行100个单位,即每
FixedUpdate
运行2个单位。如果两个对象的宽度均为1个单位,则它可能从对象的左侧移动到对象的右侧。如果是“连续的”,然后它会检查在每个
FixedUpdate
上它的开始和结束之间是否有一个对象。好的,谢谢我切换到
continuous
模式,但是当玩家跟随鼠标位置时,还有一个问题,他们似乎为了达到目标而战斗。玩家几乎没有办法使碰撞平滑如果他们不能达到目标,他们会移动吗?我制作了一个摩擦力为0的2D物理材料。但它并不完美。它一直落后。希望我更新的答案中的(未经测试的)代码能起作用。在编码之前,
目标
应设置为鼠标位置,
半径
设置为圆的半径。区别是什么?我相信“离散”会在每个
固定更新
上检查碰撞,但“连续”会确保检查两个点之间的点。假设一个对象每秒运行100个单位,即每
FixedUpdate
运行2个单位。如果两个对象的宽度均为1个单位,则它可能从对象的左侧移动到对象的右侧。如果是“连续的”,然后它会检查在每个
FixedUpdate
上它的开始和结束之间是否有一个对象。好的,谢谢我切换到
continuous
模式,但是当玩家跟随鼠标位置时,还有一个问题,他们似乎为了达到目标而战斗。玩家几乎没有办法使碰撞平滑如果他们不能达到目标,他们会移动吗?我制作了一个摩擦力为0的2D物理材料。但它并不完美。它一直落后。希望我更新的答案中的(未经测试的)代码能起作用。在编码之前,
target
应设置为鼠标位置,
radius
应设置为圆的半径。