private void SetVectorInPath(JSColliderBase collider, Vector3 start, Vector3 end, List <Vector3> vectorInDirection) { JSColliderBase hitCollider = ColliderInPath(collider, start, end); if (hitCollider != null) { if (collider.SelfColliderType == ColliderType.Character && hitCollider.SelfColliderType == ColliderType.Obstacle) { vectorInDirection.Add(ClosestVectorBetweenCharacterAndObstacle((JSCharacterCollider)collider, (JSObstacleCollider)hitCollider, start, ((JSCharacterCollider)collider).SelfCollider.radius, vectorInDirection)); start = vectorInDirection [vectorInDirection.Count - 1]; SetVectorInPath(collider, start, end, vectorInDirection); } else if (collider.SelfColliderType == ColliderType.Character && hitCollider.SelfColliderType == ColliderType.Character) { vectorInDirection.Add(ClosestVectorBetweenCharacterAndCharacter((JSCharacterCollider)collider, (JSCharacterCollider)hitCollider, start, end, vectorInDirection)); start = vectorInDirection [vectorInDirection.Count - 1]; SetVectorInPath(collider, start, end, vectorInDirection); } else { return; } } }
public Vector3[] GetDirectllyVectorInPath(JSColliderBase collider, Vector3 start, Vector3 end) { vectorInPath.Clear(); JSColliderBase hitCollider = ColliderInPath(collider, start, end); if (hitCollider != null) { if (hitCollider.selfCollider.bounds.Intersects(collider.selfCollider.bounds)) { return(null); } else if (hitCollider.SelfColliderType == ColliderType.Obstacle) { end = GetObstacleDirectllyColliderVector((JSObstacleCollider)hitCollider, start, end, ((JSCharacterCollider)collider).SelfCollider.radius); } else if (hitCollider.SelfColliderType == ColliderType.Character) { end = GetCharacterDirectllyColliderVector((JSCharacterCollider)hitCollider, start, end, ((JSCharacterCollider)collider).SelfCollider.radius); } } vectorInPath.Add(start); vectorInPath.Add(end); DrawDirectllyLine(start, end); return(vectorInPath.ToArray()); }
private void CheckSkipVector(JSColliderBase collider) { for (int i = 0; i < vectorInPath.Count - 1; ++i) { if (removeVectorIndexInPath.Contains(i)) { continue; } else { if (collider.SelfColliderType == ColliderType.Character) { int[] vectors = RemoveSkipVector(i, vectorInPath.Count, ((JSCharacterCollider)collider).SelfCollider.radius); if (vectors != null) { for (int j = 0; j < vectors.Length; ++j) { if (!removeVectorIndexInPath.Contains(vectors [j])) { removeVectorIndexInPath.Add(vectors [j]); } } } } } } removeVectorIndexInPath.Sort(); for (int i = removeVectorIndexInPath.Count - 1; i >= 0; --i) { vectorInPath.RemoveAt(removeVectorIndexInPath [i]); } }
private JSColliderBase ColliderInPath(JSColliderBase collider, Vector3 start, Vector3 end) { Collider hitCollider = null; float hitDistance = 0; Vector3 rayDirectionVector = Vector3.Normalize(end - start); float rayDirectionDistance = Vector3.Distance(start, end); foreach (RaycastHit hit in Physics.RaycastAll(start, rayDirectionVector, rayDirectionDistance)) { if (hit.collider != collider.selfCollider) { hitCollider = hit.collider; hitDistance = hit.distance; break; } } if (collider.SelfColliderType == ColliderType.Character) { Vector3 sideStart_1 = start + VerticalQuaternionUp * rayDirectionVector * ((JSCharacterCollider)collider).SelfCollider.radius; foreach (RaycastHit hit in Physics.RaycastAll(sideStart_1, rayDirectionVector, rayDirectionDistance)) { if (hit.collider != collider.selfCollider) { if (hitDistance == 0 || hit.distance < hitDistance) { hitCollider = hit.collider; hitDistance = hit.distance; } break; } } Vector3 sideStart_2 = start + VerticalQuaternionDown * rayDirectionVector * ((JSCharacterCollider)collider).SelfCollider.radius; foreach (RaycastHit hit in Physics.RaycastAll(sideStart_2, rayDirectionVector, rayDirectionDistance)) { if (hit.collider != collider.selfCollider) { if (hitDistance == 0 || hit.distance < hitDistance) { hitCollider = hit.collider; hitDistance = hit.distance; } break; } } } if (hitCollider != null) { return(hitCollider.GetComponent <JSColliderBase> ()); } else { return(null); } }
public Vector3 [] GetVectorsInPath(JSColliderBase collider, Vector3 start, Vector3 end) { vectorInPath.Clear(); removeVectorIndexInPath.Clear(); vectorInPath.Add(start); SetVectorInPath(collider, start, end, vectorInPath); vectorInPath.Add(end); CheckSkipVector(collider); DrawAvoidLine(); return(vectorInPath.ToArray()); }