Scriptum/Assets/Scripts/Pathfinding/AStarPathfindingAgent.cs
2022-12-20 04:37:00 +01:00

102 lines
2.9 KiB
C#

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<Node> path;
// Start is called before the first frame update
private void Awake()
{
Map = FindObjectOfType<NodeMap>();
Pathfinder = FindObjectOfType<Pathfinding>();
}
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<Animator>();
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);
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);
}
}
}