private void DrawCarDetailSection(CoasterCar car) { var newAsset = EditorGUILayout.ObjectField("Drop to add:", car.GameObject, typeof(GameObject), true) as GameObject; if (newAsset != null && newAsset != car.GameObject && newAsset.scene.name != null) // scene name is null for prefabs, yay for unity for checking it this way { car.GameObject = newAsset; } car.CoasterCarType = (CoasterCarType)EditorGUILayout.EnumPopup("Type:", car.CoasterCarType); if (car.CoasterCarType == CoasterCarType.Spinning) { car.SpinFriction = EditorGUILayout.Slider("Spin friction:", car.SpinFriction, 0f, 1f); car.SpinStrength = Mathf.RoundToInt(EditorGUILayout.Slider("Spin strength:", car.SpinStrength / 100f, 0f, 1f) * 100); car.SpinSymmetrySides = EditorGUILayout.IntField("Spin symmetry sides:", car.SpinSymmetrySides); } else if (car.CoasterCarType == CoasterCarType.Swinging) { car.SwingFriction = EditorGUILayout.Slider("Swing friction:", car.SwingFriction, 0f, 1f); car.SwingStrength = EditorGUILayout.Slider("Swing strength:", car.SwingStrength, 0f, 1f); car.SwingMaxAngle = EditorGUILayout.FloatField("Max swing angle:", car.SwingMaxAngle); car.SwingArmLength = EditorGUILayout.FloatField("Swing arm length:", car.SwingArmLength); } car.SeatWaypointOffset = EditorGUILayout.FloatField("Seat waypoint offset:", car.SeatWaypointOffset); car.OffsetFront = EditorGUILayout.FloatField("Offset front:", car.OffsetFront); car.OffsetBack = EditorGUILayout.FloatField("Offset back:", car.OffsetBack); base.Draw(car.GameObject); GUILayout.Space(15); GUILayout.Label("Restraints", "PreToolbar"); for (int i = car.Restraints.Count - 1; i >= 0; i--) { CoasterRestraints restraints = car.Restraints[i]; EditorGUILayout.BeginHorizontal(); GUILayout.Label("#" + i); if (GUILayout.Button("Delete")) { car.Restraints.RemoveAt(i); } EditorGUILayout.EndHorizontal(); restraints.TransformName = EditorGUILayout.TextField("Transform name", restraints.TransformName); restraints.ClosedAngle = EditorGUILayout.FloatField("Closed angle (X-Axis)", restraints.ClosedAngle); } if (GUILayout.Button("Add")) { CoasterRestraints restraints = new CoasterRestraints() { TransformName = "restraint" }; car.Restraints.Add(restraints); } }
private void DrawCar(CoasterCar car) { if (car == null || car.GameObject == null) { return; } GameObject carGO = car.GameObject; Utility.Utility.renderSeatGizmo(carGO); Color gizmoColor = Gizmos.color; Gizmos.color = Color.red; var seats = carGO. GetComponentsInChildren <Transform>(true).Where(transform => transform.name.StartsWith("Seat", true, CultureInfo.InvariantCulture)); foreach (Transform seatTransform in seats) { Vector3 position = seatTransform.position + seatTransform.forward * car.SeatWaypointOffset - Vector3.up * 0.06f; Gizmos.DrawSphere(position, 0.01f); } Gizmos.color = gizmoColor; Gizmos.color = Color.white; Vector3 frontPosition = carGO.transform.position + carGO.transform.forward * car.OffsetFront; Gizmos.DrawLine(frontPosition, frontPosition + Vector3.up * 0.5f); Handles.Label(frontPosition + Vector3.up * 0.5f + carGO.transform.forward * 0.1f, "Front"); Transform backAxis = carGO.transform.Find("backAxis"); if (backAxis != null) { Vector3 backPosition = backAxis.position; backPosition -= carGO.transform.forward * car.OffsetBack; Gizmos.DrawLine(backPosition, backPosition + Vector3.up * 0.5f); Handles.Label(backPosition - Vector3.up * 0.1f - carGO.transform.forward * 0.1f, "Back"); } foreach (CoasterRestraints restraints in car.Restraints) { var restraintTransforms = carGO. GetComponentsInChildren <Transform>(true).Where(transform => transform.name.StartsWith(restraints.TransformName, true, CultureInfo.InvariantCulture)); foreach (Transform restraintTransform in restraintTransforms) { MeshFilter meshFilter = restraintTransform.GetComponent <MeshFilter>(); if (meshFilter != null) { sceneViewMaterial.SetPass(0); Graphics.DrawMeshNow(meshFilter.sharedMesh, restraintTransform.position, restraintTransform.rotation * Quaternion.Euler(restraints.ClosedAngle, 0, 0)); sceneViewMaterial.SetPass(1); Graphics.DrawMeshNow(meshFilter.sharedMesh, restraintTransform.position, restraintTransform.rotation * Quaternion.Euler(restraints.ClosedAngle, 0, 0)); } } } }
/// <summary> /// Renders the specified asset. /// </summary> /// <param name="asset">The asset.</param> public void Render(Asset asset) { if (sceneViewMaterial == null) { sceneViewMaterial = (Material)AssetDatabase.LoadAssetAtPath("Assets/Editor/SceneViewGhostMaterial.mat", typeof(Material)); } CoasterCar previousCar = asset.LeadCar; if (asset.Car != null && asset.Car.GameObject != null) { if (previousCar != null && previousCar.GameObject != null) { GameObject previousCarObject = previousCar.GameObject; GameObject car = asset.Car.GameObject; float lengthAxis = 0; Transform backAxisMarker = previousCarObject.transform.Find("backAxis"); if (backAxisMarker != null) { lengthAxis = Mathf.Abs(backAxisMarker.localPosition.z); } car.transform.position = previousCarObject.transform.position - previousCarObject.transform.forward * (lengthAxis + previousCar.OffsetBack + asset.Car.OffsetFront); } previousCar = asset.Car; } if (asset.RearCar != null && asset.RearCar.GameObject != null) { if (previousCar != null && previousCar.GameObject != null) { GameObject previousCarObject = previousCar.GameObject; GameObject car = asset.RearCar.GameObject; float lengthAxis = 0; Transform backAxisMarker = previousCarObject.transform.Find("backAxis"); if (backAxisMarker != null) { lengthAxis = Mathf.Abs(backAxisMarker.localPosition.z); } car.transform.position = previousCarObject.transform.position - previousCarObject.transform.forward * (lengthAxis + previousCar.OffsetBack + asset.RearCar.OffsetFront); } } DrawCar(asset.LeadCar); DrawCar(asset.Car); DrawCar(asset.RearCar); }
private void DrawCarSection() { if (_selectedAsset.GameObject == null) { return; } GUILayout.Label("Car settings:", EditorStyles.boldLabel); if (_selectedAsset.Car == null) { CoasterCar car = new CoasterCar(""); _selectedAsset.Car = car; } _selectedAsset.Car.SeatWaypointOffset = EditorGUILayout.FloatField("Seat waypoint offset:", _selectedAsset.Car.SeatWaypointOffset); _selectedAsset.Car.OffsetFront = EditorGUILayout.FloatField("Offset front:", _selectedAsset.Car.OffsetFront); _selectedAsset.Car.OffsetBack = EditorGUILayout.FloatField("Offset back:", _selectedAsset.Car.OffsetBack); GUILayout.Space(15); GUILayout.Label("Restraints", "PreToolbar"); for (int i = _selectedAsset.Car.Restraints.Count - 1; i >= 0; i--) { CoasterRestraints restraints = _selectedAsset.Car.Restraints[i]; EditorGUILayout.BeginHorizontal(); GUILayout.Label("#" + i); if (GUILayout.Button("Delete")) { _selectedAsset.Car.Restraints.RemoveAt(i); } EditorGUILayout.EndHorizontal(); restraints.TransformName = EditorGUILayout.TextField("Transform name", restraints.TransformName); restraints.ClosedAngle = EditorGUILayout.FloatField("Closed angle (X-Axis)", restraints.ClosedAngle); } if (GUILayout.Button("Add")) { CoasterRestraints restraints = new CoasterRestraints(); restraints.TransformName = "restraint"; _selectedAsset.Car.Restraints.Add(restraints); } DrawSeatsDetailSection(_selectedAsset.GameObject); }
private void DrawCarDetailSection(CoasterCar car) { var newAsset = EditorGUILayout.ObjectField("Drop to add:", car.GameObject, typeof(GameObject), true) as GameObject; if (newAsset != null && newAsset != car.GameObject && newAsset.scene.name != null) // scene name is null for prefabs, yay for unity for checking it this way { car.GameObject = newAsset; } car.SeatWaypointOffset = EditorGUILayout.FloatField("Seat waypoint offset:", car.SeatWaypointOffset); car.OffsetFront = EditorGUILayout.FloatField("Offset front:", car.OffsetFront); car.OffsetBack = EditorGUILayout.FloatField("Offset back:", car.OffsetBack); DrawSeatsDetailSection(car.GameObject); GUILayout.Space(15); GUILayout.Label("Restraints", "PreToolbar"); for (int i = car.Restraints.Count - 1; i >= 0; i--) { CoasterRestraints restraints = car.Restraints[i]; EditorGUILayout.BeginHorizontal(); GUILayout.Label("#" + i); if (GUILayout.Button("Delete")) { car.Restraints.RemoveAt(i); } EditorGUILayout.EndHorizontal(); restraints.TransformName = EditorGUILayout.TextField("Transform name", restraints.TransformName); restraints.ClosedAngle = EditorGUILayout.FloatField("Closed angle (X-Axis)", restraints.ClosedAngle); } if (GUILayout.Button("Add")) { CoasterRestraints restraints = new CoasterRestraints(); restraints.TransformName = "restraint"; car.Restraints.Add(restraints); } }
/// <summary> /// Draws the asset image sign detail section. /// </summary> private void DrawAssetTrainDetailSection() { if (_selectedAsset.GameObject == null) { return; } GUILayout.Label("Train settings:", EditorStyles.boldLabel); if (_selectedAsset.GameObject.transform.Find("backAxis") == null) { EditorGUILayout.HelpBox("There is no backAxis marker!", MessageType.Error); } int trackedRideNameIndex = EditorGUILayout.Popup("Ride", Array.IndexOf(trackedRideNames, _selectedAsset.TrackedRideName), trackedRideNames); if (trackedRideNameIndex >= 0 && trackedRideNameIndex < trackedRideNames.Length) { _selectedAsset.TrackedRideName = trackedRideNames[trackedRideNameIndex]; } _selectedAsset.DefaultTrainLength = EditorGUILayout.IntSlider("Default train length: ", _selectedAsset.DefaultTrainLength, 1, 12); _selectedAsset.MinTrainLength = EditorGUILayout.IntSlider("Minimum train length: ", _selectedAsset.MinTrainLength, 1, 12); _selectedAsset.MaxTrainLength = EditorGUILayout.IntSlider("Maximum train length: ", _selectedAsset.MaxTrainLength, 1, 12); GUILayout.Space(15); if (_selectedAsset.LeadCar == null) { CoasterCar car = new CoasterCar(_selectedAsset.Guid + ".leadCar"); car.GameObject = _selectedAsset.GameObject; _selectedAsset.LeadCar = car; } GUILayout.Label("Lead Car:", EditorStyles.boldLabel); DrawCarDetailSection(_selectedAsset.LeadCar); GUILayout.Space(30); if (_selectedAsset.Car == null) { CoasterCar car = new CoasterCar(_selectedAsset.Guid + ".car"); _selectedAsset.Car = car; } if (_selectedAsset.Car.GameObject == _selectedAsset.LeadCar.GameObject) { _selectedAsset.Car.GameObject = null; } GUILayout.Label("Normal Car:", EditorStyles.boldLabel); DrawCarDetailSection(_selectedAsset.Car); GUILayout.Space(30); if (_selectedAsset.RearCar == null) { CoasterCar car = new CoasterCar(_selectedAsset.Guid + ".rearCar"); _selectedAsset.RearCar = car; } if (_selectedAsset.RearCar.GameObject == _selectedAsset.LeadCar.GameObject || _selectedAsset.RearCar.GameObject == _selectedAsset.Car.GameObject) { _selectedAsset.RearCar.GameObject = null; } GUILayout.Label("Rear Car:", EditorStyles.boldLabel); DrawCarDetailSection(_selectedAsset.RearCar); }
public static CarBuilder <TCar> CreateCar <TCar>(GameObject go, CoasterCar car) where TCar : Car { return(CreateCar <TCar>(go) .Id(car.Guid)); }