Пример #1
0
    // Set HUD texts
    void UpdateHUD()
    {
        switch (alusController.gear.name)
        {
        // TakeOff/Landing
        case AlusController.SpaceshipGear.LandingGear:
            if ((vehicle.gravityBody.distanceToClosestPlanetSurface * 10f) >= 0 && (vehicle.gravityBody.distanceToClosestPlanetSurface * 10f) <= vehicle.gravityBody.closestPlanetRadius * 0.2f - 50)
            {
                floatHeightSlider.minValue = Mathf.Clamp((vehicle.gravityBody.distanceToClosestPlanetSurface * 10f) - 50, -10, 1000000);
                floatHeightSlider.maxValue = (vehicle.gravityBody.distanceToClosestPlanetSurface * 10f) + 50;
            }
            floatHeightText.text = floatHeightSlider.value.ToString("0.0") + "m";
            floatAngleText.text  = floatAngleSlider.value + "°";

            float overTheEdge = floatDirectionSlider.minValue;
            float lastValue   = floatDirectionSlider.value;
            float alusDir     = MathfCustom.AngleSigned(alusController.startForwardDirection, transform.forward, transform.up) + 180;
            floatDirectionSlider.minValue = alusDir;
            floatDirectionSlider.maxValue = alusDir + 360;
            if (overTheEdge - floatDirectionSlider.minValue > 300)
            {
                floatDirectionSlider.value = lastValue - 360;
            }
            else if (overTheEdge - floatDirectionSlider.minValue < -300)
            {
                floatDirectionSlider.value = lastValue + 360;
            }

            if (initDir)
            {
                floatDirectionSlider.value = floatDirectionSlider.minValue + 180;
                initDir = false;
            }

            break;

        // Planetary Drive
        case AlusController.SpaceshipGear.PlanetaryDrive:
            alusController.gear.normalGlideValue = glideSlider.value;
            alusController.invertY = inverseYToggle.isOn;
            speedText.text         = "Speed: " + (rb.velocity.magnitude * 10f).ToString("0") + " m/sec";
            thrusterText.text      = "Thruster\n" + alusController.thruster.heat.ToString("0") + "/" + alusController.thruster.maxHeat;
            break;

        // Space Drive
        case AlusController.SpaceshipGear.SpaceDrive:
            alusController.gear.normalGlideValue = glideSlider.value;
            alusController.invertY = inverseYToggle.isOn;
            speedText.text         = "speed: " + (rb.velocity.magnitude * 10f / 1000f).ToString("0") + " km/sec";
            thrusterText.text      = "Thruster\n" + alusController.thruster.heat.ToString("0") + "/" + alusController.thruster.maxHeat;
            break;

        // Hyper Drive
        case AlusController.SpaceshipGear.HyperDrive:
            break;

        // Null
        default:
            break;
        }
    }
