// 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; } }
// - 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 }
// --- 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 }