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