using UnityEngine; using System.Linq; namespace Pathfinding { /// /// Moves the target in example scenes. /// This is a simple script which has the sole purpose /// of moving the target point of agents in the example /// scenes for the A* Pathfinding Project. /// /// It is not meant to be pretty, but it does the job. /// [HelpURL("http://arongranberg.com/astar/docs/class_pathfinding_1_1_target_mover.php")] public class TargetMover : MonoBehaviour { /// Mask for the raycast placement public LayerMask mask; public Transform target; IAstarAI[] ais; /// Determines if the target position should be updated every frame or only on double-click public bool onlyOnDoubleClick; public bool use2D; Camera cam; public void Start () { //Cache the Main Camera cam = Camera.main; // Slightly inefficient way of finding all AIs, but this is just an example script, so it doesn't matter much. // FindObjectsOfType does not support interfaces unfortunately. ais = FindObjectsOfType().OfType().ToArray(); useGUILayout = false; } public void OnGUI () { if (onlyOnDoubleClick && cam != null && Event.current.type == EventType.MouseDown && Event.current.clickCount == 2) { UpdateTargetPosition(); } } /// Update is called once per frame void Update () { if (!onlyOnDoubleClick && cam != null) { UpdateTargetPosition(); } } public void UpdateTargetPosition () { Vector3 newPosition = Vector3.zero; bool positionFound = false; if (use2D) { newPosition = cam.ScreenToWorldPoint(Input.mousePosition); newPosition.z = 0; positionFound = true; } else { // Fire a ray through the scene at the mouse position and place the target where it hits RaycastHit hit; if (Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), out hit, Mathf.Infinity, mask)) { newPosition = hit.point; positionFound = true; } } if (positionFound && newPosition != target.position) { target.position = newPosition; if (onlyOnDoubleClick) { for (int i = 0; i < ais.Length; i++) { if (ais[i] != null) ais[i].SearchPath(); } } } } } }