Пример #2
0
    // - Update -
    void Update()
    {
        #region [ - Directions - ]
        up = localGlobalUp.value;

        float Xangle = 360 + (MathfCustom.AngleSigned(up, transform.forward, transform.right) - 180);
        if (Xangle >= 270)
        {
            right   = Vector3.Cross(up, transform.forward).normalized;
            forward = Vector3.Cross(right, up).normalized;
        }
        else
        {
            forward = Vector3.Cross(transform.right, up).normalized;
            right   = Vector3.Cross(up, forward).normalized;
        }
        #endregion


        #region [ - Velocities - ]
        if (calculateVelocities)
        {
            upVel      = Vector3.Project(rb.velocity, up);
            rightVel   = Vector3.Project(rb.velocity, right);
            forwardVel = Vector3.Project(rb.velocity, forward);

            upAngVel      = Vector3.Project(rb.angularVelocity, up);
            rightAngVel   = Vector3.Project(rb.angularVelocity, right);
            forwardAngVel = Vector3.Project(rb.angularVelocity, forward);
        }
        #endregion


        #region [ - Magnitudes - ]
        if (calculateMagnitudes)
        {
            upMag             = upVel.magnitude;
            velocityPoint     = rb.velocity.normalized;
            magnitudeNegative = Vector3.Distance(velocityPoint, up) > Vector3.Distance(Vector3.zero, up);
            if (magnitudeNegative)
            {
                upMag *= -1;
            }

            rightMag          = upVel.magnitude;
            velocityPoint     = rb.velocity.normalized;
            magnitudeNegative = Vector3.Distance(velocityPoint, right) > Vector3.Distance(Vector3.zero, right);
            if (magnitudeNegative)
            {
                rightMag *= -1;
            }

            forwardMag        = forwardVel.magnitude;
            velocityPoint     = rb.velocity.normalized;
            magnitudeNegative = Vector3.Distance(velocityPoint, forward) > Vector3.Distance(Vector3.zero, forward);
            if (magnitudeNegative)
            {
                forwardMag *= -1;
            }

            forwardAngMag     = forwardAngVel.magnitude;
            velocityPoint     = rb.angularVelocity.normalized;
            magnitudeNegative = Vector3.Distance(velocityPoint, forward) < Vector3.Distance(velocityPoint, -forward);
            if (magnitudeNegative)
            {
                forwardAngMag *= -1;
            }

            upAngMag          = upAngVel.magnitude;
            velocityPoint     = rb.angularVelocity.normalized;
            magnitudeNegative = Vector3.Distance(velocityPoint, up) < Vector3.Distance(velocityPoint, -up);
            if (magnitudeNegative)
            {
                upAngMag *= -1;
            }

            rightAngMag       = rightAngVel.magnitude;
            velocityPoint     = rb.angularVelocity.normalized;
            magnitudeNegative = Vector3.Distance(velocityPoint, right) < Vector3.Distance(velocityPoint, -right);
            if (magnitudeNegative)
            {
                rightAngMag *= -1;
            }
        }
        #endregion


        #region [ - Debug - ]
        if (drawDebugLines)
        {
            Debug.DrawLine(transform.position, transform.position + up, Color.green);
            Debug.DrawLine(transform.position, transform.position + right, Color.red);
            Debug.DrawLine(transform.position, transform.position + forward, Color.blue);
        }
        #endregion
    }
