使用相交球(OverlapSphere)阻挡物体穿过。

通过指定半径和物体的中心位置,画出一个相交球。通过相交球进行检测,如果检测中有搜索到Collider的话,进行位置修复。
先判断相交球的位置是否在碰到的collider里面,如果在里面往物体的位置和向相交球的位置反方向移出。通过ColliderClosestPointOnBounds(Vector3 point)来获取相交球和目标collider应该的接触点,把相交球的中心点往反向移动半径位置。达到相交的位置来阻挡物体穿过

collider.ClosestPointOnBounds(Vector3 point)
只能获取到collider外部的点在collider的bounds上的最接近的位置,如果检测点在collider内部的话,会一直返回检测点。

代码:

 Vector3 PointDebug(Vector3 toPos)
  {
    int layerMask = 1 << LayerMask.NameToLayer(Global.TAG_ABSORB) | 1 << LayerMask.NameToLayer(Global.TAG_GOAL) | 1 << LayerMask.NameToLayer(Global.TAG_SUPPLY) | 1 << LayerMask.NameToLayer("BallNode") | 1<<LayerMask.NameToLayer("Default");
    layerMask = ~layerMask;
    Vector3 pos = toPos + colliderComp.center;
    float radius = colliderComp.radius * transform.localScale.x;
    Collider[] colliders = Physics.OverlapSphere(pos, radius, layerMask);
    if (colliders.Length <= 0) return toPos;
    else
    {

      Vector3 testPos = toPos;

      Collider collider = colliders[0];
      bool inCollider = collider.bounds.Contains(testPos);
      while (inCollider)
      {
        Vector3 d = testPos - collider.gameObject.transform.position;
        testPos += d.normalized * radius;
        inCollider = collider.bounds.Contains(testPos);
      }
      Vector3 pointOnBound = collider.ClosestPointOnBounds(testPos);

      Vector3 dir = pointOnBound - collider.gameObject.transform.position;
      dir.y = 0;
      
      Vector3 dis = dir.normalized * radius;

      toPos = pointOnBound + dis;

      return toPos;
    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值