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);
        }
예제 #7
0
 public static CarBuilder <TCar> CreateCar <TCar>(GameObject go, CoasterCar car) where TCar : Car
 {
     return(CreateCar <TCar>(go)
            .Id(car.Guid));
 }