// INSTANTIATOR void InstantiateRelief(Transform parent, Vector3 steps, Vector3 origin) { // Generate wall GameObject wall = Instantiate(m_prefabAvoidWall, parent); wall.name += "Relief"; wall.transform.localPosition = origin; wall.transform.localRotation = Quaternion.identity; AvoidList list = wall.GetComponent <AvoidList>(); // for each terrain foreach (var terrain in m_terrainComp) { var size = terrain.terrainData.size; var terrainOrigin = terrain.GetPosition(); // for each step on x and z axis for (float x = 0; x < size.x; x += steps.x) { for (float z = 0; z < size.z; z += steps.z) { Vector2 interpolatedPosition = new Vector2(x / size.x, z / size.z); float h = terrain.terrainData.GetInterpolatedHeight(interpolatedPosition.x, interpolatedPosition.y); Vector3 N = terrain.terrainData.GetInterpolatedNormal(interpolatedPosition.x, interpolatedPosition.y); // compute avoidData Behaviour.EnemiesManager.BoidData avoidData; avoidData.position = terrainOrigin + new Vector3(x, h, z); avoidData.forward = N; list.m_avoidDatum.Add(avoidData); } } } }
GameObject InstantiateAvoidWall(Vector3 origin, Quaternion rotation, Transform parent, Vector2 steps, Vector2 size, float heightOffset, string nameSuffix) { GameObject wall = Instantiate(m_prefabAvoidWall, parent); wall.name += nameSuffix; wall.transform.localPosition = origin; wall.transform.localRotation = rotation; AvoidList list = wall.GetComponent <AvoidList>(); Vector3 wallPosition = wall.transform.position; Quaternion wallRotation = wall.transform.rotation; for (float x = -size.x / 2; x < size.x / 2; x += steps.x) { for (float y = -size.y / 2; y < size.y / 2; y += steps.y) { Behaviour.EnemiesManager.BoidData boidData; boidData.position = wallPosition + (wallRotation * new Vector3(x, -heightOffset, y)); boidData.forward = (wallPosition - boidData.position).normalized; list.m_avoidDatum.Add(boidData); } } return(wall); }