Exemplo n.º 1
0
        public void CompositeTest()
        {
            const double totalForce = 1500d;
            var          flwheel    = new Wheel {
                Position = "Front Left"
            };
            var frwheel = new Wheel {
                Position = "Front Right"
            };
            var mlwheel = new Wheel {
                Position = "Middle Left"
            };
            var mrwheel = new Wheel {
                Position = "Middle Rigth"
            };
            var rlwheel = new Wheel {
                Position = "Rear Left"
            };
            var rrwheel = new Wheel {
                Position = "Rear Right"
            };
            var rearWheels = new WheelGroup {
                Gears = new List <Wheel> {
                    rlwheel, rrwheel
                }
            };

            new WheelGroup
            {
                Gears = new List <IBrakeable> {
                    flwheel, frwheel, mlwheel, mrwheel, rearWheels
                },
                BrakeForce = totalForce
            };

            Assert.Equal(300, flwheel.BrakeForce);
            Assert.Equal(150, rlwheel.BrakeForce);
            Assert.Equal(300, rearWheels.BrakeForce);
        }
Exemplo n.º 2
0
        private void Redraw()
        {
            vc = VehicleChanger.ActiveVehicleController;
            if (vc == null)
            {
                return;
            }

            AddTitle("Engine");
            AddSettings(vc.powertrain.engine);
            AddSettings(vc.powertrain.engine.forcedInduction);


            AddTitle("Clutch");
            AddSettings(vc.powertrain.clutch);

            AddTitle("Transmission");
            AddSettings(vc.powertrain.transmission);
            AddSettings(vc.powertrain.transmission.gearingProfile);

            AddTitle("Differentials");
            for (int i = 0; i < vc.powertrain.differentials.Count; i++)
            {
                AddSettings(vc.powertrain.differentials[i]);
            }

            // Display axles
            for (int i = 0; i < 2; i++)
            {
                WheelGroup axle = vc.powertrain.wheelGroups[i];
                if (axle == null)
                {
                    return;
                }
                AddTitle("Axle " + i);
                AddSettings(axle);

                AddTitle("Left Wheel, Axle " + i, true);
                WheelController leftWheelController = axle.LeftWheel.wheelController;
                AddSettings(leftWheelController);
                AddSettings(leftWheelController.wheel);
                AddSettings(leftWheelController.spring);
                AddSettings(leftWheelController.damper);
                AddSettings(leftWheelController.forwardFriction);
                AddSettings(leftWheelController.sideFriction);

                AddTitle("Right Wheel, Axle " + i, true);
                WheelController rightWheelController = axle.RightWheel.wheelController;
                AddSettings(rightWheelController);
                AddSettings(rightWheelController.wheel);
                AddSettings(rightWheelController.spring);
                AddSettings(rightWheelController.damper);
                AddSettings(rightWheelController.forwardFriction);
                AddSettings(rightWheelController.sideFriction);
            }

            AddTitle("Steering");
            AddSettings(vc.steering);

            AddTitle("Brakes");
            AddSettings(vc.brakes);

            // Display modules
            AddTitle("Modules:");

            for (int i = 0; i < vc.moduleManager.modules.Count; i++)
            {
                AddTitle(vc.moduleManager.modules[i].GetType().Name);
                AddSettings(vc.moduleManager.modules[i]);
            }
        }
