Advertisement
Guest User

BallisticNG Physics

a guest
Apr 30th, 2015
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 32.90 KB | None | 0 0
  1. // This source file requires other source files in order to work, I have uploaded this at this time for people to see how everything is done.
  2. // Keep an eye on https://github.com/bigsnake09/BallisticNG in the future for the full source code.
  3.  
  4. using UnityEngine;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7.  
  8. public class ShipSimulator : MonoBehaviour {
  9.  
  10.     // References
  11.     public EventManager eventMan;
  12.     public ShipSettings settings;
  13.  
  14.     public ShipController shipController;
  15.     public Rigidbody shipBody;
  16.  
  17.     public GameObject shipAxis;
  18.     public GameObject shipCamera;
  19.     public GameObject shipCollder;
  20.  
  21.     // Event Settings
  22.     public GlobalSettings.ESpeedClasses eventClass;
  23.     public bool isShipRespawning;
  24.     public Vector3 respawnPoint;
  25.  
  26.     // Gravity
  27.     private Vector3 shipGravity;
  28.     public bool shipGrounded;
  29.     private float fallingDamper;
  30.     private float groundDistance;
  31.  
  32.     private float airResistance;
  33.     private float angularResistance;
  34.  
  35.     // Engine
  36.     private float engineGain;
  37.     private float engineFalloff;
  38.     private float engineAcceleration;
  39.     private float engineThrust;
  40.     public float engineSpeed;
  41.     public bool wallSurfing;
  42.  
  43.     private float enginePitchAmount;
  44.  
  45.     private float brakesAmount;
  46.     private float brakesGain;
  47.     private float brakesFalloff;
  48.     public bool shipBraking;
  49.  
  50.     private Vector3 speedDirection;
  51.     private float shipBoostTimer;
  52.     public bool isBoosting;
  53.     public bool boostingOverride;
  54.     private bool hitPad;
  55.  
  56.     // Turning
  57.     public float turnAmount;
  58.     private float turnGain;
  59.     private float turnFalloff;
  60.     private float airbrakeAmount;
  61.     private float airbrakeGain;
  62.     private float airbrakeFalloff;
  63.     private float airbrakeResistance;
  64.  
  65.     private float airbrakeLeftRaise;
  66.     private float airbrakeRightRaise;
  67.     private float airbrakeSlip;
  68.     private float airbrakeDrag;
  69.  
  70.     // Banking
  71.     private float bankAmount;
  72.     private float bankGain;
  73.     private float bankFalloff;
  74.     private float bankAirbrake;
  75.  
  76.     private float bankVelocity;
  77.  
  78.     // Anti-Band
  79.     private bool turnAntiBand;
  80.     private bool airbrakeAntiBand;
  81.  
  82.     // Camera
  83.     private int cameraMode;
  84.  
  85.     private Vector3 cameraOffset;
  86.     private float cameraAccelLag;
  87.     private float cameraFallLag;
  88.     private float cameraInputAmount;
  89.  
  90.     private float cameraMoveGain;
  91.     private float cameraMoveFalloff;
  92.     private float cameraFallingOffset;
  93.     private float cameraTurningOffset;
  94.     private float cameraTurningHeight;
  95.     private float cameraFallHelper;
  96.     private float cameraTurnAmount;
  97.  
  98.     private float cameraPitchMod;
  99.     private float cameraWantedPitch;
  100.  
  101.     private float cameraFoV;
  102.     private float cameraWallSurfFOV;
  103.  
  104.     private float cameraBoostFoV;
  105.     private float cameraBoostLength;
  106.  
  107.     private float cameraMovementLength;
  108.  
  109.     // Animations
  110.     private float shipHoverAnimTimer;
  111.     private float shipHoverAnimSpeed = 1.0f;
  112.     private float shipHoverAnimAmount = 0.2f;
  113.     private Vector3 shipHoverAnimOffset;
  114.     private Vector3 shipHoverCameraAnimOffset;
  115.  
  116.     public bool isColliding;
  117.  
  118.     // Barrel Roll
  119.     private float shipBRProgress;
  120.     private float shipBRActual;
  121.     private float shipBRTimer;
  122.     private float shipBRLastValue;
  123.     public float shipBRBoostTimer;
  124.     private float shipBRState;
  125.     private float shipBRGain;
  126.  
  127.     private bool shipHasBR;
  128.     private bool shipCanBR;
  129.     private bool shipBRSuccess;
  130.  
  131.     public float shipIntegrity = 100;
  132.  
  133.     void Update()
  134.     {
  135.         // Get the current speed class
  136.         eventClass = EventSettings.setupSpeedClass;
  137.     }
  138.  
  139.     void FixedUpdate()
  140.     {
  141.         if (isShipRespawning)
  142.         {
  143.             // Disable the ship collider
  144.             shipCollder.SetActive(false);
  145.  
  146.             // Move ship back to respawn point
  147.             transform.position = Vector3.Lerp(transform.position, respawnPoint, Time.deltaTime * 5);
  148.             float distanceToRespawn = Vector3.Distance(transform.position, respawnPoint);
  149.             if (distanceToRespawn < 10)
  150.             {
  151.                 isShipRespawning = false;
  152.             }
  153.  
  154.             // Reset engine
  155.             engineThrust = 0;
  156.             engineAcceleration = 0;
  157.             shipBRSuccess = false;
  158.         } else
  159.         {
  160.             // If the ship collider is disable then enable it
  161.             if (!shipCollder.activeSelf)
  162.                 shipCollder.SetActive(true);
  163.  
  164.             if (!shipController.manager.eventPaused)
  165.             {
  166.                 ShipGravity();
  167.                 ShipDrag();
  168.                 ShipAcceleration();
  169.                 ShipHandling();
  170.                 ShipAnimations();
  171.                 ShipBarrelRolls();
  172.             }
  173.         }
  174.         if (shipCamera != null)
  175.         {
  176.             UpdateShipCamera();
  177.         }
  178.  
  179.         // Ship Integrity
  180.         if (shipIntegrity < 0)
  181.         {
  182.  
  183.         }
  184.  
  185.         shipIntegrity += Time.deltaTime * 3;
  186.         if (shipIntegrity > 100)
  187.             shipIntegrity = 100;
  188.     }
  189.  
  190.     private void ShipGravity()
  191.     {
  192.         // Apply Gravity
  193.         switch(eventClass)
  194.         {
  195.         case GlobalSettings.ESpeedClasses.Venom:
  196.             if (shipGrounded)
  197.             {
  198.                 shipGravity = -transform.up * settings.shipGravity_D * 0.6f;
  199.             } else
  200.             {
  201.                 shipGravity = Vector3.down * settings.shipGravity_D;
  202.             }
  203.             break;
  204.         case GlobalSettings.ESpeedClasses.Flash:
  205.             if (shipGrounded)
  206.             {
  207.                 shipGravity = -transform.up * settings.shipGravity_C * 0.6f;
  208.             } else
  209.             {
  210.                 shipGravity = Vector3.down * settings.shipGravity_C;
  211.             }
  212.             break;
  213.         case GlobalSettings.ESpeedClasses.Rapier:
  214.             if (shipGrounded)
  215.             {
  216.                 shipGravity = -transform.up * settings.shipGravity_B * 0.6f;
  217.             } else
  218.             {
  219.                 shipGravity = Vector3.down * settings.shipGravity_B;
  220.             }
  221.             break;
  222.         case GlobalSettings.ESpeedClasses.Phantom:
  223.             if (shipGrounded)
  224.             {
  225.                 shipGravity = -transform.up * settings.shipGravity_A * 0.6f;
  226.             } else
  227.             {
  228.                 shipGravity = Vector3.down * settings.shipGravity_A;
  229.             }
  230.             break;
  231.         }
  232.         shipBody.AddForce(shipGravity, ForceMode.Acceleration);
  233.  
  234.         // Hover
  235.         List<Vector3> HoverPoints = new List<Vector3>()
  236.         {
  237.             transform.TransformPoint(-settings.shipSize.x * 0.5f, 0.0f, settings.shipSize.z * 0.5f), // FL
  238.             transform.TransformPoint(settings.shipSize.x * 0.5f, 0.0f, settings.shipSize.z * 0.5f), // FR
  239.             transform.TransformPoint(settings.shipSize.x * 0.5f, 0.0f, -settings.shipSize.z * 0.5f), // BR
  240.             transform.TransformPoint(-settings.shipSize.x * 0.5f, 0.0f, -settings.shipSize.z * 0.5f), // BL
  241.         };
  242.  
  243.         // Falling Damper
  244.         if (shipGrounded)
  245.         {
  246.             fallingDamper = Mathf.Lerp(fallingDamper, 0.0f, Time.deltaTime);
  247.         } else
  248.         {
  249.             fallingDamper = Mathf.Lerp (fallingDamper, 0.1f, Time.deltaTime);
  250.         }
  251.  
  252.         // Run through each point and make ship hover
  253.         shipGrounded = false;
  254.         for (int i = 0; i < HoverPoints.Count; i++)
  255.         {
  256.             int Mask = 1 << LayerMask.NameToLayer("TrackFloor");
  257.             RaycastHit hit;
  258.             if (Physics.Raycast(HoverPoints[i], -transform.up, out hit, settings.shipRideHeight, Mask))
  259.             {
  260.                 shipGrounded = true;
  261.  
  262.                 float hoverForce = settings.shipRideHeight - hit.distance;
  263.                 Vector3 spring = HoverPoints[i] - hit.point;
  264.                 float length = spring.magnitude;
  265.                 float displacement = length - settings.shipRideHeight;
  266.  
  267.                 Vector3 springN = spring / length;
  268.                 float compression = ((settings.shipRideHeight / hit.distance) - 1) * -1;
  269.                 Vector3 restoreForce = springN * (displacement * (hoverForce * (-10 + (compression * 3))));
  270.                 float force = restoreForce.y;
  271.                 force -= shipBody.GetPointVelocity(HoverPoints[i]).y * ((0.3f) + fallingDamper + (enginePitchAmount * 0.05f));
  272.                 shipBody.AddForceAtPosition(transform.up * force, HoverPoints[i], ForceMode.Acceleration);
  273.                 groundDistance = hit.distance;
  274.             }
  275.         }
  276.  
  277.         RaycastHit centreHit;
  278.         // Raycast down
  279.         if (!shipController.isAI)
  280.         {
  281.             if (Physics.Raycast(transform.position, -transform.up, out centreHit, settings.shipRideHeight, 1 << LayerMask.NameToLayer("TrackFloor")))
  282.             {
  283.                 // Use a dot product to find out how much we need to rotate the ship to get it to face down
  284.                 Vector3 trackRot = transform.right - (Vector3.Dot(transform.forward, centreHit.normal) * centreHit.normal);
  285.                 // Use the track rotation to calculate how much we are going to rotate the ship
  286.                 float rotAmount = (trackRot.x * trackRot.z) * (Mathf.Clamp(Mathf.Abs(trackRot.y), 0.0f, 0.1f) * 10);
  287.                 // Increase the rotation amount as the ship speeds up
  288.                 float rotForce = 20 + (transform.InverseTransformDirection(shipBody.velocity).z * Time.deltaTime) * 3;
  289.                 // Apply the rotation
  290.                 transform.Rotate(Vector3.up * (rotAmount * Time.deltaTime) * rotForce);
  291.                
  292.                 // Apply gravity force
  293.                 shipBody.AddForce(new Vector3(centreHit.normal.x, 0, centreHit.normal.z) * (Mathf.Abs(trackRot.x)) * 22);
  294.             }
  295.         }
  296.  
  297.         // Weapon and Speed
  298.         int padMask = 1 << LayerMask.NameToLayer("TrackSpeed") | 1 << LayerMask.NameToLayer("TrackWeapon");
  299.         if (Physics.Raycast(transform.position, -transform.up, out centreHit, settings.shipRideHeight + 2, padMask))
  300.         {
  301.             if (centreHit.collider.gameObject.layer == LayerMask.NameToLayer("TrackSpeed"))
  302.             {
  303.                 speedDirection = centreHit.collider.gameObject.transform.forward * 800;
  304.                 shipBoostTimer = 0.27f;
  305.                 isBoosting = true;
  306.  
  307.                 if (!hitPad)
  308.                 {
  309.                     hitPad = true;
  310.                     AudioLibrary.Create3DOneShot("Boost", 1.0f, 1.0f, transform, Vector3.zero, 400.0f, 500.0f, "Audio/Ships/Boost", shipController.manager.mixer, GlobalSettings.EAudioGroups.SFX);
  311.                 }
  312.             }
  313.         } else
  314.         {
  315.             hitPad = false;
  316.         }
  317.  
  318.         // Apply boost force
  319.         if (shipBoostTimer > 0)
  320.         {
  321.             shipBoostTimer -= Time.deltaTime;
  322.             shipBody.AddForce(speedDirection, ForceMode.Acceleration);
  323.         } else
  324.         {
  325.             isBoosting = false;
  326.             hitPad = false;
  327.         }
  328.  
  329.         // Boost Override
  330.         if (boostingOverride)
  331.         {
  332.             isBoosting = true;
  333.         }
  334.         boostingOverride = false;
  335.  
  336.         // Pitching
  337.         if (shipController.axisPitch != 0)
  338.         {
  339.             enginePitchAmount = Mathf.Lerp(enginePitchAmount, shipController.axisPitch * 5, Time.deltaTime * 4);
  340.         } else
  341.         {
  342.             enginePitchAmount = Mathf.Lerp(enginePitchAmount, 0, Time.deltaTime * 4);
  343.         }
  344.  
  345.         if (shipGrounded)
  346.         {
  347.             if (enginePitchAmount >= 0)
  348.             {
  349.                 shipBody.AddTorque(transform.right * (enginePitchAmount * 80));
  350.             } else
  351.             {
  352.                 shipBody.AddTorque(transform.right * (enginePitchAmount * 70));
  353.             }
  354.         } else
  355.         {
  356.             if (enginePitchAmount >= 0)
  357.             {
  358.                 shipBody.AddTorque(transform.right * (enginePitchAmount * 45));
  359.                 transform.Rotate(Vector3.right * 0.03f);
  360.             }
  361.         }
  362.     }
  363.  
  364.     private void ShipAcceleration()
  365.     {
  366.         float topThrust = 0;
  367.         float topAccel = 0;
  368.         switch(eventClass)
  369.         {
  370.         case GlobalSettings.ESpeedClasses.Venom:
  371.             topThrust = settings.engineAmountVenom;
  372.             topAccel = settings.engineAccelerationVenom;
  373.             break;
  374.         case GlobalSettings.ESpeedClasses.Flash:
  375.             topThrust = settings.engineAmountFlash;
  376.             topAccel = settings.engineAccelerationFlash;
  377.             break;
  378.         case GlobalSettings.ESpeedClasses.Rapier:
  379.             topThrust = settings.engineAmountRapier;
  380.             topAccel = settings.engineAccelerationRapier;
  381.             break;
  382.         case GlobalSettings.ESpeedClasses.Phantom:
  383.             topThrust = settings.engineAmountPhantom;
  384.             topAccel = settings.engineAccelerationPhantom;
  385.             break;
  386.         }
  387.  
  388.         if (shipController.isThrusting)
  389.         {
  390.             engineGain = Mathf.Lerp(engineGain, (settings.engineGain * 0.1f) * Time.deltaTime, Time.deltaTime * 10);
  391.             engineFalloff = 0;
  392.             engineAcceleration = Mathf.Lerp(engineAcceleration, topAccel, Time.deltaTime * engineGain);
  393.             engineThrust = Mathf.Lerp (engineThrust, topThrust + (enginePitchAmount * 25.0f), Time.deltaTime * (engineAcceleration * 0.1f));
  394.         } else
  395.         {
  396.             engineFalloff = Mathf.Lerp(engineFalloff, settings.engineFalloff * Time.deltaTime, Time.deltaTime);
  397.             engineGain = 0;
  398.             engineAcceleration = Mathf.Lerp(engineAcceleration, 0.0f, Time.deltaTime * engineFalloff);
  399.             engineThrust = Mathf.Lerp (engineThrust, 0.0f, Time.deltaTime * engineFalloff);
  400.         }
  401.         shipBody.AddRelativeForce(Vector3.forward * engineThrust);
  402.  
  403.         // Set the actual speed
  404.         engineSpeed = Mathf.Abs(transform.InverseTransformDirection(shipBody.velocity).z);
  405.     }
  406.  
  407.     private void ShipDrag()
  408.     {
  409.         // Airbrake Resistance
  410.         if (shipController.axisLA != 0 || shipController.axisRA != 0)
  411.         {
  412.             float abi = Mathf.Abs(shipController.axisLA + shipController.axisRA);
  413.             abi = Mathf.Clamp(abi, 0.0f, 1.0f);
  414.             airbrakeResistance = Mathf.Lerp(airbrakeResistance, Mathf.Abs(airbrakeAmount) * abi, Time.deltaTime *
  415.                                             (Mathf.Abs(transform.InverseTransformDirection(shipBody.velocity).x) * Time.deltaTime) * 0.15f); //0.07
  416.         } else
  417.         {
  418.             airbrakeResistance = Mathf.Lerp(airbrakeResistance, 0.0f, Time.deltaTime * 4.5f);
  419.         }
  420.  
  421.         // Air resistance
  422.         if (shipGrounded)
  423.         {
  424.             airResistance = Mathf.Lerp(airResistance, 0.0f, Time.deltaTime * 4.5f);
  425.             angularResistance = Mathf.Lerp (angularResistance, 0.0f, Time.deltaTime * 4.5f);
  426.         } else
  427.         {
  428.             airResistance = Mathf.Lerp(airResistance, 0.4f, Time.deltaTime * (0.02f + (enginePitchAmount * 0.003f)));
  429.  
  430.             float ang = transform.InverseTransformDirection(shipBody.angularVelocity).x;
  431.             ang = Mathf.Clamp(ang, 0.0f, 1.0f);
  432.             angularResistance = Mathf.Lerp (angularResistance, 0.0f, Time.deltaTime * 0.05f);
  433.         }
  434.  
  435.         // Brakes
  436.         if (shipController.axisRA != 0 && shipController.axisLA != 0)
  437.         {
  438.             shipBraking = true;
  439.             brakesFalloff = 0;
  440.             brakesGain = Mathf.Lerp(brakesGain, Time.deltaTime * 40, Time.deltaTime);
  441.             brakesAmount = Mathf.Lerp(brakesAmount, Time.deltaTime * 100, Time.deltaTime * brakesGain);
  442.         } else
  443.         {
  444.             shipBraking = false;
  445.             brakesGain = 0;
  446.             brakesFalloff = Mathf.Lerp(brakesFalloff, 100.0f, Time.deltaTime);
  447.             brakesAmount = Mathf.Lerp(brakesAmount, 0.0f, Time.deltaTime * brakesFalloff);
  448.         }
  449.  
  450.         // Forward Resistance
  451.         Vector3 LocalVelocity = transform.InverseTransformDirection(shipBody.velocity);
  452.         float forwardVelocity = Mathf.Abs(transform.InverseTransformDirection(shipBody.velocity).z);
  453.         LocalVelocity.z *= 1 - (0.0015f + ((forwardVelocity * Time.deltaTime) * 0.007f));
  454.         LocalVelocity.z *= 1 - (airbrakeResistance + airResistance + angularResistance + brakesAmount);
  455.         LocalVelocity.y *= 1 - (0.001f);
  456.         Vector3 WorldVelocity = transform.TransformDirection(LocalVelocity);
  457.         shipBody.velocity = WorldVelocity;
  458.  
  459.         // Slide resistance
  460.  
  461.         float gripAmount = settings.shipGrip_A;
  462.         switch(eventClass)
  463.         {
  464.         case GlobalSettings.ESpeedClasses.Venom:
  465.             if (shipGrounded)
  466.             {
  467.                 gripAmount = settings.shipGrip_D;
  468.             } else
  469.             {
  470.                 gripAmount = settings.shipGrip_D * 0.8f;
  471.             }
  472.             break;
  473.         case GlobalSettings.ESpeedClasses.Flash:
  474.             if (shipGrounded)
  475.             {
  476.                 gripAmount = settings.shipGrip_C;
  477.             } else
  478.             {
  479.                 gripAmount = settings.shipGrip_C * 0.8f;
  480.             }
  481.             break;
  482.         case GlobalSettings.ESpeedClasses.Rapier:
  483.             if (shipGrounded)
  484.             {
  485.                 gripAmount = settings.shipGrip_B;
  486.             } else
  487.             {
  488.                 gripAmount = settings.shipGrip_B * 0.8f;
  489.             }
  490.             break;
  491.         case GlobalSettings.ESpeedClasses.Phantom:
  492.             if (shipGrounded)
  493.             {
  494.                 gripAmount = settings.shipGrip_A;
  495.             } else
  496.             {
  497.                 gripAmount = settings.shipGrip_A * 0.8f;
  498.             }
  499.             break;
  500.         }
  501.         if (shipGrounded)
  502.         {
  503.             gripAmount -= enginePitchAmount * 0.4f;
  504.         }
  505.         if (shipController.axisLA != 0 || shipController.axisRA != 0)
  506.         {
  507.             airbrakeSlip = Mathf.Lerp (airbrakeSlip, Mathf.Abs(airbrakeAmount * settings.shipSlipAmount), Time.deltaTime * settings.shipSlipGain);
  508.         } else
  509.         {
  510.             airbrakeSlip = Mathf.Lerp (airbrakeSlip, 0.0f, Time.deltaTime * settings.shipSlipFalloff);
  511.         }
  512.         gripAmount -= Mathf.Abs(airbrakeAmount * airbrakeSlip);
  513.         if (gripAmount < 0)
  514.             gripAmount = 0;
  515.  
  516.  
  517.         float gripForce = -transform.InverseTransformDirection(shipBody.velocity).x;
  518.         gripForce -= airbrakeAmount * settings.shipSlipAmount;
  519.         shipBody.AddForce(transform.right * gripForce);
  520.  
  521.         Vector3 GripVelocity = shipBody.velocity;
  522.         GripVelocity.y = 0;
  523.  
  524.         float slipAmount = Vector3.Dot(transform.right, GripVelocity);
  525.         Vector3 antiSlip = transform.right * (-slipAmount * gripAmount);
  526.         shipBody.AddForce(antiSlip, ForceMode.Acceleration);
  527.  
  528.  
  529.     }
  530.  
  531.     private void ShipHandling()
  532.     {
  533.         // Get the airbrake input
  534.         float airbrakeInput = shipController.axisLA + shipController.axisRA;
  535.  
  536.         // Stop reverse input from being given while gain is still above zero
  537.         if ((shipController.axisSteer > 0 && turnAmount < 0) || (shipController.axisSteer < 0 && turnAmount > 0))
  538.         {
  539.             if (!turnAntiBand)
  540.             {
  541.                 bankGain = 0;
  542.                 turnGain = 0;
  543.                 turnAntiBand = true;
  544.             }
  545.         } else
  546.         {
  547.             turnAntiBand = false;
  548.         }
  549.  
  550.         if ((airbrakeInput > 0 && airbrakeAmount < 0) || (airbrakeInput < 0 && airbrakeAmount > 0))
  551.         {
  552.             if (!airbrakeAntiBand)
  553.             {
  554.                 airbrakeGain = 0;
  555.                 airbrakeAntiBand = true;
  556.             }
  557.         } else
  558.         {
  559.             airbrakeAntiBand = false;
  560.         }
  561.  
  562.         // Ship turning
  563.         if (shipController.axisSteer != 0)
  564.         {
  565.             // Calculate Turn Amount
  566.             float cta = settings.turnAmount * Time.deltaTime * Mathf.PI * 7.7f * 2;
  567.             if (Mathf.Abs(turnAmount) > (Mathf.Abs(cta) / 2))
  568.             {
  569.                 turnGain = Mathf.Lerp(turnGain, settings.turnGain * 0.01f, Time.deltaTime * 2);
  570.             } else
  571.             {
  572.                 turnGain = Mathf.Lerp(turnGain, settings.turnGain * 0.01f, Time.deltaTime * 1.2f);
  573.             }
  574.             turnFalloff = 0;
  575.             turnAmount = Mathf.Lerp(turnAmount, shipController.axisSteer * cta, Time.deltaTime * turnGain);
  576.  
  577.             bankGain = Mathf.Lerp(bankGain, 8.0f, Time.deltaTime * 1.5f);
  578.             bankFalloff = 0;
  579.             bankVelocity = Mathf.Lerp(bankVelocity, shipController.axisSteer * 45.0f, Time.deltaTime * bankGain);
  580.         } else
  581.         {
  582.             turnFalloff = Mathf.Lerp(turnFalloff, settings.turnFalloff * 0.01f, Time.deltaTime * 4);
  583.             turnGain = 0;
  584.             turnAmount = Mathf.Lerp(turnAmount, 0.0f, Time.deltaTime * turnFalloff);
  585.  
  586.             bankFalloff = Mathf.Lerp(bankFalloff, 10.0f, Time.deltaTime * 1.4f);
  587.             bankGain = 0;
  588.             bankVelocity = Mathf.Lerp(bankVelocity, 0.0f, Time.deltaTime * bankFalloff);
  589.         }
  590.         bankAmount = Mathf.Lerp(bankAmount, bankVelocity, Time.deltaTime * 10);
  591.  
  592.         // Calculated turn air brake
  593.         float ctab = settings.airbrakeAmount * Time.deltaTime * Mathf.PI * 1.8f;
  594.  
  595.         // Airbrake Amount
  596.         float aba = ((transform.InverseTransformDirection(shipBody.velocity).z) * Time.deltaTime) * ctab;
  597.  
  598.         if (airbrakeInput != 0)
  599.         {
  600.             airbrakeGain = Mathf.Lerp(airbrakeGain, settings.airbrakeGain * 0.01f, Time.deltaTime * 8);
  601.             airbrakeFalloff = 0;
  602.             airbrakeAmount = Mathf.Lerp(airbrakeAmount, airbrakeInput * aba, Time.deltaTime * (airbrakeGain + Mathf.Abs(turnAmount * settings.airbrakeTurnMultiplier)));
  603.  
  604.             bankAirbrake = Mathf.Lerp(bankAirbrake, -airbrakeInput * 10.0f, Time.deltaTime * 2);
  605.         } else
  606.         {
  607.             airbrakeFalloff = Mathf.Lerp(airbrakeFalloff, settings.airbrakeFalloff * 0.01f, Time.deltaTime * 8);
  608.             airbrakeGain = 0;
  609.             airbrakeAmount = Mathf.Lerp(airbrakeAmount, 0.0f, Time.deltaTime * airbrakeFalloff);
  610.  
  611.             bankAirbrake = Mathf.Lerp(bankAirbrake, 0.0f, Time.deltaTime * 2);
  612.         }
  613.  
  614.  
  615.         // Apply rotation
  616.         transform.Rotate(Vector3.up * (turnAmount + airbrakeAmount));
  617.  
  618.         // Apply banking
  619.         shipAxis.transform.localRotation = Quaternion.Euler(0,0, -bankAmount + bankAirbrake + shipBRActual);
  620.  
  621.         // Airbrake rotation
  622.         if (shipController.axisLA != 0)
  623.         {
  624.             airbrakeLeftRaise = Mathf.Lerp(airbrakeLeftRaise, -shipController.axisLA * settings.shipAirbrakeAngle, Time.deltaTime * 5);
  625.         } else
  626.         {
  627.             airbrakeLeftRaise = Mathf.Lerp(airbrakeLeftRaise, 0.0f, Time.deltaTime * 4);
  628.         }
  629.  
  630.         if (shipController.axisRA != 0)
  631.         {
  632.             airbrakeRightRaise = Mathf.Lerp(airbrakeRightRaise, shipController.axisRA * settings.shipAirbrakeAngle, Time.deltaTime * 5);
  633.         } else
  634.         {
  635.             airbrakeRightRaise = Mathf.Lerp(airbrakeRightRaise, 0.0f, Time.deltaTime * 4);
  636.         }
  637.  
  638.         // Apply rotation
  639.         if (settings.shipRefAirbrakeRotationMode == 0)
  640.         {
  641.             Vector3 Rot = settings.shipRefLeftAirbrake.transform.localEulerAngles;
  642.             settings.shipRefLeftAirbrake.transform.localRotation = Quaternion.Euler (airbrakeLeftRaise,Rot.y , Rot.z);
  643.             Rot = settings.shipRefRightAirbrake.transform.localEulerAngles;
  644.             settings.shipRefRightAirbrake.transform.localRotation = Quaternion.Euler (airbrakeRightRaise,Rot.y , Rot.z);
  645.         } else
  646.         {
  647.             Vector3 Rot = settings.shipRefLeftAirbrake.transform.localEulerAngles;
  648.             settings.shipRefLeftAirbrake.transform.localRotation = Quaternion.Euler (Rot.x ,Rot.y , -airbrakeLeftRaise);
  649.             Rot = settings.shipRefRightAirbrake.transform.localEulerAngles;
  650.             settings.shipRefRightAirbrake.transform.localRotation = Quaternion.Euler (Rot.x,Rot.y , airbrakeRightRaise);
  651.         }
  652.  
  653.        
  654.     }
  655.     public void UpdateCameraMode()
  656.     {
  657.         cameraMode ++;
  658.         if (cameraMode > 2)
  659.             cameraMode = 0;
  660.     }
  661.  
  662.     private void UpdateShipCamera()
  663.     {
  664.         if (cameraMode == 0)
  665.         {
  666.             shipAxis.SetActive(true);
  667.             // Update X Offset
  668.             cameraInputAmount = Mathf.Lerp (cameraInputAmount, -transform.InverseTransformDirection(shipBody.velocity).x, Time.deltaTime * settings.cameraSpeed);
  669.             if (settings.cameraTurnDamp == 0)
  670.             {
  671.                 cameraTurnAmount = turnAmount;
  672.             }
  673.             else
  674.             {
  675.                 cameraTurnAmount = Mathf.Lerp(cameraTurnAmount, turnAmount, Time.deltaTime * (settings.cameraTurnDamp));
  676.             }
  677.             cameraOffset.x = Mathf.Lerp(cameraOffset.x, cameraInputAmount * 0.012f + ((cameraTurnAmount * settings.cameraTurnSensitivity) + airbrakeAmount), Time.deltaTime * (settings.cameraSpeed * 0.8f));
  678.  
  679.             // Update Y Offset
  680.             cameraFallHelper = Mathf.Lerp (cameraFallHelper,((settings.cameraClosePos.y - cameraTurningHeight )- shipCamera.transform.localPosition.y), Time.deltaTime * (settings.cameraSpeed * 0.1f));
  681.             cameraFallHelper = Mathf.Clamp(cameraFallHelper, 0f, 0.03f);
  682.             cameraFallLag = Mathf.Lerp
  683.                 (
  684.                     cameraFallLag,
  685.                     transform.InverseTransformDirection(shipBody.velocity).y * (0.05f - cameraFallHelper),
  686.                     Time.deltaTime * settings.cameraSpeed
  687.                 );
  688.             cameraTurningHeight = Mathf.Lerp(cameraTurningHeight, (Mathf.Abs(cameraOffset.x) * 0.3f), Time.deltaTime * (settings.cameraSpeed * 0.5f));
  689.             cameraOffset.y = settings.cameraClosePos.y - cameraFallLag + (cameraBoostLength * 0.7f);
  690.  
  691.             // Update Z Offset
  692.             if (shipGrounded)
  693.             {
  694.                 cameraFallingOffset = Mathf.Lerp(cameraFallingOffset, 0.0f, Time.deltaTime * 2.0f);
  695.             } else
  696.             {
  697.                 cameraFallingOffset = Mathf.Lerp(cameraFallingOffset, -2, Time.deltaTime * 0.05f);
  698.             }
  699.             cameraAccelLag = Mathf.Lerp(cameraAccelLag, -(transform.InverseTransformDirection(shipBody.velocity).z * Time.deltaTime) * 0.25f, Time.deltaTime * settings.cameraSpeed);
  700.             cameraTurningOffset = Mathf.Lerp(cameraTurningOffset, (Mathf.Abs(cameraOffset.x) * 0.2f), Time.deltaTime * (settings.cameraSpeed * 0.2f));
  701.             cameraOffset.z = settings.cameraClosePos.z + cameraAccelLag + cameraTurningOffset - cameraBoostLength;
  702.  
  703.             // Update movement length
  704.             if (shipController.isThrusting)
  705.             {
  706.                 cameraMovementLength = Mathf.Lerp(cameraMovementLength, 6.5f, Time.deltaTime * 3);
  707.             } else
  708.             {
  709.                 if ((shipController.axisLA != 0 || shipController.axisRA != 0) && transform.InverseTransformDirection(shipBody.velocity).z > 10)
  710.                 {
  711.                     cameraMovementLength = Mathf.Lerp(cameraMovementLength, -7.5f, Time.deltaTime * 3);
  712.                 } else
  713.                 {
  714.                     cameraMovementLength = Mathf.Lerp(cameraMovementLength, 0.0f, Time.deltaTime * 3);
  715.                 }
  716.             }
  717.  
  718.             // Update Position
  719.             shipCamera.transform.parent = transform;
  720.             shipCamera.transform.localPosition = cameraOffset + (-shipHoverCameraAnimOffset * 0.4f);
  721.  
  722.             // Update Rotation
  723.             float pitchModUpdateRate = Mathf.Abs(transform.InverseTransformDirection(shipBody.angularVelocity).x) * 0.5f;
  724.             pitchModUpdateRate = Mathf.Clamp(pitchModUpdateRate, 0.1f, Mathf.Infinity);
  725.             float pitchModAmount = transform.InverseTransformDirection(shipBody.velocity).z * 0.04f;
  726.             pitchModAmount = Mathf.Clamp(pitchModAmount, 0.0f, 16.0f);
  727.             cameraPitchMod = Mathf.Lerp(cameraPitchMod, transform.InverseTransformDirection(shipBody.angularVelocity).x * pitchModAmount, Time.deltaTime * settings.cameraSpeed);
  728.  
  729.             Vector3 lookAtLocal = transform.TransformPoint(0, -4, 25 + cameraPitchMod + cameraMovementLength);
  730.             shipCamera.transform.rotation = Quaternion.LookRotation(lookAtLocal - shipCamera.transform.position, transform.up);
  731.         } else if (cameraMode == 2)
  732.         {
  733.             shipAxis.SetActive(false);
  734.             shipCamera.transform.parent = transform;
  735.             shipCamera.transform.localPosition = Vector3.zero;
  736.             shipCamera.transform.localRotation = Quaternion.Euler(0,0, -bankAmount * 1.3f);
  737.         } else if (cameraMode == 1)
  738.         {
  739.             shipAxis.SetActive(true);
  740.             shipCamera.transform.parent = transform;
  741.  
  742.             int nextGate = Mathf.RoundToInt(Mathf.Repeat(shipController.manGate + 1, shipController.nodes.logicNodes.Count));
  743.             Vector3 currentGate = transform.InverseTransformPoint(shipController.nodes.logicNodes[nextGate].transform.position);
  744.             currentGate = shipController.nodes.logicNodes[nextGate].transform.InverseTransformPoint(shipCamera.transform.position);
  745.             cameraOffset = Vector3.Lerp(cameraOffset, currentGate, Time.deltaTime * (settings.cameraSpeed * 0.4f));
  746.  
  747.             float vel = Mathf.Abs(transform.InverseTransformDirection(shipBody.velocity).x);
  748.             cameraFallHelper = Mathf.Lerp(cameraFallHelper, airbrakeAmount * 5, Time.deltaTime * (settings.cameraSpeed * 0.3f));
  749.             cameraTurningOffset = Mathf.Lerp(cameraTurningOffset, (Mathf.Abs(cameraFallHelper) * 1) + (Mathf.Abs(cameraOffset.x) * 0.02f), Time.deltaTime * (settings.cameraSpeed * 0.2f));
  750.             cameraTurningHeight = Mathf.Lerp(cameraTurningHeight, (Mathf.Abs(cameraFallHelper) * 1) + (Mathf.Abs(cameraOffset.x) * 0.07f), Time.deltaTime * (settings.cameraSpeed * 0.3f));
  751.             cameraInputAmount = Mathf.Lerp(cameraInputAmount, -cameraOffset.x * 0.1f, Time.deltaTime * (settings.cameraSpeed * 0.2f));
  752.  
  753.             shipCamera.transform.localPosition = new Vector3(cameraInputAmount + cameraFallHelper, (settings.cameraClosePos.y * 0.8f) + cameraTurningHeight, (settings.cameraClosePos.z * 1.1f) + cameraTurningOffset);
  754.  
  755.             Vector3 lookAtLocal = transform.TransformPoint(0, -4, 25);
  756.             shipCamera.transform.rotation = Quaternion.LookRotation(lookAtLocal - shipCamera.transform.position, transform.up);
  757.  
  758.         }
  759.  
  760.         // Update camera Fov
  761.         float fovVel = ((Mathf.Abs(transform.InverseTransformDirection(shipBody.velocity).z) * Time.deltaTime) * 10);
  762.         cameraFoV = Mathf.Lerp(cameraFoV, settings.cameraFoV + fovVel, Time.deltaTime * settings.cameraSpeed);
  763.         if (cameraFoV < 60)
  764.             cameraFoV = 60;
  765.        
  766.         if (isBoosting)
  767.         {
  768.             cameraBoostFoV = Mathf.Lerp(cameraBoostFoV, 10, Time.deltaTime * 16);
  769.             cameraBoostLength = Mathf.Lerp(cameraBoostLength, 0.1f, Time.deltaTime * 16);
  770.         } else
  771.         {
  772.             cameraBoostFoV = Mathf.Lerp(cameraBoostFoV, 0.0f, Time.deltaTime * 3);
  773.             cameraBoostLength = Mathf.Lerp(cameraBoostLength, 0.0f, Time.deltaTime * 4);
  774.         }
  775.         shipCamera.GetComponent<Camera>().fieldOfView = cameraFoV + cameraBoostFoV;
  776.  
  777.     }
  778.  
  779.     private void ShipAnimations()
  780.     {
  781.         if (Mathf.Abs(transform.InverseTransformDirection(shipBody.velocity).z) < 100 && shipGrounded)
  782.         {
  783.             // Anim Settings
  784.             shipHoverAnimSpeed = 0.5f;
  785.             shipHoverAnimAmount = 0.2f;
  786.            
  787.             shipHoverAnimTimer += Time.deltaTime * shipHoverAnimSpeed;
  788.             shipHoverAnimOffset.x = (Mathf.Sin(shipHoverAnimTimer * 1.5f) * (shipHoverAnimAmount * Mathf.Sin(shipHoverAnimTimer)));
  789.             shipHoverAnimOffset.y = (Mathf.Cos(shipHoverAnimTimer * 4) * (shipHoverAnimAmount / 5));
  790.  
  791.             shipHoverCameraAnimOffset.x = (Mathf.Sin(shipHoverAnimTimer * 6) * (shipHoverAnimAmount / 2));
  792.             shipHoverCameraAnimOffset.y = (Mathf.Cos(shipHoverAnimTimer * 3) * (shipHoverAnimAmount / 2));
  793.            
  794.         } else
  795.         {
  796.             shipHoverAnimTimer = 0;
  797.             shipHoverAnimOffset = Vector3.Lerp(shipHoverAnimOffset, Vector3.zero, Time.deltaTime);
  798.             shipHoverCameraAnimOffset = Vector3.Lerp(shipHoverAnimOffset, Vector3.zero, Time.deltaTime);
  799.         }
  800.        
  801.         // Apply Hover Anim Offset
  802.         shipAxis.transform.localPosition = shipHoverAnimOffset;
  803.     }
  804.  
  805.     private void ShipBarrelRolls()
  806.     {
  807.         if (shipBRBoostTimer > 0)
  808.         {
  809.             shipBRBoostTimer -= Time.deltaTime;
  810.         }
  811.  
  812.         /* Ground vs Airborne setup */
  813.         if (shipGrounded)
  814.         {
  815.             shipBRProgress = Mathf.LerpAngle(shipBRProgress, 0.0f, Time.deltaTime * 10.0f);
  816.             shipBRGain = 0;
  817.             shipBRActual = shipBRProgress;
  818.             if (shipBRSuccess && shipController.performedBarrelRolls < EventSettings.setupMaxBarrelRolls + 1)
  819.             {
  820.                 AudioLibrary.Create3DOneShot("BR", 1.0f, 1.0f, transform, Vector3.zero, 500.0f, 400.0f, "Audio/Ships/Turbo", shipController.manager.mixer, GlobalSettings.EAudioGroups.SFX);
  821.                 shipBRBoostTimer = 0.24f;
  822.                 shipBRSuccess = false;
  823.             }
  824.             shipBRLastValue = 0;
  825.             shipBRState =0;
  826.             shipCanBR = false;
  827.             shipHasBR = false;
  828.         } else
  829.         {
  830.             shipCanBR = true;
  831.         }
  832.  
  833.         if (shipCanBR)
  834.         {
  835.             shipBRTimer -= Time.deltaTime;
  836.             if (shipBRTimer < 0)
  837.             {
  838.                 shipBRLastValue = 0;
  839.                 shipBRState = 0;
  840.                 shipBRTimer = 0;
  841.                 if (!shipHasBR)
  842.                 {
  843.                     shipBRSuccess = false;
  844.                 }
  845.             }
  846.  
  847.             if (!shipHasBR)
  848.             {
  849.                 shipBRProgress = 0;
  850.                 shipBRGain = 0;
  851.  
  852.                 /*LRL */
  853.                 if (shipController.axisSteer < 0 && shipBRState == 0)
  854.                 {
  855.                     shipBRLastValue = -1;
  856.                     shipBRTimer = 0.2f;
  857.                     shipBRState++;
  858.                 }
  859.  
  860.                 if (shipController.axisSteer > 0 && shipBRLastValue == -1 && shipBRState == 1 && shipBRTimer > 0)
  861.                 {
  862.                     shipBRLastValue = 1;
  863.                     shipBRTimer = 0.2f;
  864.                     shipBRState++;
  865.                 }
  866.  
  867.                 if (shipController.axisSteer < 0 && shipBRLastValue == 1 && shipBRState == 2 && shipBRTimer > 0)
  868.                 {
  869.                     shipHasBR = true;
  870.                     if (shipController.performedBarrelRolls < EventSettings.setupMaxBarrelRolls)
  871.                     {
  872.                         AudioLibrary.Create3DOneShot("BR", 1.0f, 1.0f, transform, Vector3.zero, 500.0f, 400.0f, "Audio/Ships/Roll", shipController.manager.mixer, GlobalSettings.EAudioGroups.SFX);
  873.                         shipIntegrity -= 15;
  874.                     } else
  875.                     {
  876.                         AudioLibrary.Create3DOneShot("BR", 0.4f, 1.0f, transform, Vector3.zero, 500.0f, 400.0f, "Audio/Ships/Roll", shipController.manager.mixer, GlobalSettings.EAudioGroups.SFX);
  877.                     }
  878.  
  879.                     shipController.performedBarrelRolls ++;
  880.                 }
  881.  
  882.                 /*RLR */
  883.                 if (shipController.axisSteer > 0 && shipBRState == 0)
  884.                 {
  885.                     shipBRLastValue = 1;
  886.                     shipBRTimer = 0.2f;
  887.                     shipBRState++;
  888.                 }
  889.                
  890.                 if (shipController.axisSteer < 0 && shipBRLastValue == 1 && shipBRState == 1 && shipBRTimer > 0)
  891.                 {
  892.                     shipBRLastValue = -1;
  893.                     shipBRTimer = 0.2f;
  894.                     shipBRState++;
  895.                 }
  896.                
  897.                 if (shipController.axisSteer > 0 && shipBRLastValue == -1 && shipBRState == 2 && shipBRTimer > 0)
  898.                 {
  899.                     shipHasBR = true;
  900.                     if (shipController.performedBarrelRolls < EventSettings.setupMaxBarrelRolls)
  901.                     {
  902.                         AudioLibrary.Create3DOneShot("BR", 1.0f, 1.0f, transform, Vector3.zero, 500.0f, 400.0f, "Audio/Ships/Roll", shipController.manager.mixer, GlobalSettings.EAudioGroups.SFX);
  903.                         shipIntegrity -= 15;
  904.                     } else
  905.                     {
  906.                         AudioLibrary.Create3DOneShot("BR", 0.4f, 1.0f, transform, Vector3.zero, 500.0f, 400.0f, "Audio/Ships/Roll", shipController.manager.mixer, GlobalSettings.EAudioGroups.SFX);
  907.                     }
  908.  
  909.                     shipController.performedBarrelRolls ++;
  910.                 }
  911.             } else
  912.             {
  913.                 shipBRState = 0;
  914.                 shipBRLastValue = 0;
  915.                 if (shipBRProgress < 260)
  916.                 {
  917.                     shipBRGain = Mathf.Lerp(shipBRGain, 1000, Time.deltaTime * 10);
  918.                 } else
  919.                 {
  920.                     shipBRGain = Mathf.Lerp(shipBRGain, 200, Time.deltaTime * 10);
  921.                 }
  922.                 shipBRProgress = Mathf.MoveTowards(shipBRProgress, 360, Time.deltaTime * shipBRGain);
  923.                 if (shipBRProgress > 250)
  924.                 {
  925.                     shipBRSuccess = true;
  926.                     shipCanBR = false;
  927.                 }
  928.  
  929.                 if (shipBRProgress > 360)
  930.                     shipBRProgress = 360;
  931.  
  932.                 if (shipBRLastValue == 1)
  933.                 {
  934.                     shipBRActual = shipBRProgress;
  935.                 } else
  936.                 {
  937.                     shipBRActual = -shipBRProgress;
  938.                 }
  939.             }
  940.         } else
  941.         {
  942.             shipBRLastValue = 0;
  943.             shipBRTimer = 0;
  944.             shipBRSuccess = false;
  945.             shipHasBR = false;
  946.             shipBRState = 0;
  947.         }
  948.     }
  949.  
  950.     private void OnCollisionEnter(Collision other)
  951.     {
  952.         if (other.gameObject.layer == LayerMask.NameToLayer("TrackWall"))
  953.         {
  954.             float hitDot = Vector3.Dot(other.contacts[0].normal, transform.forward);
  955.             Vector3 collisionVelocity = transform.InverseTransformDirection(shipBody.GetPointVelocity(other.contacts[0].point));
  956.             if (Mathf.Abs(collisionVelocity.x) >= 65 && hitDot > 0)
  957.             {
  958.                 AudioLibrary.Create3DOneShot("WallCollision", 1.0f, Random.Range(0.8f, 1.1f), transform, Vector3.zero, 400.0f, 500.0f, "Audio/Ships/CollisionWall", shipController.manager.mixer, GlobalSettings.EAudioGroups.SFX);
  959.             } else if (Mathf.Abs(collisionVelocity.x) >= 65)
  960.             {
  961.                 AudioLibrary.Create3DOneShot("WallCollision", 1.0f, Random.Range(0.8f, 1.1f), transform, Vector3.zero, 400.0f, 500.0f, "Audio/Ships/CollisionWall", shipController.manager.mixer, GlobalSettings.EAudioGroups.SFX);
  962.             }
  963.         }
  964.  
  965.     }
  966.  
  967.     private void OnCollisionStay(Collision other)
  968.     {
  969.         if (other.gameObject.layer == LayerMask.NameToLayer("TrackWall"))
  970.         {
  971.             // Stop physics rotation
  972.             shipBody.angularVelocity = Vector3.zero;
  973.  
  974.             isColliding = true;
  975.             float hitDot = Vector3.Dot(other.contacts[0].normal, transform.forward);
  976.             if (hitDot < 0.1f)
  977.             {
  978.                 if (engineThrust > 100)
  979.                 {
  980.                     engineThrust *= (0.95f);
  981.                 }
  982.                 if (engineAcceleration > 5)
  983.                 {
  984.                     engineAcceleration *= 0.98f;
  985.                 }
  986.                 wallSurfing = false;
  987.  
  988.                 if (hitDot < -0.8f)
  989.                 {
  990.                     engineThrust = 0;
  991.                     engineAcceleration = 0;
  992.                 }
  993.             }
  994.             Vector3 collisionVector = transform.InverseTransformPoint(other.contacts[0].point);
  995.             if (hitDot < 0)
  996.                 transform.Rotate(Vector3.up * ((hitDot * 0.3f) * (collisionVector.x * 0.2f)));
  997.         }
  998.     }
  999.  
  1000.     void OnCollisionExit(Collision other)
  1001.     {
  1002.         wallSurfing = false;
  1003.         isColliding = false;
  1004.     }
  1005. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement