public void Init() { if (!GlobalState.raceCameras) { return; } if (pathManager.carPath.centerNodes.Count < 1) { return; } // Detect where to put cameras Vector3 prev_point = pathManager.carPath.centerNodes[0].pos; nodeIndexes.Add(0); deltaAngles.Add(0); distance = startIndexOffset; for (int i = 1; i < pathManager.carPath.centerNodes.Count; i++) { PathNode node = pathManager.carPath.centerNodes[i]; PathNode nextNode = pathManager.carPath.centerNodes[(i + 1) % pathManager.carPath.centerNodes.Count]; float deltaAngle = Vector3.SignedAngle(nextNode.pos - node.pos, node.rotation * Vector3.forward, Vector3.up); deltaAngles.Add(deltaAngle); distance = Vector3.Distance(node.pos, nextNode.pos) + distance; if (distance > distanceBetweenCameras) { nodeIndexes.Add(i); prev_point = node.pos; distance = 0; } } // Add cameras for (int i = 0; i < nodeIndexes.Count; i++) { int nodeIndex; if (i < nodeIndexes.Count - 1) { nodeIndex = ((nodeIndexes[i] + nodeIndexes[(i + 1)]) / 2) % pathManager.carPath.centerNodes.Count; } else { nodeIndex = ((nodeIndexes[nodeIndexes.Count - 1] + nodeIndexes[0] + pathManager.carPath.centerNodes.Count) / 2) % pathManager.carPath.centerNodes.Count; } float sign = Mathf.Sign(deltaAngles[nodeIndex]); PathNode node = pathManager.carPath.centerNodes[nodeIndexes[i]]; PathNode midNode = pathManager.carPath.centerNodes[nodeIndex]; Vector3 nodepos = node.pos + node.rotation * (laneXOffset * Vector3.right); Vector3 midNodepos = midNode.pos + midNode.rotation * (laneXOffset * Vector3.right); GameObject goRaceCamChild = new GameObject(string.Format("RaceCamera {0}", i)); goRaceCamChild.transform.SetParent(transform); RaceCamera cmp = goRaceCamChild.AddComponent <RaceCamera>(); cmp.SetCameraTrigger(nodepos, node.rotation * Quaternion.AngleAxis(90, Vector3.up), new Vector3(0.1f, roadHeight, roadWidth)); cmp.SetCam(midNodepos + midNode.rotation * (6f * sign * Vector3.right) + (cameraHeight * Vector3.up), midNodepos); cmp.index = i; cmp.camera.cullingMask = cullMask; raceCameras.Add(cmp); } // Enable first camera raceCameras[0].camera.enabled = true; float coverage = GetCoverage(raceCameras.ToArray(), pathManager.carPath.centerNodes.ToArray(), nodeIndexes.ToArray()); Debug.Log(string.Format("Race cameras coverage: {0}%", coverage)); }