예제 #1
0
        public override void OnInspectorGUI()
        {
            GasMotor               targetScript = (GasMotor)target;
            DriveForce             nextOutput;
            Transmission           nextTrans;
            GearboxTransmission    nextGearbox;
            ContinuousTransmission nextConTrans;
            Suspension             nextSus;
            bool   reachedEnd = false;
            string endOutput  = "";

            if (targetScript.outputDrives != null)
            {
                if (targetScript.outputDrives.Length > 0)
                {
                    topSpeed   = targetScript.torqueCurve.keys[targetScript.torqueCurve.length - 1].time * 1000;
                    nextOutput = targetScript.outputDrives[0];

                    while (!reachedEnd)
                    {
                        if (nextOutput)
                        {
                            if (nextOutput.GetComponent <Transmission>())
                            {
                                nextTrans = nextOutput.GetComponent <Transmission>();

                                if (nextTrans is GearboxTransmission)
                                {
                                    nextGearbox = (GearboxTransmission)nextTrans;
                                    topSpeed   /= nextGearbox.gears[nextGearbox.gears.Length - 1].ratio;
                                }
                                else if (nextTrans is ContinuousTransmission)
                                {
                                    nextConTrans = (ContinuousTransmission)nextTrans;
                                    topSpeed    /= nextConTrans.maxRatio;
                                }

                                if (nextTrans.outputDrives.Length > 0)
                                {
                                    nextOutput = nextTrans.outputDrives[0];
                                }
                                else
                                {
                                    topSpeed   = -1;
                                    reachedEnd = true;
                                    endOutput  = nextTrans.transform.name;
                                }
                            }
                            else if (nextOutput.GetComponent <Suspension>())
                            {
                                nextSus = nextOutput.GetComponent <Suspension>();

                                if (nextSus.wheel)
                                {
                                    topSpeed /= Mathf.PI * 100;
                                    topSpeed *= nextSus.wheel.tireRadius * 2 * Mathf.PI;
                                }
                                else
                                {
                                    topSpeed = -1;
                                }

                                reachedEnd = true;
                                endOutput  = nextSus.transform.name;
                            }
                            else
                            {
                                topSpeed   = -1;
                                reachedEnd = true;
                                endOutput  = targetScript.transform.name;
                            }
                        }
                        else
                        {
                            topSpeed   = -1;
                            reachedEnd = true;
                            endOutput  = targetScript.transform.name;
                        }
                    }
                }
                else
                {
                    topSpeed  = -1;
                    endOutput = targetScript.transform.name;
                }
            }
            else
            {
                topSpeed  = -1;
                endOutput = targetScript.transform.name;
            }

            if (topSpeed == -1)
            {
                EditorGUILayout.HelpBox("Motor drive doesn't reach any wheels.  (Ends at " + endOutput + ")", MessageType.Warning);
            }
            else if (targets.Length == 1)
            {
                EditorGUILayout.LabelField("Top Speed (Estimate): " + (topSpeed * 2.23694f).ToString("0.00") + " mph || " + (topSpeed * 3.6f).ToString("0.00") + " km/h", EditorStyles.boldLabel);
            }

            DrawDefaultInspector();
        }
        // Caculate ideal RPM ranges for each gear (works most of the time)
        public void CalculateRpmRanges()
        {
            bool cantCalc = false;

            if (!Application.isPlaying)
            {
                GasMotor engine = transform.GetTopmostParentComponent <VehicleParent>().GetComponentInChildren <GasMotor>();

                if (engine)
                {
                    maxRPM = engine.torqueCurve.keys[engine.torqueCurve.length - 1].time;
                }
                else
                {
                    Debug.LogError("There is no <GasMotor> in the vehicle to get RPM info from.", this);
                    cantCalc = true;
                }
            }

            if (!cantCalc)
            {
                float prevGearRatio;
                float nextGearRatio;
                float actualMaxRPM = maxRPM * 1000;

                for (int i = 0; i < gears.Length; i++)
                {
                    prevGearRatio = gears[Mathf.Max(i - 1, 0)].ratio;
                    nextGearRatio = gears[Mathf.Min(i + 1, gears.Length - 1)].ratio;

                    if (gears[i].ratio < 0)
                    {
                        gears[i].minRPM = actualMaxRPM / gears[i].ratio;

                        if (nextGearRatio == 0)
                        {
                            gears[i].maxRPM = 0;
                        }
                        else
                        {
                            gears[i].maxRPM = actualMaxRPM / nextGearRatio + (actualMaxRPM / nextGearRatio - gears[i].minRPM) * 0.5f;
                        }
                    }
                    else if (gears[i].ratio > 0)
                    {
                        gears[i].maxRPM = actualMaxRPM / gears[i].ratio;

                        if (prevGearRatio == 0)
                        {
                            gears[i].minRPM = 0;
                        }
                        else
                        {
                            gears[i].minRPM = actualMaxRPM / prevGearRatio - (gears[i].maxRPM - actualMaxRPM / prevGearRatio) * 0.5f;
                        }
                    }
                    else
                    {
                        gears[i].minRPM = 0;
                        gears[i].maxRPM = 0;
                    }

                    gears[i].minRPM *= 0.55f;
                    gears[i].maxRPM *= 0.55f;
                }
            }
        }