예제 #1
0
    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;
            }
        }
    }
예제 #2
0
    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());
    }
예제 #3
0
 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]);
     }
 }
예제 #4
0
    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);
        }
    }
예제 #5
0
 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());
 }