/// <summary>
 ///
 /// </summary>
 /// <param name="carScript"></param>
 /// <param name="sfxs"></param>
 private static void ConfigureBrakesSFX(TrainController_v3 carScript, List <GameObject> sfxs)
 {
     if (sfxs != null && sfxs.Count > 0)
     {
         foreach (var item in sfxs)
         {
             AudioSource audio = item.GetComponent <AudioSource>();
             if (audio != null)
             {
                 carScript.brakesSFX = audio;
             }
         }
     }
 }
    /// <summary>
    ///
    /// </summary>
    /// <param name="profile"></param>
    /// <param name="modelPrefab"></param>
    /// <param name="offset"></param>
    /// <param name="name"></param>
    public static bool Create(CustomWagonProfile profile, GameObject modelPrefab, string name, out string message)
    {
        message = string.Empty;

        Vector3 railsOffset = new Vector3(0f, 0.14f, 0f);

        //Wagon/locomotive game object
        GameObject wagonInstance = new GameObject(name);
        //Model
        GameObject modelInstance;

        if (modelPrefab != null)
        {
            modelInstance = InstantiateChild(modelPrefab, modelPrefab.name, profile.modelOffset, Quaternion.identity, wagonInstance.transform);
        }
        //Default child instances
        GameObject wheels     = InstantiateChild("Wheels", railsOffset, Quaternion.identity, wagonInstance.transform);
        GameObject sfx        = InstantiateChild("SFX", Vector3.zero, Quaternion.identity, wagonInstance.transform);
        GameObject sensors    = InstantiateChild("Sensors", railsOffset, Quaternion.identity, wagonInstance.transform);
        GameObject colliders  = InstantiateChild("Colliders", Vector3.zero, Quaternion.identity, wagonInstance.transform);
        GameObject bumpers    = InstantiateChild("Bumpers", Vector3.zero, Quaternion.identity, wagonInstance.transform);
        GameObject doors      = InstantiateChild("Doors", Vector3.zero, Quaternion.identity, wagonInstance.transform);
        GameObject lights     = InstantiateChild("Lights", Vector3.zero, Quaternion.identity, wagonInstance.transform);
        GameObject suspension = InstantiateChild("Suspension", railsOffset, Quaternion.identity, wheels.transform);

        //Add common unity components
        Rigidbody rigidbody = wagonInstance.AddComponent <Rigidbody>();

        //Configure common unity components
        rigidbody.mass = 10000f;

        //Instantiate common profile components
        InstantiateWagonComponents(profile.bumper, bumpers.transform, null);
        InstantiateWagonComponents(profile.suspensionCollider, suspension.transform, null);
        InstantiateWagonComponents(profile.colliders, colliders.transform, null);
        InstantiateWagonComponents(profile.internalDetails, wagonInstance.transform, null);
        InstantiateWagonComponents(profile.passengerSensor, wagonInstance.transform, null);

        //Instantiate specific profile components
        if (profile.type == WagonType.Wagon)
        {
            //Add specific unity components
            Wagon_v3   wagonScript = wagonInstance.AddComponent <Wagon_v3>();
            HingeJoint hingeJoint  = wagonInstance.AddComponent <HingeJoint>();

            //Configure specific unity components
            hingeJoint.axis = new Vector3(1f, 1f, 0f);

            //Instantiate specific unity components
            InstantiateWagonComponents(profile.wheelsSFX, sfx.transform, new Action <Wagon_v3, List <GameObject> >(ConfigureWheelSFX), wagonScript);
            InstantiateWagonComponents(profile.wagonConnectionSFX, sfx.transform, new Action <Wagon_v3, List <GameObject> >(ConfigureConnectionSFX), wagonScript);
            //Couplers
            InstantiateWagonComponents(profile.frontCoupler, wagonInstance.transform, new Action <Rigidbody, Wagon_v3, HingeJoint, List <GameObject> >(ConfigureFrontCoupler), rigidbody, wagonScript, hingeJoint);
            InstantiateWagonComponents(profile.backCoupler, wagonInstance.transform, new Action <Rigidbody, Wagon_v3, List <GameObject> >(ConfigureBackCoupler), rigidbody, wagonScript);
            InstantiateWagonComponents(profile.defaultJointAnchor, wagonInstance.transform, new Action <Wagon_v3, List <GameObject> >(ConfigureDefaultJointAnchor), wagonScript);
            //Wheels
            InstantiateWagonComponents(profile.wheelsPhysics, wheels.transform, new Action <Rigidbody, Wagon_v3, List <GameObject> >(ConfigurePhysicsWheels), rigidbody, wagonScript);
            InstantiateWagonComponents(profile.wheelsVisuals, wheels.transform, new Action <Wagon_v3, List <GameObject> >(ConfigureWheels), wagonScript);
            //Sensors
            InstantiateWagonComponents(profile.railSensor, sensors.transform, new Action <Wagon_v3, List <GameObject> >(ConfigureSensors), wagonScript);
            //Lights
            InstantiateWagonComponents(profile.externalLights, lights.transform, new Action <Wagon_v3, List <GameObject> >(ConfigureExternalLights), wagonScript);
            InstantiateWagonComponents(profile.internalLights, lights.transform, new Action <Wagon_v3, List <GameObject> >(ConfigureInternalLights), wagonScript);
        }
        else if (profile.type == WagonType.Locomotive)
        {
            //Add specific unity components
            TrainController_v3 locomotiveScript = wagonInstance.AddComponent <TrainController_v3>();
            wagonInstance.AddComponent <TrainStationController>();
            TrainSpeedMonitor speedMonitor  = wagonInstance.AddComponent <TrainSpeedMonitor>();
            TrainPlayerInput  playerInput   = wagonInstance.AddComponent <TrainPlayerInput>();
            PassengerTags     passengerTags = wagonInstance.AddComponent <PassengerTags>();
            passengerTags.passengerTags = new List <string>()
            {
                "Player", "NPC"
            };
            BoxCollider locomotiveTrigger = wagonInstance.AddComponent <BoxCollider>();

            //Configure specific unity components
            locomotiveScript.enginesOn    = true;
            locomotiveScript.acceleration = 1f;
            playerInput.inputSettings     = profile.inputSettings;
            locomotiveTrigger.isTrigger   = true;
            locomotiveTrigger.size        = new Vector3(0.5f, 0.5f, 0.5f);
            locomotiveTrigger.center      = profile.controlZoneTriggerPosition;
            speedMonitor.speedUnit        = profile.speedUnits;

            //Instantitate specific unity components
            InstantiateWagonComponents(profile.engineSFX, sfx.transform, new Action <TrainController_v3, List <GameObject> >(ConfigureEngineSFX), locomotiveScript);
            InstantiateWagonComponents(profile.brakesSFX, sfx.transform, new Action <TrainController_v3, List <GameObject> >(ConfigureBrakesSFX), locomotiveScript);
            InstantiateWagonComponents(profile.wheelsSFX, sfx.transform, new Action <TrainController_v3, List <GameObject> >(ConfigureWheelSFX), locomotiveScript);
            InstantiateWagonComponents(profile.hornSFX, sfx.transform, new Action <TrainController_v3, List <GameObject> >(ConfigureHornSFX), locomotiveScript);
            InstantiateWagonComponents(profile.bellSFX, sfx.transform, new Action <TrainController_v3, List <GameObject> >(ConfigureBellSFX), locomotiveScript);
            //Couplers
            InstantiateWagonComponents(profile.frontCoupler, wagonInstance.transform, new Action <Rigidbody, List <GameObject> >(ConnectHingeAnchor), rigidbody);
            InstantiateWagonComponents(profile.backCoupler, wagonInstance.transform, new Action <Rigidbody, TrainController_v3, List <GameObject> >(ConfigureBackCoupler), rigidbody, locomotiveScript);
            //Wheels
            InstantiateWagonComponents(profile.wheelsPhysics, wheels.transform, new Action <Rigidbody, TrainController_v3, List <GameObject> >(ConfigurePhysicsWheels), rigidbody, locomotiveScript);
            InstantiateWagonComponents(profile.wheelsVisuals, wheels.transform, new Action <TrainController_v3, List <GameObject> >(ConfigureWheels), locomotiveScript);
            //Sensors
            InstantiateWagonComponents(profile.railSensor, sensors.transform, new Action <TrainController_v3, List <GameObject> >(ConfigureSensors), locomotiveScript);
            //Lights
            InstantiateWagonComponents(profile.externalLights, lights.transform, new Action <TrainController_v3, List <GameObject> >(ConfigureExternalLights), locomotiveScript);
            InstantiateWagonComponents(profile.internalLights, lights.transform, new Action <TrainController_v3, List <GameObject> >(ConfigureInternalLights), locomotiveScript);
        }

        TrainDoorsController doorsController = wagonInstance.AddComponent <TrainDoorsController>();

        wagonInstance.AddComponent <SMR_IgnoredObject>();
        wagonInstance.AddComponent <TrainSuspension>();

        InstantiateWagonComponents(profile.cabinDoorLeft, doors.transform, new Action <TrainDoorsController, List <GameObject> >(ConfigureLeftCabinDoor), doorsController);
        InstantiateWagonComponents(profile.cabinDoorRight, doors.transform, new Action <TrainDoorsController, List <GameObject> >(ConfigureRightCabinDoor), doorsController);
        InstantiateWagonComponents(profile.passengerDoorLeft, doors.transform, new Action <TrainDoorsController, List <GameObject> >(ConfigureLeftPassengerDoors), doorsController);
        InstantiateWagonComponents(profile.passengerDoorRight, doors.transform, new Action <TrainDoorsController, List <GameObject> >(ConfigureRightPassengerDoors), doorsController);
        InstantiateWagonComponents(profile.openDoorSFX, sfx.transform, new Action <TrainDoorsController, List <GameObject> >(ConfigureOpenDoorSFX), doorsController);
        InstantiateWagonComponents(profile.closeDoorSFX, sfx.transform, new Action <TrainDoorsController, List <GameObject> >(ConfigureCloseDoorSFX), doorsController);

        string carType = profile.type.ToString();

        message = string.Format("{0} created successfully!", carType);
        return(true);
    }