Пример #3
0
    // --- Fixed Update ---
    void FixedUpdate()
    {
        #region [ ------ LANDING GEAR ------ ]
        if (gear.name == SpaceshipGear.LandingGear)
        {
            float   lerpVal              = 1;
            float   Ydistance            = Mathf.Abs(alusHUD.floatHeightSlider.value + vehicle.gravityBody.closestPlanetRadius * 10f - vehicle.gravityBody.distanceToClosestPlanet * 10f);
            Vector3 newLogGlobRightVel   = PLDir.rightVel;
            Vector3 newLogGlobUpVel      = PLDir.upVel;
            Vector3 newLogGlobForwardVel = PLDir.forwardVel;

            Vector3 newLogGlobRightAngVel   = PLDir.rightAngVel;
            Vector3 newLogGlobUpAngVel      = PLDir.upAngVel;
            Vector3 newLogGlobForwardAngVel = PLDir.forwardAngVel;

            Vector3 addForce  = Vector3.zero;
            Vector3 addTorque = Vector3.zero;

            // --- Position --- // TODO: position muuttaminen landing gearille

            if (PLDir.rightVel.magnitude != 0 || PLDir.forwardVel.magnitude != 0)
            {
                newLogGlobForwardVel *= 0.9f;
                newLogGlobRightVel   *= 0.9f;
            }



            // --- Altitude ---

            /*if (Mathf.Abs(alusHUD.floatHeightSlider.value - vehicle.gravityBody.distanceToClosestPlanetSurface * 10f) < 0.05f && PLDir.upVel.magnitude < 0.05f) {
             *  newLogGlobUpVel = Vector3.zero;
             * }
             * else {*/
            // Jos alus on matalemmalla kuin float korkeus
            if (vehicle.gravityBody.distanceToClosestPlanet * 10f < alusHUD.floatHeightSlider.value + vehicle.gravityBody.closestPlanetRadius * 10f)
            {
                if (PLDir.upMag < gear.maxSpeed)       // max speed
                {
                    if (PLDir.upMag < 0)
                    {
                        newLogGlobUpVel *= 0.9f;
                        lerpVal          = gear.glideCurve.Evaluate(Ydistance) / 2f;
                    }
                    else
                    {
                        lerpVal = gear.glideCurve.Evaluate(Ydistance);
                    }
                    addForce += PLDir.up * gear.acceleration * lerpVal;
                }
            }
            // ..korkeammalla
            else if (PLDir.upMag < gear.maxReverseSpeed)       // max reverse speed
            {
                if (PLDir.upMag > 0)
                {
                    newLogGlobUpVel *= 0.9f;
                    lerpVal          = gear.glideCurve.Evaluate(Ydistance) / 2f;
                }
                else
                {
                    lerpVal = gear.glideCurve.Evaluate(Ydistance);
                }
                addForce -= PLDir.up * gear.reverseSpeed * lerpVal;
            }
            else
            {
                addForce += PLDir.up * gear.reverseSpeed;
            }
            //}

            // --- Direction ---
            if (Mathf.Abs(alusHUD.floatDirectionSlider.value - (alusHUD.floatDirectionSlider.minValue + 180)) < 0.05f && PLDir.rightAngVel.magnitude < 0.05f)   // paikoillaan jos tarpeeksi lähellä tavoite tilaa
            {
                newLogGlobUpAngVel = Vector3.zero;
            }
            else   // liikkuminen kohti tavoite tilaa
            {
                if (alusHUD.floatDirectionSlider.value < alusHUD.floatDirectionSlider.minValue + 180)
                {
                    if (PLDir.upAngMag < 0)
                    {
                        newLogGlobUpAngVel *= 0.6f;
                    }
                    addTorque -= PLDir.up * gear.rotationSpeed;
                }
                else
                {
                    if (PLDir.upAngMag > 0)
                    {
                        newLogGlobUpAngVel *= 0.6f;
                    }
                    addTorque += PLDir.up * gear.rotationSpeed;
                }
            }

            // --- Angle ---

            // YlösAlas
            float xVal = 360 + (MathfCustom.AngleSigned(PLDir.up, transform.forward, transform.right) - 180 - 270);
            if (xVal >= 180)
            {
                xVal -= 360;
            }
            else if (xVal < -180)
            {
                xVal += 360;
            }
            xVal *= -1;
            if (Mathf.Abs(xVal - alusHUD.floatAngleSlider.value) < 0.05f && PLDir.rightAngVel.magnitude < 0.05f)   // paikoillaan jos tarpeeksi lähellä tavoite tilaa
            {
                newLogGlobRightAngVel = Vector3.zero;
            }
            else   // liikkuminen kohti tavoite tilaa
            {
                if (xVal > alusHUD.floatAngleSlider.value)
                {
                    if (PLDir.rightAngMag > 0)
                    {
                        newLogGlobRightAngVel *= 0.6f;
                    }
                    addTorque += PLDir.right * gear.rotationSpeed;
                }
                else
                {
                    if (PLDir.rightAngMag < 0)
                    {
                        newLogGlobRightAngVel *= 0.6f;
                    }
                    addTorque -= PLDir.right * gear.rotationSpeed;
                }
            }

            // Kallistuminen vinoittain // TODO: korjaa bugi jossa oikealle kallistuessa alus ei palaa normaaliin
            float zVal = MathfCustom.AngleSigned(PLDir.right, transform.up, transform.forward);
            zVal += 90;
            if (zVal >= 360)
            {
                zVal -= 360;
            }
            else if (zVal < 0)
            {
                zVal += 360;
            }
            if (Mathf.Abs(zVal) - 90f < 0.05f && PLDir.forwardAngVel.magnitude < 0.05f)  // paikoillaan jos tarpeeksi lähellä tavoite tilaa
            {
                newLogGlobForwardAngVel = Vector3.zero;
            }
            else   // liikkuminen kohti tavoite tilaa
            {
                if (zVal <= 180)
                {
                    if (PLDir.forwardAngMag > 0)
                    {
                        newLogGlobForwardAngVel *= 0.6f;
                    }
                    addTorque += PLDir.forward * gear.rotationSpeed;
                }
                else
                {
                    if (PLDir.forwardAngMag < 0)
                    {
                        newLogGlobForwardAngVel *= 0.6f;
                    }
                    addTorque -= PLDir.forward * gear.rotationSpeed;
                }
            }

            rb.velocity        = newLogGlobRightVel + newLogGlobUpVel + newLogGlobForwardVel;
            rb.angularVelocity = newLogGlobRightAngVel + newLogGlobUpAngVel + newLogGlobForwardAngVel;

            rb.AddForce(addForce);
            rb.AddTorque(addTorque);
        }

        #endregion


        #region [ - Alus heiluu eri suuntiin riippuen voimista - ]
        if (vehicle.inUse)
        {
            currentAcceleration = (locVel - lastVelocity) / Time.deltaTime;
            lastVelocity        = locVel;

            cameraEffects.moveCameraBackwards(currentAcceleration.z);
            cameraEffects.moveCameraDownwards(currentAcceleration.y / 400f);
            cameraEffects.moveCameraLeft(currentAcceleration.x / 400f);
        }
        #endregion
    }