public static bool ClosestPointOnSurface(Collider collider, Vector3 to, float radius, out Vector3 closestPointOnSurface) { if (collider is BoxCollider) { closestPointOnSurface = SuperCollider.ClosestPointOnSurface((BoxCollider)collider, to); return(true); } else if (collider is SphereCollider) { closestPointOnSurface = SuperCollider.ClosestPointOnSurface((SphereCollider)collider, to); return(true); } else if (collider is CapsuleCollider) { closestPointOnSurface = SuperCollider.ClosestPointOnSurface((CapsuleCollider)collider, to); return(true); } else if (collider is MeshCollider) { RPGMesh rpgMesh = collider.GetComponent <RPGMesh>(); if (rpgMesh != null) { closestPointOnSurface = rpgMesh.ClosestPointOn(to, radius, false, false); return(true); } BSPTree bsp = collider.GetComponent <BSPTree>(); if (bsp != null) { closestPointOnSurface = bsp.ClosestPointOn(to, radius); return(true); } BruteForceMesh bfm = collider.GetComponent <BruteForceMesh>(); if (bfm != null) { closestPointOnSurface = bfm.ClosestPointOn(to); return(true); } } else if (collider is TerrainCollider) { closestPointOnSurface = SuperCollider.ClosestPointOnSurface((TerrainCollider)collider, to, radius, false); return(true); } Debug.LogError(string.Format("{0} does not have an implementation for ClosestPointOnSurface; GameObject.Name='{1}'", collider.GetType(), collider.gameObject.name)); closestPointOnSurface = Vector3.zero; return(false); }
public static Vector3 ClosestPointOnSurface(Collider collider, Vector3 to, float radius) { if (collider is BoxCollider) { return(SuperCollider.ClosestPointOnSurface((BoxCollider)collider, to)); } else if (collider is SphereCollider) { return(SuperCollider.ClosestPointOnSurface((SphereCollider)collider, to)); } else if (collider is CapsuleCollider) { return(SuperCollider.ClosestPointOnSurface((CapsuleCollider)collider, to)); } else if (collider is MeshCollider) { RPGMesh rpgMesh = collider.GetComponent <RPGMesh>(); if (rpgMesh != null) { return(rpgMesh.ClosestPointOn(to, radius, false, false)); } BSPTree bsp = collider.GetComponent <BSPTree>(); if (bsp != null) { return(bsp.ClosestPointOn(to, radius)); } BruteForceMesh bfm = collider.GetComponent <BruteForceMesh>(); if (bfm != null) { return(bfm.ClosestPointOn(to)); } } else if (collider is TerrainCollider) { return(SuperCollider.ClosestPointOnSurface((TerrainCollider)collider, to, radius, false)); } Debug.LogError(string.Format("{0} does not have an implementation for ClosestPointOnSurface", collider.GetType())); return(Vector3.zero); }
public static Vector3 ClosestPointOnSurface(Collider collider, Vector3 to, float radius) { if (collider is BoxCollider) { return(SuperCollider.ClosestPointOnSurface((BoxCollider)collider, to)); } else if (collider is SphereCollider) { return(SuperCollider.ClosestPointOnSurface((SphereCollider)collider, to)); } else if (collider is CapsuleCollider) { return(SuperCollider.ClosestPointOnSurface((CapsuleCollider)collider, to)); } else if (collider is MeshCollider) { RPGMesh rpgMesh = collider.GetComponent <RPGMesh>(); if (rpgMesh != null) { return(rpgMesh.ClosestPointOn(to, radius, false, false)); } BSPTree bsp = collider.GetComponent <BSPTree>(); if (bsp != null) { return(bsp.ClosestPointOn(to, radius)); } BruteForceMesh bfm = collider.GetComponent <BruteForceMesh>(); if (bfm != null) { return(bfm.ClosestPointOn(to)); } } else if (collider is TerrainCollider) { return(SuperCollider.ClosestPointOnSurface((TerrainCollider)collider, to, radius, false)); } return(Vector3.zero); }
public static Vector3 ClosestPointOnSurface(Collider collider, Vector3 to, float radius) { if (collider is BoxCollider) { return(SuperCollider.ClosestPointOnSurface((BoxCollider)collider, to)); } else if (collider is SphereCollider) { return(SuperCollider.ClosestPointOnSurface((SphereCollider)collider, to)); } else if (collider is MeshCollider) { RPGMesh rpgMesh = collider.GetComponent <RPGMesh>(); if (rpgMesh != null) { return(rpgMesh.ClosestPointOn(to, radius, false, false)); } } return(Vector3.zero); }
void PushBack() { if (spheres != null) { for (int i = 0; i < spheres.Length; ++i) { CollisionSphere s = spheres[i]; if (s != null) { foreach (Collider collider in Physics.OverlapSphere(OffsetPosition(s.Offset), bodyRadius, walkable)) { Vector3 position = OffsetPosition(s.Offset); Vector3 contactPoint = Vector3.zero; if (collider is BoxCollider) { contactPoint = RPGCollisions.ClosestPointOn((BoxCollider)collider, position); } else if (collider is SphereCollider) { contactPoint = RPGCollisions.ClosestPointOn((SphereCollider)collider, position); } else if (collider is MeshCollider) { RPGMesh rpgMesh = collider.GetComponent <RPGMesh>(); if (rpgMesh != null) { contactPoint = rpgMesh.ClosestPointOn(position, bodyRadius, displayDebugInfo, displayExtendedDebugInfo); } else { // Make last ditch try for convex colliders MeshCollider mc = (MeshCollider)collider; if (mc.convex) { contactPoint = mc.ClosestPointOnBounds(position); } else { continue; } } } else if (collider is CapsuleCollider) { Debug.LogWarning("[RPGMotor] CapsuleCollider not supported"); } else if (collider is TerrainCollider) { } else if (collider is WheelCollider) { Debug.LogWarning("[RPGMotor] WheelColliders not supported"); } else { continue; } if (contactPoint != Vector3.zero) { // If the sphere is feet // We have a ground and we're touching // And the sphere position is above the contact position // We should ignore it if (s.IsFeet && HasGround && CurrentGround.IsTouching && position.y > contactPoint.y) { continue; } // If this is the head sphere // And we're jumping // And we hit the "top" of the sphere, abort jumping if (s.IsHead && IsJumping && contactPoint.y > (position.y + bodyRadius * 0.25f)) { JumpDone(null); } // Vector from contact point to position Vector3 v = position - contactPoint; // Draw debug line if (displayDebugInfo) { Debug.DrawLine(position, contactPoint, Color.red); } // Display extend debug info if (displayExtendedDebugInfo) { Debug.Log("[RPGMotor] Contact point " + contactPoint); } // Move object away from collision target.position += Vector3.ClampMagnitude(v, Mathf.Clamp(bodyRadius - v.magnitude, 0, bodyRadius)); } } } } } }
void PushBack() { if (spheres != null) { for (int i = 0; i < spheres.Length; ++i) { CollisionSphere s = spheres[i]; if (s != null) { foreach (Collider collider in Physics.OverlapSphere(OffsetPosition(s.Offset), bodyRadius, walkable)) { Vector3 position = OffsetPosition(s.Offset); Vector3 contactPoint = Vector3.zero; if (collider is BoxCollider) { contactPoint = RPGCollisions.ClosestPointOn((BoxCollider)collider, position); } else if (collider is SphereCollider) { contactPoint = RPGCollisions.ClosestPointOn((SphereCollider)collider, position); } else if (collider is MeshCollider) { RPGMesh rpgMesh = collider.GetComponent <RPGMesh>(); if (rpgMesh != null) { contactPoint = rpgMesh.ClosestPointOn(position, bodyRadius, displayDebugInfo, displayExtendedDebugInfo); } else { MeshCollider mc = (MeshCollider)collider; if (mc.convex) { contactPoint = mc.ClosestPointOnBounds(position); } else { continue; } } } else if (collider is CapsuleCollider) { } else if (collider is TerrainCollider) { } else if (collider is WheelCollider) { Debug.LogWarning("[RPGMotor] WheelColliders not supported"); } else { continue; } if (contactPoint != Vector3.zero) { //如果这个sphere是脚 //我们接触一个地面 //并且球的位置在接触位置之上 //我们应该忽略它 if (s.IsFeet && HasGround && CurrentGround.IsTouching && position.y > contactPoint.y) { continue; } //如果这个球是头 //并且跳跃 //并且撞到了头,就终止跳跃 if (s.IsHead && IsJumping && contactPoint.y > (position.y + bodyRadius * 0.25f)) { JumpDone(null); } Vector3 v = position - contactPoint; if (displayDebugInfo) { Debug.DrawLine(position, contactPoint, Color.red); } if (displayExtendedDebugInfo) { //Debug.Log("[RPGMotor] Contact point " + contactPoint); } target.position += Vector3.ClampMagnitude(v, Mathf.Clamp(bodyRadius - v.magnitude, 0, bodyRadius)); } } } } } }