void Update() { AdjustViewForPlayerSpeed(); switch (aiState) { case "seenTarget": if (visibleTargets.Count > 0) { targetOfInterest.transform.position = visibleTargets[0].transform.position; } break; case "idlePatrol": if (agent.reachedEndOfPath && !agent.pathPending) { EnterState("lookAround"); } if (visibleTargets.Count > 0) { alarmGraceTimer += Time.deltaTime; if (alarmGraceTimer > alarmGracePeriod * (Vector3.Distance(transform.position, visibleTargets[0].transform.position) / currentViewRadius)) { EnterState("seenTarget"); } } else { alarmGraceTimer = 0; } break; default: break; case "reporting": agent.destination = gameController.instance.NearestGuard(transform.position).transform.position; agent.SearchPath(); if ((agent.reachedEndOfPath && !agent.pathPending) || Vector3.Distance(transform.position, agent.destination) < 1) { guardController nearestGuard = gameController.instance.NearestGuard(transform.position).GetComponent <guardController>(); if (nearestGuard.aiState != "seenTarget") { nearestGuard.SetNewTargetOfInterest(targetOfInterest.transform.position, "relayedInfo"); nearestGuard.EnterState("checkingReport"); } EnterState("idlePatrol"); } if (visibleTargets.Count > 0) { EnterState("seenTarget"); } break; } }
public override void OnSceneGUI() { base.OnSceneGUI(); guardController fow = (guardController)target; Handles.color = Color.white; Handles.DrawWireArc(fow.transform.position, Vector3.forward, Vector3.up, 360, fow.currentViewRadius); Vector3 viewAngleA = fow.DirFromAngle(-fow.currentViewAngle / 2, false); Vector3 viewAngleB = fow.DirFromAngle(fow.currentViewAngle / 2, false); Handles.DrawLine(fow.transform.position, fow.transform.position + viewAngleA * fow.currentViewRadius); Handles.DrawLine(fow.transform.position, fow.transform.position + viewAngleB * fow.currentViewRadius); Handles.color = Color.red; foreach (Transform visibleTarget in fow.visibleTargets) { Handles.DrawLine(fow.transform.position, visibleTarget.position); } }