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));
    }