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 bool isChasing; private Animator myAnim; 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() { myAnim = GetComponent(); myAnim.SetBool("isChasing", true); myAnim.SetBool("left", false); int targetIndex = 0; if (path == null || path.Count == 0) { isChasing = false; myAnim.SetBool("isChasing", false); yield break; } Vector3 currentWorldPosition; Node currentWaypoint = path[targetIndex]; while (true) { currentWorldPosition = transform.position; //if (transform.position == currentWaypoint.worldPosition) if (Vector3.Distance(transform.position, currentWaypoint.worldPosition)<0.01f) { targetIndex++; bool reachedPosition = targetIndex >= path.Count; if (reachedPosition) { myAnim.SetBool("isChasing", false); yield break; } currentWaypoint = path[targetIndex]; } Vector3 current = transform.position; Vector3 target = currentWaypoint.worldPosition; if (Pathfinder.Player.position.x < current.x) { myAnim.SetBool("Left", true); } if (Pathfinder.Player.position.x >= current.x) { myAnim.SetBool("Left", false); } transform.position = Vector3.MoveTowards(current, target, speed * Time.deltaTime); Debug.Log(current + "target:" + target); 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); } } }