Пример #1
0
    public bool SignalReaches(Minion receiver)
    {
        Vector2 planetDirection = (Vector2)Planet.position - (Vector2)transform.position;

        if (Vector2.Dot(planetDirection, (Vector2)Planet.position - (Vector2)receiver.transform.position) < 0)
        {
            return(false);
        }

        Vector2 receiverDirection = (Vector2)receiver.transform.position - (Vector2)transform.position;

        float planetAngle   = Mathf.Atan2(planetDirection.y, planetDirection.x) * MathUtils.RADIUS2DEGREE;
        float receiverAngle = Mathf.Atan2(receiverDirection.y, receiverDirection.x) * MathUtils.RADIUS2DEGREE;

        if (Mathf.Abs(MathUtils.AngleDifference(planetAngle, receiverAngle)) > broadcastRadius)
        {
            return(false);
        }

        Vector2 rayStart  = transform.position;
        Vector2 rayEnd    = (Vector2)(receiver.transform.position - Planet.position).normalized * (Planet.GetComponentInChildren <CircleCollider2D>().radius + 0.01f);
        Vector2 direction = (rayEnd - rayStart);
        float   distance  = direction.magnitude;

        direction.Normalize();
        var hits = Physics2D.RaycastAll(transform.position, direction, distance);

        if (hits.Any(hit => hit.transform != transform && hit.transform != receiver.transform))
        {
            return(false);
        }
        line.positionCount += 2;
        line.SetPosition(line.positionCount - 2, transform.position + new Vector3(0, 0, 0.5f));
        line.SetPosition(line.positionCount - 1, receiver.transform.position);
        return(true);
    }