c# - How can i make the spaceships to move between the waypoints? -
using system.collections; using system.collections.generic; using unityengine; public class spaceships : monobehaviour { private gameobject[] waypoints; public gameobject shipparent; public static list<transform> shipschildren = new list<transform>(); public float movespeed = 50; public float smooth = 1f; private vector3 targetangles; private list<float> distancetraveled = new list<float>(); private list<vector3> lastpositions = new list<vector3>(); private list<int> randomnumbers = new list<int>(); // use initialization void start() { foreach (transform child in shipparent.transform) { shipschildren.add(child); } waypoints = gameobject.findgameobjectswithtag("clonedobject"); } // update called once per frame void update () { moveobjects(); } private void moveobjects() { (int index = 0; index < shipschildren.count; index++) { transform onechild = shipschildren[index].transform; lastpositions[index] = onechild.transform.position; onechild.transform.position += onechild.transform.forward * time.deltatime * movespeed; distancetraveled[index] += vector3.distance(onechild.transform.position, lastpositions[index]); targetangles = onechild.transform.eulerangles + random.range(90.0f, 180.0f) * transform.up; startcoroutine(turnship(onechild.transform, onechild.transform.eulerangles, targetangles, smooth)); distancetraveled[index] = 0; lastpositions[index] = new vector3(transform.position.x, transform.position.y, transform.position.z); int lastnumber = randomnumbers[index]; randomnumbers[index] = random.range(200, 500); } } ienumerator turnship(transform ship, vector3 startangle, vector3 endangle, float smooth) { float lerpspeed = 0; while (lerpspeed < 1) { ship.eulerangles = vector3.lerp(startangle, endangle, lerpspeed); lerpspeed += time.deltatime * smooth; yield return null; } } } i want ships move between waypoints. waypoints array of gameobjects.
i loop on number of spaceships there might times there more spaceships waypoints or more waypoints spaceships.
this waypoints script attached thirdpersoncontroller attach script each spaceship spaceships movement not thirdpersoncontroller.
using system.collections; using system.collections.generic; using unityeditor; using unityengine; using unitystandardassets.characters.thirdperson; public class waypoints : monobehaviour { public gameobject[] waypoints; public transform target; public float movespeed = 10f; public float movespeed1 = 10f; public float slowdownspeed = 1.5f; public float reverseslowdownspeed = 3f; public float rotationspeed = 1f; private transform mytransform; private int targetsindex = 0; private vector3 originalposition; private gameobject[] robots; public transform reversetarget; private int reversetargetsindex = 0; private vector3 reverseoriginalposition; private animations anims; public bool random = false; private gameobject lightprefab; public color colorlightprefab; void awake() { mytransform = transform; } // use initialization void start() { lightprefab = gameobject.createprimitive(primitivetype.cube); lightprefab.transform.position = new vector3(0, 0, 0); lightprefab.name = "lightprefab"; lightprefab.hideflags = hideflags.hideinhierarchy; anims = getcomponent<animations>(); waypoints = gameobject.findgameobjectswithtag("clonedobject"); robots = gameobject.findgameobjectswithtag("robots"); foreach(gameobject go in waypoints) { go.isstatic = true; } unityeditor.ai.navmeshbuilder.buildnavmesh(); //addcollidertowaypoints(); originalposition = robots[0].transform.position; reverseoriginalposition = robots[1].transform.position; createcubesbesidewaypoints(); } // update called once per frame void update() { if (mycommands.walkbetweenwaypoints == true) { anims.playstate(animations.animatorstates.run); waypointsai(); //reversewaypointsai(); } drawlinesinscene(); } private void waypointsai() { if (targetsindex == waypoints.length) targetsindex = 0; target = waypoints[targetsindex].transform; float distance = vector3.distance(robots[0].transform.position, target.transform.position); robots[0].transform.rotation = quaternion.slerp(robots[0].transform.rotation, quaternion.lookrotation(target.position - robots[0].transform.position), rotationspeed * time.deltatime); //move towards player if (distance < 30) { robots[0].transform.position += robots[0].transform.forward * slowdownspeed * time.deltatime; } else { robots[0].transform.position += robots[0].transform.forward * movespeed * time.deltatime; } if (distance < 2) { targetsindex++; } } private void reversewaypointsai() { if (reversetargetsindex == 0) reversetargetsindex = waypoints.length -1; reversetarget = waypoints[reversetargetsindex].transform; float distance = vector3.distance(robots[1].transform.position, reversetarget.transform.position); robots[1].transform.rotation = quaternion.slerp(robots[1].transform.rotation, quaternion.lookrotation(reversetarget.position - robots[1].transform.position), rotationspeed * time.deltatime); //move towards player if (distance < 30) { robots[1].transform.position += robots[1].transform.forward * reverseslowdownspeed * time.deltatime; } else { robots[1].transform.position += robots[1].transform.forward * movespeed1 * time.deltatime; } if (distance < 2) { reversetargetsindex--; } } void randomwaypointsai() { if (random == true) { int index = random.range(0, waypoints.length); target = waypoints[index].transform; } } void drawlinesinscene() { // draw lines between each checkpoint // (int = 0; < waypoints.length - 1; i++) { debug.drawline(waypoints[i].transform.position, waypoints[i + 1].transform.position, color.blue); } // draw line between original transform start position // , current transform position // debug.drawline(originalposition, robots[0].transform.position, color.red); debug.drawline(reverseoriginalposition, robots[1].transform.position, color.red); // draw line between current transform position , next waypoint target // each time reached waypoint. if (target != null) debug.drawline(target.transform.position, robots[0].transform.position, color.green); if (reversetarget != null) debug.drawline(reversetarget.transform.position, robots[1].transform.position, color.green); } void createcubesbesidewaypoints() { const int lightcount = 20; vector3[] lightpositions = new vector3[lightcount]; postochunkdistances(waypoints[0].transform.position, waypoints[waypoints.length - 1].transform.position, lightpositions, lightcount); gameobject parentobject = new gameobject("lightparentobj"); (int x = 0; x < lightpositions.length; x++) { gameobject clonelightprefab = instantiate(lightprefab, lightpositions[x], quaternion.identity); clonelightprefab.getcomponent<renderer>().material.color = color.red; clonelightprefab.transform.localscale = new vector3(0.5f, 0.5f, 0.5f); clonelightprefab.tag = "lightprefab"; clonelightprefab.transform.setparent(parentobject.transform); } } void addcollidertowaypoints() { foreach (gameobject go in waypoints) { spherecollider sc = go.addcomponent<spherecollider>() spherecollider; sc.istrigger = true; } } void postochunkdistances(vector3 from, vector3 to, vector3[] result, int chunkamount) { //divider must between 0 , 1 float divider = 1f / chunkamount; float linear = 0f; if (chunkamount == 0) { debug.logerror("chunkamount distance must > 0 instead of " + chunkamount); return; } if (chunkamount == 1) { result[0] = vector3.lerp(from, to, 0.5f); //return half/middle point return; } (int = 0; < chunkamount; i++) { if (i == 0) { linear = divider / 2; } else { linear += divider; //add divider next distance } // debug.log("loop " + + ", " + linear); result[i] = vector3.lerp(from, to, linear); } } } i'm bit confused how combine waypoints in script waypoints spaceships script spaceships move between waypoints.
Comments
Post a Comment