Пример #1
0
    VirusNode FindNearestVirusNode()
    {
        Collider[] colliders = Physics.OverlapSphere(transform.position, detectionRadius, mask);

        VirusNode closest         = null;
        float     closestDistance = float.MaxValue;

        foreach (var item in colliders)
        {
            VirusNode node = item.GetComponent <VirusNode>();
            if (!node.harvested)
            {
                if (closest)
                {
                    float distance = Vector3.Distance(transform.position, node.transform.position);
                    if (distance < closestDistance)
                    {
                        closest         = node;
                        closestDistance = distance;
                    }
                }
                else
                {
                    closestDistance = Vector3.Distance(transform.position, node.transform.position);
                    closest         = node;
                }
            }
        }

        return(closest);
    }
Пример #2
0
    public void Harvest()
    {
        transform.parent = null;
        Vector3   positionBeforeHarvest = transform.position;
        VirusNode currentTarget         = FindNearestVirusNode();

        if (agent)
        {
            ModeIcon.sprite = HarvestModeSprite;
            if (currentTarget && !currentTarget.harvested)
            {
                ModeIcon.color = Color.blue;
                Vector3 position = currentTarget.transform.position;
                agent.SetDestination(position);

                if (agent.remainingDistance <= 1)
                {
                    if (interacting)
                    {
                        ModeIcon.color = Color.blue + Color.red;
                        if (interactTimer <= 0)
                        {
                            interactOrign     = transform.position + (Vector3.up * 0.61f);
                            interactDirection = currentTarget.transform.position - interactOrign;

                            Ray        ray = new Ray(interactOrign, interactDirection);
                            RaycastHit hit;
                            if (Physics.Raycast(ray, out hit, 10, interactLayers))
                            {
                                if (hit.collider.gameObject == currentTarget.gameObject)
                                {
                                    currentTarget.OnInteract();
                                    interacting = false;
                                }
                            }
                        }

                        interactTimer -= Time.deltaTime;
                    }
                    else
                    {
                        interacting   = true;
                        interactTimer = InteractSpeed.Result();
                    }
                }
            }
            else
            {
                ModeIcon.color = Color.red;
                currentTarget  = FindNearestVirusNode();
                agent.SetDestination(currentInfo.target.position);
            }
        }
        agent.isStopped = false;
    }