using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class AStarPathfindingAgent : MonoBehaviour { public float speed = 0.5f; private NodeMap Map; private Pathfinding Pathfinder; public Node currentPosition; public List path; // Start is called before the first frame update private void Awake() { Map = FindObjectOfType(); Pathfinder = FindObjectOfType(); } void Start() { currentPosition = Map.NodeFromWorldPoint(new Vector2(transform.position.x, transform.position.y)); //Debug.Log("current world position:" + currentPosition.worldPosition + " current transform position:" + transform.position); Map.TeleportTo(this.gameObject, currentPosition); } // Update is called once per frame void Update() { } public void FindPath() { Pathfinder.FindPath(transform.position,Pathfinder.Player.position, this); } public IEnumerator FollowPath() { int targetIndex = 0; if (path == null || path.Count == 0) { yield break; } Vector3 currentWorldPosition; Node currentWaypoint = path[targetIndex]; while (true) { currentWorldPosition = transform.position; if (transform.position == currentWaypoint.worldPosition) { targetIndex++; bool reachedPosition = targetIndex >= path.Count; if (reachedPosition) { yield break; } currentWaypoint = path[targetIndex]; } Vector3 current = transform.position; Vector3 target = currentWaypoint.worldPosition; transform.position = Vector3.MoveTowards(current, target, speed * Time.deltaTime); yield return null; } } public void OnDrawGizmos() { Gizmos.color = Color.red; Gizmos.DrawCube(currentPosition.worldPosition, Vector3.one); Gizmos.color = Color.black; if (path == null) return; foreach (var n in path) { Gizmos.DrawCube(n.worldPosition, Vector3.one); } } }