Hello! I am making a basic RTS engine using the A* Pathfinding project and I have ran into a bit of a dead end. The unit goes where I tell it to only when selected but the problem is that it stops moving if I deselect it. In other words for the unit to move the player needs to keep it selected. The following is my Selectable.cs Code (csharp): using UnityEngine; using System.Collections; public class Selectable : MonoBehaviour { //Selected public bool selected = false; //Team and Alliance public int team= 0; //Team is the player who the unit is loyal to public int alliance= 0;//Alliance is the group of players it is loyal to //Set the color of the unit to the team color void Start (){ } //If a unit is selected then enable its Projector to show it void Update (){ if(selected){ if(!transform.Find("Plane").GetComponent<MeshRenderer>().enabled) transform.Find("Plane").GetComponent<MeshRenderer>().enabled = true; } else{ if(transform.Find("Plane").GetComponent<MeshRenderer>().enabled) transform.Find("Plane").GetComponent<MeshRenderer>().enabled = false; } } } and my actual AstarAI.cs Code (csharp): using System.Collections; //Note this line, if it is left out, the script won't know that the class 'Path' exists and it will throw compiler errors //This line should always be present at the top of scripts which use pathfinding using Pathfinding; public class AstarAI : MonoBehaviour { //The point to move to public Vector3 targetPosition; private Seeker seeker; private CharacterController controller; public Selectable selectable; //The calculated path public Path path; //The AI's speed per second public float speed = 100; RaycastHit hit; Ray ray; //The max distance from the AI to a waypoint for it to continue to the next waypoint public float nextWaypointDistance = 3; //The waypoint we are currently moving towards private int currentWaypoint = 0; float raycastlength = 1000; public void Start () { seeker = GetComponent<Seeker>(); controller = GetComponent<CharacterController>(); selectable = GetComponent<Selectable>(); //Start a new path to the targetPosition, return the result to the MyCompleteFunction seeker.StartPath (transform.position, targetPosition, MyCompleteFunction); } public void MyCompleteFunction (Path p) { Debug.Log ("Yey, we got a path back. Did it have an error? "+p.error); if (!p.error) { path = p; //Reset the waypoint counter currentWaypoint = 0; } } public void Update () { if (path == null) { //We have no path to move after yet return; } if (selectable.selected == true) { if (Input.GetButtonDown("Fire1")) { ray = Camera.main.ScreenPointToRay (Input.mousePosition); if (Physics.Raycast(ray, out hit, raycastlength)) { targetPosition = hit.point; seeker.StartPath (transform.position, targetPosition, MyCompleteFunction); } } if (currentWaypoint >= path.vectorPath.Length) { Debug.Log ("End Of Path Reached"); return; } //Direction to the next waypoint Vector3 dir = (path.vectorPath[currentWaypoint]-transform.position).normalized; dir *= speed * Time.deltaTime; controller.SimpleMove (dir); if (Vector3.Distance (transform.position,path.vectorPath[currentWaypoint]) < nextWaypointDistance) { currentWaypoint++; return; } } } } Any help in how to fix this would mean alot to me! Thank you
Isn't it obvious that this update only functions when if (selectable.selected == true) I think you should close it off sooner than if (currentWaypoint >= path.vectorPath.Length) { in order to get it to work as intended. Meaning add a "}" before above line and remove one"}" from after line 96. I think that should do it. Though maybe we would want to somehow indicate that the unit is Active or something so we don't do Length calculations each frame even when the unity is at it's intended location. Maybe use the if (path== null) with and else to achieve this. So if there is a path it will continue.