Exemplo n.º 3
0
        public override void SetDefaults(VehicleController vc)
        {
            base.SetDefaults(vc);

            engine.name       = "Engine";
            engine.inertia    = 0.2f;
            clutch.name       = "Clutch";
            transmission.name = "Transmission";

            engine.SetOutput(clutch);
            clutch.SetOutput(transmission);

            engine.powerCurve = new AnimationCurve
            {
                keys = new[]
                {
                    new Keyframe(0f, 0f, 0, 1f),
                    new Keyframe(0.3f, 0.53f, 1f, 1f),
                    new Keyframe(0.5f, 0.8f, 1f, 1f),
                    new Keyframe(1f, 1f)
                }
            };

            transmission.gearingProfile =
                Resources.Load(VehicleController.DEFAULT_RESOURCES_PATH + "DefaultGearingProfile")
                as TransmissionGearingProfile;

            // Find wheels
            wheels = new List <WheelComponent>();
            foreach (WheelController wheelController in vc.GetComponentsInChildren <WheelController>())
            {
                wheels.Add(new WheelComponent
                {
                    name            = "Wheel" + wheelController.name,
                    wheelController = wheelController
                });
                Debug.Log($"VehicleController setup: Found WheelController '{wheelController.name}'");
            }

            if (wheels.Count == 0)
            {
                Debug.LogWarning("No WheelControllers found, skipping powertrain auto-setup.");
                return;
            }

            // Order wheels in left-right, front to back order.
            wheels = wheels.OrderByDescending(w => w.wheelController.transform.localPosition.z).ToList();
            List <int> wheelGroupIndices = new List <int>();
            int        wheelGroupCount   = 1;
            float      prevWheelZ        = wheels[0].wheelController.transform.localPosition.z;

            for (int i = 0; i < wheels.Count; i++)
            {
                WheelComponent wheel  = wheels[i];
                float          wheelZ = wheel.wheelController.transform.localPosition.z;

                // Wheels are on different axes, add new axis/wheel group.
                if (Mathf.Abs(wheelZ - prevWheelZ) > 0.2f)
                {
                    wheelGroupCount++;
                }
                // Wheels are on the same axle, order left to right.
                else if (i > 0)
                {
                    if (wheels[i].wheelController.transform.localPosition.x <
                        wheels[i - 1].wheelController.transform.localPosition.x)
                    {
                        WheelComponent tmp = wheels[i - 1];
                        wheels[i - 1] = wheels[i];
                        wheels[i]     = tmp;
                    }
                }

                wheelGroupIndices.Add(wheelGroupCount - 1);
                prevWheelZ = wheelZ;
            }

            // Add wheel groups
            wheelGroups = new List <WheelGroup>();
            for (int i = 0; i < wheelGroupCount; i++)
            {
                string appendix  = i == 0 ? "Front" : i == wheelGroupCount - 1 ? "Rear" : "Middle";
                string groupName = $"{appendix} Axle {i}";
                wheelGroups.Add(new WheelGroup
                {
                    name                 = groupName,
                    brakeCoefficient     = i == 0 || wheelGroupCount > 2 ? 1f : 0.7f,
                    handbrakeCoefficient = i == wheelGroupCount - 1 ? 1f : 0f,
                    steerCoefficient     = i == 0 ? 1f : i == 1 && wheelGroupCount > 2 ? 0.5f : 0f,
                    ackermanPercent      = i == 0 ? 0.12f : 0f,
                    antiRollBarForce     = 3000f,
                    isSolid              = false
                });
                Debug.Log($"VehicleController setup: Creating WheelGroup '{groupName}'");
            }

            // Add differentials
            differentials = new List <DifferentialComponent>();
            Debug.Log("[Powertrain] Adding 'Front Differential'");
            differentials.Add(new DifferentialComponent {
                name = "Front Differential"
            });
            Debug.Log("[Powertrain] Adding 'Rear Differential'");
            differentials.Add(new DifferentialComponent {
                name = "Rear Differential"
            });
            Debug.Log("[Powertrain] Adding 'Center Differential'");
            differentials.Add(new DifferentialComponent {
                name = "Center Differential"
            });
            differentials[2].SetOutput(differentials[0], differentials[1]);

            // Connect transmission to differentials
            Debug.Log($"[Powertrain] Setting transmission output to '{differentials[2].name}'");
            transmission.SetOutput(differentials[2]);

            // Add wheels to wheel groups
            for (int i = 0; i < wheels.Count; i++)
            {
                int wheelGroupIndex = wheelGroupIndices[i];
                wheels[i].wheelGroupSelector = new WheelGroupSelector {
                    index = wheelGroupIndex
                };
                Debug.Log($"[Powertrain] Adding '{wheels[i].name}' to '{wheelGroups[wheelGroupIndex].name}'");
            }

            // Connect wheels to differentials
            int diffCount        = differentials.Count;
            int wheelGroupsCount = wheelGroups.Count;

            wheelGroupsCount =
                wheelGroupCount > 2
                    ? 2
                    : wheelGroupCount; // Prevent from resetting diffs on vehicles with more than 2 axles
            for (int i = 0; i < wheelGroupsCount; i++)
            {
                WheelGroup            group           = wheelGroups[i];
                List <WheelComponent> belongingWheels = group.FindWheelsBelongingToGroup(ref wheels, i);

                if (belongingWheels.Count == 2)
                {
                    Debug.Log(
                        $"[Powertrain] Setting output of '{differentials[i].name}' to '{belongingWheels[0].name}'");
                    if (belongingWheels[0].wheelController.vehicleSide == WheelController.Side.Left)
                    {
                        differentials[i].SetOutput(belongingWheels[0], belongingWheels[1]);
                    }
                    else if (belongingWheels[0].wheelController.vehicleSide == WheelController.Side.Right)
                    {
                        differentials[i].SetOutput(belongingWheels[1], belongingWheels[0]);
                    }
                    else
                    {
                        Debug.LogWarning(
                            "[Powertrain] Powertrain settings for center wheels have to be manually set up. If powered either connect it directly to transmission (motorcycle) or to one side of center differential (trike).");
                    }
                }
            }
        }