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); }
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; }