Advertisement
Guest User

Untitled

a guest
Jun 28th, 2016
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.37 KB | None | 0 0
  1. using UnityEngine;
  2. using TeamUtility.IO;
  3.  
  4. using BnG.TrackData;
  5. using System.Collections;
  6.  
  7. public class ShipCamera : ShipBase {
  8.  
  9.     // CAMERA SETTINGS
  10.     public Vector3 cOffset = new Vector3(0.0f, 0.15f, -1f);
  11.     public float cFoV = 75.0f;
  12.     public float tcSpeed = 13.0f;
  13.     public float sensitivity = 0.15f;
  14.  
  15.     private float tcDirectionLag;
  16.     private float tcDirectionLag2;
  17.     private float tcDirectionLag3;
  18.     private Vector3 tcActualOffset;
  19.     private float tcPitchOffset;
  20.     private float tcPitchHeight;
  21.     private float tcVelocityHeight;
  22.     private float tcInputOffset;
  23.  
  24.     private Vector3 tcTrackOffset;
  25.     private Vector3 tcFinalOffset;
  26.     private Vector2 trackHeightOffset;
  27.     private float trackHeightYSign;
  28.     private float wantedHeight;
  29.     private float tcSideZ;
  30.     private float tcSteerOffset;
  31.  
  32.     private float tcSectionLerp;
  33.     private Vector3 tcSectionOffset;
  34.     private float tcFallOffset;
  35.  
  36.     private float tcX;
  37.     private float tcY;
  38.     private float tcZ;
  39.  
  40.     public int cameraMode;
  41.     private bool lookingBehind;
  42.  
  43.     // FALL LAG
  44.     private float tcFallTimer;
  45.     private float tcFallTimerGain;
  46.     private float tcFallLagY;
  47.     private float tcFallLagZ;
  48.  
  49.     // cockpit offsets
  50.     private Vector3 cockpitOffset;
  51.     private Vector3 cockpitRotation;
  52.  
  53.     private GameObject cameraHelper;
  54.  
  55.     void Start()
  56.     {
  57.         // Create new transform helper
  58.         cameraHelper = new GameObject("_TRACKHELPER");
  59.     }
  60.  
  61.     void Update()
  62.     {
  63.         // do nothing if the game is paused
  64.         if (GameSettings.isPaused)
  65.             return;
  66.  
  67.         // Cycle camera mode
  68.         if (cInput.GetButtonDown("Camera"))
  69.             cameraMode++;
  70.  
  71.         if (cameraMode > 2)
  72.         {
  73.             transform.parent = r.transform;
  74.             cameraMode = 0;
  75.         }
  76.  
  77.         // Look Behind Checks
  78.         if (cInput.GetButtonDown("Look Behind"))
  79.         {
  80.             r.mesh.GetComponent<MeshRenderer>().enabled = true;
  81.             lookingBehind = true;
  82.         }
  83.  
  84.         if (cInput.GetButtonUp("Look Behind"))
  85.         {
  86.             if (cameraMode == 0)
  87.                 r.mesh.GetComponent<MeshRenderer>().enabled = false;
  88.             lookingBehind = false;
  89.         }
  90.     }
  91.  
  92.     void FixedUpdate()
  93.     {
  94.         if (r.isRespawning && cameraMode == 0)
  95.         {
  96.             ReverseChase();
  97.         }
  98.         else
  99.         {
  100.             if (lookingBehind)
  101.             {
  102.                 ReverseChase();
  103.             }
  104.             else
  105.             {
  106.                 switch (cameraMode)
  107.                 {
  108.                     case 0:
  109.                         // Enable ship mesh
  110.                         r.mesh.GetComponent<MeshRenderer>().enabled = true;
  111.                         r.cam.nearClipPlane = 0.05f;
  112.                         FollowTrack();
  113.                         break;
  114.                     case 1:
  115.                         // Disable ship mesh
  116.                         r.mesh.GetComponent<MeshRenderer>().enabled = false;
  117.                         r.cam.nearClipPlane = 0.05f;
  118.                         InternalCamera();
  119.                         break;
  120.                     case 2:
  121.                         // Disable ship mesh
  122.                         r.mesh.GetComponent<MeshRenderer>().enabled = false;
  123.                         r.cam.nearClipPlane = 0.01f;
  124.                         CockpitCam();
  125.                         break;
  126.  
  127.                 }
  128.             }
  129.         }
  130.     }
  131.  
  132.     private void CockpitCam()
  133.     {
  134.         transform.parent = r.settings.transform;
  135.        
  136.  
  137.         cockpitOffset.x = Mathf.Lerp(cockpitOffset.x, (r.sim.turnAmount / r.settings.TURN_SPEED) * 0.035f, Time.deltaTime * r.settings.CAMERA_OFFSET_SPEED.x);
  138.         cockpitOffset.y = 0.008f;
  139.         cockpitRotation.x = Mathf.Lerp(cockpitRotation.x, r.input.AXIS_PITCH * 5, Time.deltaTime * (r.settings.CAMERA_OFFSET_SPEED.x * 0.1f));
  140.         cockpitRotation.y = Mathf.Lerp(cockpitRotation.y, (r.sim.turnAmount / r.settings.TURN_SPEED) * 10, Time.deltaTime * r.settings.CAMERA_OFFSET_SPEED.x);
  141.         transform.localPosition = r.settings.REF_COCKPITMESH.transform.localPosition + cockpitOffset;
  142.         transform.localRotation = Quaternion.Euler(cockpitRotation.x, cockpitRotation.y, 0.0f);
  143.     }
  144.  
  145.     private void ReverseChase()
  146.     {
  147.         // parent camera
  148.         transform.parent = r.transform;
  149.  
  150.         // offset camera
  151.         tcSteerOffset = Mathf.Lerp(tcSteerOffset, -r.input.AXIS_STEER * 0.03f, Time.deltaTime * (r.settings.CAMERA_OFFSET_SPEED.x * 0.32f));
  152.         transform.localPosition = new Vector3(tcSteerOffset, cOffset.y, -cOffset.z * 0.6f);
  153.         transform.localRotation = Quaternion.Euler(0.0f, 180.0f, 0.0f);
  154.  
  155.         // update FoV
  156.         r.cam.fieldOfView = 75.0f;
  157.     }
  158.  
  159.     private void FollowTrack()
  160.     {
  161.         // parent camera
  162.         transform.parent = r.transform;
  163.  
  164.         // only follow track if current section exist
  165.         if (r.currentSection == null)
  166.             return;
  167.  
  168.         // position and rotate track helper (this is so we have a transform to work with)
  169.         cameraHelper.transform.position = r.currentSection.position;
  170.         cameraHelper.transform.rotation = TrackHelpers.SectionGetRotation(r.currentSection);
  171.  
  172.         // figure out the camera's offset to the track
  173.         Vector3 cameraOffset = cameraHelper.transform.InverseTransformPoint(transform.position);
  174.  
  175.         // figure out which way the ship is facing and interpolate track direction dot product value to it
  176.         Vector3 trackForward = cameraHelper.transform.forward;
  177.         tcDirectionLag = Mathf.Lerp(tcDirectionLag, Vector3.Dot(transform.forward, trackForward), Time.deltaTime * (tcSpeed * 0.5f));
  178.         tcDirectionLag2 = Mathf.Lerp(tcDirectionLag2, Vector3.Dot(transform.forward, TrackHelpers.SectionGetRotation(r.currentSection) * Vector3.right), Time.deltaTime * (tcSpeed * 0.5f));
  179.         tcDirectionLag3 = Mathf.Lerp(tcDirectionLag3, Vector3.Dot(transform.right, TrackHelpers.SectionGetRotation(r.currentSection) * Vector3.right), Time.deltaTime * (tcSpeed * 0.5f));
  180.  
  181.         tcTrackOffset = Vector3.Lerp(tcTrackOffset, cameraOffset * tcDirectionLag, Time.deltaTime * 25);
  182.         tcFinalOffset = Vector3.Lerp(tcFinalOffset, cameraOffset, Time.deltaTime * 25);
  183.  
  184.         // interpolate positions
  185.         tcSteerOffset = Mathf.Lerp(tcSteerOffset, r.input.AXIS_STEER * 0.03f, Time.deltaTime * (r.settings.CAMERA_OFFSET_SPEED.x * 0.32f));
  186.         tcX = Mathf.Lerp(tcX, -tcTrackOffset.x * r.settings.CAMERA_OFFSET_SENSITIVITY.x, Time.deltaTime * r.settings.CAMERA_OFFSET_SPEED.x);
  187.         tcY = Mathf.Lerp(tcY, (Mathf.Abs(tcFinalOffset.x)) * r.settings.CAMERA_OFFSET_SENSITIVITY.y, Time.deltaTime * r.settings.CAMERA_OFFSET_SPEED.y);
  188.         tcZ = Mathf.Lerp(tcZ, (tcFinalOffset.x * r.settings.CAMERA_OFFSET_SENSITIVITY.z) * -tcDirectionLag2, Time.deltaTime * r.settings.CAMERA_OFFSET_SPEED.z);
  189.         tcSideZ = Mathf.Lerp(tcSideZ, ((-Mathf.Abs(-tcTrackOffset.x * -tcTrackOffset.x) * 0.8f) * r.settings.CAMERA_OFFSET_ZMULT) * tcDirectionLag3, Time.deltaTime * r.settings.CAMREA_OFFSET_ZMULT_SPEED);
  190.  
  191.         // increase/decrease distance to ship on slopes
  192.         float upDir = Vector3.Dot(Vector3.up, r.transform.forward);
  193.         float dirNorm = Mathf.Abs(upDir) / 1.0f;
  194.         float trackDir = Vector3.Dot(TrackHelpers.SectionGetRotation(r.currentSection) * Vector3.up, r.transform.forward);
  195.         tcPitchOffset = Mathf.Lerp(tcPitchOffset, (-upDir * r.settings.CAMERA_OFFSET_TRACK.z * 0.2f) * dirNorm, Time.deltaTime * tcSpeed);
  196.         tcPitchHeight = Mathf.Lerp(tcPitchHeight, (-Mathf.Abs(upDir * r.settings.CAMERA_OFFSET_TRACK.y)), Time.deltaTime * (tcSpeed * 0.2f));
  197.  
  198.         // fall Offsets
  199.         if (r.sim.isShipGrounded || !r.jumpHeight)
  200.         {
  201.             tcFallTimer = 0;
  202.             tcFallTimerGain = 0;
  203.         }
  204.         else
  205.         {
  206.             tcFallTimer += Time.deltaTime;
  207.         }
  208.  
  209.         if (tcFallTimer > 0.0f)
  210.         {
  211.             tcFallTimerGain = Mathf.Lerp(tcFallTimerGain, 0.8f, Time.deltaTime);
  212.             tcFallLagY = Mathf.Lerp(tcFallLagY, 0.0f, Time.deltaTime * tcFallTimerGain);
  213.             tcFallLagZ = Mathf.Lerp(tcFallLagZ, 0.0f, Time.deltaTime * (tcFallTimerGain * 4));
  214.         }
  215.         else
  216.         {
  217.             tcFallTimerGain = 0;
  218.             tcFallLagY = Mathf.Lerp(tcFallLagY, 0.0f, Time.deltaTime * 4);
  219.             tcFallLagZ = Mathf.Lerp(tcFallLagZ, 0.0f, Time.deltaTime * 4);
  220.         }
  221.  
  222.         if (r.transform.InverseTransformDirection(r.body.velocity).y > 0)
  223.         {
  224.             tcFallOffset = Mathf.Lerp(tcFallOffset, r.transform.InverseTransformDirection(r.body.velocity).y * 0.008f, Time.deltaTime * (tcSpeed * 0.4f));
  225.         } else
  226.         {
  227.             tcFallOffset = Mathf.Lerp(tcFallOffset, 0.0f, Time.deltaTime * (tcSpeed * 0.3f));
  228.         }
  229.  
  230.         // distance to track offset
  231.         wantedHeight = Mathf.Lerp(wantedHeight, (transform.position.y - r.currentSection.position.y) - r.settings.AG_HOVER_HEIGHT, Time.deltaTime * (r.settings.CAMERA_FALL_SPEED.y * 10));
  232.         trackHeightYSign = Mathf.Lerp(trackHeightYSign, Mathf.Sign(r.body.velocity.y), Time.deltaTime * (r.settings.CAMERA_FALL_SPEED.y * 2));
  233.         trackHeightOffset.x = Mathf.Lerp(trackHeightOffset.x, -wantedHeight * (r.settings.CAMERA_FALL_SENSITIVITY.z * 0.5f), Time.deltaTime * (r.settings.CAMERA_FALL_SPEED.z));
  234.         trackHeightOffset.y = Mathf.Lerp(trackHeightOffset.y, (wantedHeight * (r.settings.CAMERA_FALL_SENSITIVITY.y * 0.5f)) * trackHeightYSign, Time.deltaTime * (r.settings.CAMERA_FALL_SPEED.y));
  235.  
  236.         // apply camera offset
  237.         transform.localPosition = new Vector3(r.settings.CAMERA_OFFSET_TRACK.x + tcX + tcSteerOffset,
  238.             r.settings.CAMERA_OFFSET_TRACK.y + tcY + tcFallLagY + tcPitchHeight + tcFallOffset + tcVelocityHeight + (-trackHeightOffset.y * 0.5f),
  239.             r.settings.CAMERA_OFFSET_TRACK.z + tcZ + tcPitchOffset + tcFallLagZ + trackHeightOffset.x + tcSideZ);
  240.  
  241.         // update Rotation
  242.         transform.rotation = r.transform.rotation;
  243.  
  244.         // update FoV
  245.         r.cam.fieldOfView = 75.0f;
  246.     }
  247.  
  248.     private void InternalCamera()
  249.     {
  250.         // parent camera
  251.         transform.parent = r.axis.transform;
  252.  
  253.         // zero out transform
  254.         transform.localPosition = r.settings.CAMERA_OFFSET_INTERNAL;
  255.         transform.localRotation = Quaternion.identity;
  256.  
  257.         // update FoV
  258.         r.cam.fieldOfView = 75.0f;
  259.     }
  260.  
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement