protected override void CalculateSteeringForces() { // Staying in bounds if (transform.position.x >= Terrain.activeTerrain.terrainData.size.x - safeZone || transform.position.z >= Terrain.activeTerrain.terrainData.size.x - safeZone || transform.position.x < 0 + safeZone || transform.position.z + safeZone < 0) { var vecX = Terrain.activeTerrain.terrainData.size.x / 2; // Gets a random y var vecZ = Terrain.activeTerrain.terrainData.size.z / 2; // Sticks it at the terrain height float vecY = Terrain.activeTerrain.SampleHeight(new Vector3(vecX, 0, vecZ)); ApplyForce(Seek(new Vector3(vecX, vecY, vecZ))); } // other logic else { // Applies WanderingForce ApplyForce(Wandering() * flockData.wanderStrength); // Applies Alignment force ApplyForce(Seek(Align()) * flockData.alignmentStrength); // Applies Cohesion force ApplyForce(Seek(Cohesion()) * flockData.coherenceStrength); // Gives this unit more room if it needs it if (Vector3.Distance(gameObject.transform.position, flockData.findNearest(gameObject)) < flockData.separationStrength) { ApplyForce(Seperation()); } foreach (GameObject obs in obst) { ApplyForce(AvoidObstacle(obs) * flockData.avoidenceStrength); } } }