void zombieTargetUpdate(RaycastHit hit) { GameObject[] zombies = GameObject.FindGameObjectsWithTag("Zombie"); GameObject commandCandidate = null; bool acceptedTaskFlag = false; for (uint i = 0; i < 2; ++i) { float minSqrDistance = -1.0f; foreach (GameObject zombie in zombies) { ZombieBehavior zb = zombie.GetComponent <ZombieBehavior>(); HealthComponent hc = zombie.GetComponent <HealthComponent>(); UnityEngine.AI.NavMeshAgent na = zombie.GetComponent <UnityEngine.AI.NavMeshAgent>(); if (zb != null && zb.enabled && zb.hasPlayerTask() == acceptedTaskFlag && hc != null && hc.enabled && !hc.isDead() && na != null && na.enabled) { float sqrDistance = (hit.point - zb.transform.position).sqrMagnitude; if (minSqrDistance == -1.0f || sqrDistance < minSqrDistance) { commandCandidate = zombie; minSqrDistance = sqrDistance; } } } if (commandCandidate != null) { // add dummy destination marker: UnityEngine.AI.NavMeshPath path = new UnityEngine.AI.NavMeshPath(); Vector3 hitPoint = CrosshairBehaviour.getRecentlyFocusedHuman() != null?CrosshairBehaviour.getRecentlyFocusedHuman().transform.position : hit.point; UnityEngine.AI.NavMesh.CalculatePath(commandCandidate.transform.position, hitPoint, UnityEngine.AI.NavMesh.AllAreas, path); if (path.corners.Length > 0) { Vector3 destinationPosition = path.corners[path.corners.Length - 1]; GameObject destinationMarker = (GameObject)Instantiate(MainGameManager.instance.destinationMarker); destinationMarker.transform.position = new Vector3(destinationPosition.x, destinationPosition.y + 0.01f, destinationPosition.z); destinationMarker.transform.eulerAngles = new Vector3(90.0f, 0.0f, 0.0f); commandCandidate.GetComponent <ZombieBehavior>().setTargetFromRaycastHit(hit); } break; } else { acceptedTaskFlag = !acceptedTaskFlag; } } }
public void setTargetFromRaycastHit( RaycastHit hit ) { // getChildRootObject for Humans/Zombies contained in the HumanParent/ZombieParent //GameObject colliderRootObject = getChildRootObject(hit.collider.gameObject.transform.parent.gameObject); GameObject colliderRootObject = CrosshairBehaviour.getRecentlyFocusedHuman() != null ? CrosshairBehaviour.getRecentlyFocusedHuman() : getRootObject(hit.collider.gameObject.transform.parent.gameObject); if (colliderRootObject.tag == getOpposingFactionTag ()) { setObjectOfInterest (colliderRootObject); m_positionOfInterest = m_objectOfInterest.GetComponent< Transform > ().position; } else { setObjectOfInterest (null); m_positionOfInterest = hit.point; } m_state = State.ApproachTarget; m_hasPlayerTask = true; }