示例#3
0
    public override void OnInspectorGUI()
    {
        //base.OnInspectorGUI();
        _trainController_v3 = target as TrainController_v3;

        EditorGUI.BeginChangeCheck();
        _selectedMenuIndex = GUILayout.Toolbar(_selectedMenuIndex, _toolbarMenuOptions);
        if (EditorGUI.EndChangeCheck())
        {
            GUI.FocusControl(null);
        }

        //Set up the box style if null
        if (_menuBoxStyle == null)
        {
            _menuBoxStyle = new GUIStyle(GUI.skin.box);
            _menuBoxStyle.normal.textColor = GUI.skin.label.normal.textColor;
            _menuBoxStyle.fontStyle        = FontStyle.Bold;
            _menuBoxStyle.alignment        = TextAnchor.UpperLeft;
        }
        GUILayout.BeginVertical(_menuBoxStyle);

        if (_selectedMenuIndex == (int)TrainControllerInspectorMenu.Controls)
        {
            #region Controls

            GUILayout.Label("TRAIN CONTROLS", EditorStyles.boldLabel);

            EditorGUI.BeginChangeCheck();
            bool enginesOn = EditorGUILayout.Toggle("Engines On", _trainController_v3.enginesOn);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_trainController_v3, "Toggle Engines");
                _trainController_v3.enginesOn = enginesOn;
                MarkSceneAlteration();
            }

            EditorGUI.BeginChangeCheck();
            float maxSpeedKph = EditorGUILayout.Slider("Max Speed (KPH)", _trainController_v3.maxSpeedKph, 0f, 105f);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_trainController_v3, "Changed Speed");
                _trainController_v3.maxSpeedKph = maxSpeedKph;
                MarkSceneAlteration();
            }

            EditorGUI.BeginChangeCheck();
            float acceleration = EditorGUILayout.Slider("Acceleration", _trainController_v3.acceleration, -1f, 1f);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_trainController_v3, "Changed Acceleration");
                _trainController_v3.acceleration = acceleration;
                MarkSceneAlteration();
            }

            EditorGUI.BeginChangeCheck();
            bool automaticBrakes = EditorGUILayout.Toggle("Automatic Brakes", _trainController_v3.automaticBrakes);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_trainController_v3, "Toggle Auto Brakes");
                _trainController_v3.automaticBrakes = automaticBrakes;
                MarkSceneAlteration();
            }

            EditorGUI.BeginChangeCheck();
            float brake = EditorGUILayout.Slider("Brakes", _trainController_v3.brake, 0, 1f);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_trainController_v3, "Changed Brakes");
                _trainController_v3.brake = brake;
                MarkSceneAlteration();
            }

            GUILayout.Label("TRAIN OPERATIONS", EditorStyles.boldLabel);

            GUILayout.BeginVertical();
            if (_trainController_v3.enginesOn)
            {
                if (GUILayout.Button(stopEngine))
                {
                    _trainController_v3.ToggleEngine();
                    MarkSceneAlteration();
                }
            }
            else
            {
                if (GUILayout.Button(startEngine))
                {
                    _trainController_v3.ToggleEngine();
                    MarkSceneAlteration();
                }
            }

            GUILayout.BeginVertical();

            using (new EditorGUI.DisabledScope(!Application.isPlaying))
            {
                GUILayout.BeginHorizontal();
                if (_trainController_v3.DoorsController != null)
                {
                    //Cabin left door
                    if (!_trainController_v3.DoorsController.CabinLeftDoorOpen)
                    {
                        if (GUILayout.Button(openLeftCabinDoor))
                        {
                            _trainController_v3.DoorsController.OpenCabinDoorLeft();
                        }
                    }
                    else
                    {
                        if (GUILayout.Button(closeLeftCabinDoor))
                        {
                            _trainController_v3.DoorsController.CloseCabinDoorLeft();
                        }
                    }
                    //Cabin right door
                    if (!_trainController_v3.DoorsController.CabinRightDoorOpen)
                    {
                        if (GUILayout.Button(openRightCabinDoor))
                        {
                            _trainController_v3.DoorsController.OpenCabinDoorRight();
                        }
                    }
                    else
                    {
                        if (GUILayout.Button(closeRightCabinDoor))
                        {
                            _trainController_v3.DoorsController.CloseCabinDoorRight();
                        }
                    }
                    GUILayout.EndHorizontal();

                    GUILayout.BeginHorizontal();
                    //Passengers left door
                    if (!_trainController_v3.DoorsController.PassengerLeftDoorOpen)
                    {
                        if (GUILayout.Button(openLeftPassengerDoor))
                        {
                            _trainController_v3.DoorsController.StationDoorDirection = StationDoorDirection.Left;
                            _trainController_v3.DoorsController.OpenPassengersDoors();
                        }
                    }
                    else
                    {
                        if (GUILayout.Button(closeLeftPassengerDoor))
                        {
                            _trainController_v3.DoorsController.ClosePassengersLeftDoors();
                        }
                    }
                    //Passengers right door
                    if (!_trainController_v3.DoorsController.PassengerRightDoorOpen)
                    {
                        if (GUILayout.Button(openRightPassengerDoor))
                        {
                            _trainController_v3.DoorsController.StationDoorDirection = StationDoorDirection.Right; _trainController_v3.DoorsController.OpenPassengersDoors();
                        }
                    }
                    else
                    {
                        if (GUILayout.Button(closeRightPassengerDoor))
                        {
                            _trainController_v3.DoorsController.ClosePassengersRightDoors();
                        }
                    }
                }
            }

            GUILayout.EndHorizontal();
            GUILayout.EndHorizontal();
            GUILayout.EndHorizontal();

            #endregion
        }
        else if (_selectedMenuIndex == (int)TrainControllerInspectorMenu.Wagons)
        {
            #region Wagons

            GUILayout.Label("TRAIN WAGONS", EditorStyles.boldLabel);

            EditorGUI.BeginChangeCheck();
            serializedObject.Update();
            EditorGUILayout.PropertyField(serializedObject.FindProperty("wagons"), true);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_trainController_v3, "Changed Wagons");
                serializedObject.ApplyModifiedProperties();
                MarkSceneAlteration();
            }

            GUILayout.Label("WAGONS OPERATIONS", EditorStyles.boldLabel);

            #region EDITOR MODE ONLY

            using (new EditorGUI.DisabledScope(Application.isPlaying))
            {
                if (GUILayout.Button("Connect Wagons"))
                {
#if UNITY_EDITOR
                    Undo.RecordObject(_trainController_v3, "Wagons Connected");
#endif
                    SetWagonsPositions();
#if UNITY_EDITOR
                    MarkSceneAlteration();
#endif
                }
            }
            #endregion

            #region PLAY MODE ONLY

            using (new EditorGUI.DisabledScope(!Application.isPlaying))
            {
                GUILayout.BeginHorizontal();
                if (GUILayout.Button("Decouple First Wagon"))
                {
                    _trainController_v3.DecoupleFirstWagon();
                }

                if (GUILayout.Button("Decouple Last Wagon"))
                {
                    _trainController_v3.DecoupleLastWagon();
                }
                GUILayout.EndHorizontal();
            }
            #endregion

            #endregion
        }
        else if (_selectedMenuIndex == (int)TrainControllerInspectorMenu.Lights)
        {
            #region Lights

            GUILayout.Label("TRAIN LIGHTS", EditorStyles.boldLabel);

            EditorGUI.BeginChangeCheck();
            serializedObject.Update();
            EditorGUILayout.PropertyField(serializedObject.FindProperty("externalLights"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("internalLights"), true);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_trainController_v3, "Changed Lights");
                serializedObject.ApplyModifiedProperties();
                MarkSceneAlteration();
            }

            GUILayout.Label("LIGHTS OPERATIONS", EditorStyles.boldLabel);

            GUILayout.BeginHorizontal();
            if (GUILayout.Button("External Lights"))
            {
#if UNITY_EDITOR
                Undo.RecordObject(_trainController_v3, "Toggled External Lights");
#endif
                _trainController_v3.ToggleLights();
#if UNITY_EDITOR
                MarkSceneAlteration();
#endif
            }

            if (GUILayout.Button("Internal Lights"))
            {
#if UNITY_EDITOR
                Undo.RecordObject(_trainController_v3, "Toggled Internal Lights");
#endif
                _trainController_v3.ToggleInternalLights();
#if UNITY_EDITOR
                MarkSceneAlteration();
#endif
            }
            GUILayout.EndHorizontal();

            #endregion
        }
        else if (_selectedMenuIndex == (int)TrainControllerInspectorMenu.SFX)
        {
            #region SFX

            GUILayout.Label("TRAIN SFXS", EditorStyles.boldLabel);

            EditorGUI.BeginChangeCheck();
            serializedObject.Update();
            EditorGUILayout.PropertyField(serializedObject.FindProperty("hornSFX"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("bellSFX"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("engineSFX"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("wheelsSFX"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("brakesSFX"), true);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_trainController_v3, "Changed SFX");
                serializedObject.ApplyModifiedProperties();
                MarkSceneAlteration();
            }

            GUILayout.Label("SFX OPERATIONS", EditorStyles.boldLabel);

            //Enabled only on lpay mode
            using (new EditorGUI.DisabledScope(!Application.isPlaying))
            {
                GUILayout.BeginHorizontal();
                if (GUILayout.Button("Honk"))
                {
                    _trainController_v3.Honk();
                }

                if (GUILayout.Button("Bell"))
                {
                    _trainController_v3.ToogleBell();
                }
                GUILayout.EndHorizontal();
            }

            #endregion
        }
        else if (_selectedMenuIndex == (int)TrainControllerInspectorMenu.OtherSettings)
        {
            #region OtherSettings

            GUILayout.Label("MECHANICAL COMPONENTS", EditorStyles.boldLabel);

            EditorGUI.BeginChangeCheck();
            serializedObject.Update();
            EditorGUILayout.PropertyField(serializedObject.FindProperty("wheelsScripts"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("sensors"), true);
            EditorGUILayout.PropertyField(serializedObject.FindProperty("backJoint"), true);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(_trainController_v3, "Changed Other Settings");
                serializedObject.ApplyModifiedProperties();
                MarkSceneAlteration();
            }

            #endregion
        }

        GUILayout.EndVertical();
    }