Advertisement
Guest User

Untitled

a guest
May 26th, 2016
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.02 KB | None | 0 0
  1. using UnityEngine;
  2. using DG.Tweening;
  3. using DarkTonic.MasterAudio;
  4.  
  5. public class Dead : MonoBehaviour
  6. {
  7.     public bool needToFixAngle = true;
  8.     public bool needColliderResize = true;
  9.     public bool isRebootable = true;
  10.     [Header("On River Settings")]
  11.     public bool isOnRiver;
  12.     public float sineLimit;
  13.     public float onRiverFloatSpeed;
  14.  
  15.     [Header("Textures")]
  16.     public Material evilMat;
  17.     public Material goodMat;
  18.     public Material neutralMat;
  19.  
  20.     public DeadGender deadGender;
  21.     public DeadType type;
  22.     public GameObject head;
  23.     private Transform hands;
  24.     private GameManager gameManager;
  25.     Vector3 curPosition;
  26.     public Rigidbody deadRigidBody;
  27.     CapsuleCollider capsuleCollider;
  28.     float speed = 0.1f;
  29.     float minDistance = 2f;
  30.     float maxForce = 20f;
  31.     float force = 1f;
  32.  
  33.     public float timeMod;
  34.     public float speedMod;
  35.  
  36.     public bool selected;
  37.  
  38.     public float shotAngle = 45f;
  39.  
  40.     Vector3 currentPosition;
  41.     bool despawning = false;
  42.     private float randomLookAngleY;
  43.  
  44.     void OnSpawned()
  45.     {
  46.         InitializeDead();
  47.         lavaHits = 0;
  48.         if (needToFixAngle)
  49.         {
  50.             randomLookAngleY = Random.Range(0f, 360f);
  51.             transform.rotation = Quaternion.Euler(0, randomLookAngleY, 0);
  52.         }
  53.         timeMod = Random.Range(1f, 1000f);
  54.         speedMod = Random.Range(1f, 1f);
  55.     }
  56.  
  57.     void OnDespawned()
  58.     {
  59.         transform.parent = null;
  60.         despawning = false;
  61.         if (isRebootable)
  62.         {
  63.             RebootType();
  64.         }
  65.     }
  66.  
  67.     private void Start()
  68.     {
  69.         gameManager = gameManager ?? FindObjectOfType<GameManager>();
  70.        
  71.         if (!head)
  72.         {
  73.             head = FindObjectOfType<CardboardHead>().gameObject;
  74.         }
  75.  
  76.         if (!hands)
  77.         {
  78.             hands = head.transform.FindChild("Hands");
  79.         }
  80.  
  81.         capsuleCollider = capsuleCollider ?? transform.GetComponent<CapsuleCollider>();
  82.         deadRigidBody = deadRigidBody ?? transform.GetComponent<Rigidbody>();
  83.     }
  84.  
  85.     public Vector3 GetHeadPosition()
  86.     {
  87.         return head.transform.position;
  88.     }
  89.  
  90.  
  91.     void Update ()
  92.     {
  93.         if (isOnRiver)
  94.         {
  95.             OnRiverUpdate();
  96.             if (needColliderResize)
  97.             {
  98.                 capsuleCollider.radius = 0.6f;
  99.                 capsuleCollider.height = 1.6f;
  100.             }
  101.         }
  102.         else
  103.         {
  104.             if (needColliderResize)
  105.             {
  106.                 capsuleCollider.radius = 0.3f;
  107.                 capsuleCollider.height = 1f;
  108.             }
  109.         }
  110.  
  111.         if (selected)
  112.         {
  113.             transform.position = Vector3.Lerp(transform.position, hands.position, Time.deltaTime * 4.2f);
  114.         }
  115.     }
  116.  
  117.     private Transform maleBody;
  118.     private Transform femaleBody;
  119.     private Transform halo;
  120.     private Transform horns;
  121.     public void InitializeDead()
  122.     {
  123.         maleBody = maleBody ?? transform.FindChild("Malechar");
  124.         femaleBody = femaleBody ?? transform.FindChild("FemaleChar");
  125.         halo = halo ?? transform.FindChild("Halo");
  126.         horns = horns ?? transform.FindChild("Horns");
  127.     }
  128.  
  129.     public void RebootType()
  130.     {
  131.         halo.gameObject.SetActive(true);
  132.         maleBody.gameObject.SetActive(true);
  133.         horns.gameObject.SetActive(true);
  134.         femaleBody.gameObject.SetActive(true);
  135.         transform.localScale = Vector3.one;
  136.     }
  137.  
  138.     public DeadGender GetGender()
  139.     {
  140.         return deadGender;
  141.     }
  142.  
  143.     public DeadType GetDeadType()
  144.     {
  145.         return type;
  146.     }
  147.  
  148.     public void SetDeadType(DeadType type, DeadGender gender)
  149.     {
  150.         var renderer = maleBody.GetComponent<SkinnedMeshRenderer>();
  151.         switch(gender)
  152.         {
  153.             case DeadGender.Male:
  154.                 femaleBody.gameObject.SetActive(false);
  155.                 maleBody.gameObject.SetActive(true);
  156.                 deadGender = DeadGender.Male;
  157.                 break;
  158.             case DeadGender.Female:
  159.                 maleBody.gameObject.SetActive(false);
  160.                 femaleBody.gameObject.SetActive(true);
  161.                 renderer = femaleBody.GetComponent<SkinnedMeshRenderer>();
  162.                 deadGender = DeadGender.Female;
  163.                 break;
  164.         }
  165.  
  166.         switch(type)
  167.         {
  168.             case DeadType.Good:
  169.                 horns.gameObject.SetActive(false);
  170.                 renderer.material = goodMat;
  171.                 this.type = DeadType.Good;
  172.                 break;
  173.             case DeadType.Evil:
  174.                 halo.gameObject.SetActive(false);
  175.                 renderer.material = evilMat;
  176.                 this.type = DeadType.Evil;
  177.                 break;
  178.             case DeadType.Neutral:
  179.                 halo.gameObject.SetActive(false);
  180.                 horns.gameObject.SetActive(false);
  181.                 renderer.material = neutralMat;
  182.                 this.type = DeadType.Neutral;
  183.                 break;
  184.         }
  185.     }
  186.  
  187.     public bool WasThrown()
  188.     {
  189.         return selected == false && isOnRiver == false;
  190.     }
  191.  
  192.     public void DragDead ()
  193.     {
  194.         if (gameManager.CanGrabDead())
  195.         {
  196.             gameManager.HighlightTarget(type);
  197.             isOnRiver = false;
  198.             selected = true;
  199.             deadRigidBody.isKinematic = true;
  200.         }
  201.     }
  202.  
  203.     public float timeToTarget;
  204.  
  205.     public void ThrowDead ()
  206.     {
  207.         if (selected)
  208.         {
  209.             gameManager.TurnOffHightlight();
  210.             selected = false;
  211.             deadRigidBody.isKinematic = false;
  212.             var target = GetTarget();
  213.             //deadRigidBody.velocity = BallisticVel(target, shotAngle);
  214.             deadRigidBody.AddForce(CalculateBestThrowSpeed(transform.position, target, timeToTarget), ForceMode.VelocityChange);
  215.             deadRigidBody.AddTorque(transform.forward * 25, ForceMode.Impulse);
  216.             PlayScreamingSound(deadGender);
  217.         }
  218.     }
  219.  
  220.     void PlayScreamingSound (DeadGender gender)
  221.     {
  222.         switch(gender)
  223.         {
  224.             case DeadGender.Male:
  225.                 MasterAudio.PlaySound3DFollowTransformAndForget("male_screams", transform);
  226.                 break;
  227.             case DeadGender.Female:
  228.                 MasterAudio.PlaySound3DFollowTransformAndForget("female_screams", transform);
  229.                 break;
  230.         }
  231.     }
  232.  
  233.     public Vector3 GetTarget()
  234.     {
  235.         RaycastHit hitInfo;
  236.         if (Physics.Raycast(head.transform.position, head.transform.forward, out hitInfo, 100f))
  237.         {
  238.             return hitInfo.point;
  239.         }
  240.         return head.transform.position + (head.transform.forward * 22);
  241.     }
  242.  
  243.     public bool IsEvil()
  244.     {
  245.         return type == DeadType.Evil;
  246.     }
  247.  
  248.     public void OnRiverUpdate()
  249.     {
  250.         var recoverRotationSpeed = 1.3f;
  251.         var lookAtSpeed = 4.2f;
  252.  
  253.         if (needToFixAngle)
  254.         {
  255.             var rotation = lookingAtCamera ?
  256.                 Quaternion.Lerp(transform.rotation, Quaternion.LookRotation((head.transform.position - transform.position)), Time.deltaTime * lookAtSpeed) :
  257.                 Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, randomLookAngleY, 0), Time.deltaTime * recoverRotationSpeed);
  258.  
  259.             transform.rotation = rotation;
  260.         }
  261.  
  262.         var newXPos = transform.position.x + (((gameManager.GetRiverSpeed() * speedMod) * gameManager.GetComboRiverSpeedMultiplier()) * Time.deltaTime);
  263.         transform.position = new Vector3(newXPos , gameManager.GetRiverHeight(), transform.position.z);
  264.     }
  265.  
  266.     public void Despawn()
  267.     {
  268.         if (despawning) return;
  269.         despawning = true;
  270.         transform.DOScale(0, 0.5f).OnComplete(RealDespawn);
  271.     }
  272.  
  273.     public void RealDespawn()
  274.     {
  275.         gameManager.GetSpawner().Despawn(transform);
  276.     }
  277.  
  278.     public int GetCurrentCombo()
  279.     {
  280.         return gameManager.GetCurrentCombo();
  281.     }
  282.  
  283.     public int ScorePoints(int points, bool firstBounce)
  284.     {
  285.         return gameManager.AddPoints(points, firstBounce);
  286.     }
  287.  
  288.     private bool lookingAtCamera;
  289.     public void ToggleLookingAtCamera()
  290.     {
  291.         lookingAtCamera = !lookingAtCamera;
  292.     }
  293.  
  294.     private void OnTriggerEnter(Collider other)
  295.     {
  296.         if (other.name.Equals("DeadDespawner"))
  297.         {
  298.             Despawn();
  299.         }
  300.  
  301.         if (!selected && !isOnRiver && other.name.Equals("WaterPlane_3200_Tris"))
  302.         {
  303.             if (gameManager != null && gameManager.splashParticle != null) {
  304.                 Vector3 splashParticlePos = transform.position;
  305.                 splashParticlePos.y -= 0.5f;
  306.                 gameManager.splashParticle.transform.position = splashParticlePos;
  307.                 gameManager.splashParticle.Play ();
  308.             }
  309.             isOnRiver = true;
  310.             deadRigidBody.isKinematic = true;
  311.         }
  312.     }
  313.  
  314.     private void OnTriggerExit(Collider other)
  315.     {
  316.         isOnRiver = false;
  317.         deadRigidBody.isKinematic = false;
  318.     }
  319.  
  320.     public int lavaHitsLimit = 4;
  321.     private int lavaHits = 0;
  322.     private float lavaHitSpeed = 2.25f;
  323.  
  324.     public void LavaThrow()
  325.     {
  326.         if (lavaHits == lavaHitsLimit)
  327.         {
  328.             deadRigidBody.isKinematic = true;
  329.             transform.DOBlendableMoveBy(Vector3.down * 2, 2f);
  330.             return;
  331.         }
  332.         lavaHits++;
  333.         var direction = Vector3.Normalize(transform.position - head.transform.position);
  334.         direction.y = 0;
  335.         deadRigidBody.velocity = Vector3.zero;
  336.         deadRigidBody.AddForce(CalculateBestThrowSpeed(transform.position, transform.position + (direction * 4), lavaHitSpeed / lavaHits), ForceMode.VelocityChange);
  337.     }
  338.  
  339.     public void AttachToSpike(Floor spike)
  340.     {
  341.         transform.parent = spike.transform;
  342.         deadRigidBody.isKinematic = true;
  343.     }
  344.  
  345.     // http://d.gr-assets.com/books/1457364208l/29437996.jpg
  346.     public Vector3 BallisticVel(Vector3 targetPosition, float angle) {
  347.         var dir = targetPosition - transform.position;  // get target direction
  348.         var h = dir.y;  // get height difference
  349.         dir.y = 0;  // retain only the horizontal direction
  350.         var dist = dir.magnitude;  // get horizontal distance
  351.         var a = angle * Mathf.Deg2Rad;  // convert angle to radians
  352.         dir.y = dist* Mathf.Tan(a);  // set dir to the elevation angle
  353.         dist += h / Mathf.Tan(a);  // correct for small height differences
  354.         // calculate the velocity magnitude
  355.         var vel = Mathf.Sqrt(dist * Physics.gravity.magnitude / Mathf.Sin(2 * a));
  356.         return vel * dir.normalized;
  357.     }
  358.  
  359.     // http://d.gr-assets.com/books/1457364208l/29437996.jpg
  360.     private Vector3 CalculateBestThrowSpeed(Vector3 origin, Vector3 target, float timeToTarget)
  361.     {
  362.         // calculate vectors
  363.         var toTarget = target - origin;
  364.         var toTargetXZ = toTarget;
  365.         toTargetXZ.y = 0;
  366.  
  367.         // calculate xz and y
  368.         var y = toTarget.y;
  369.         var xz = toTargetXZ.magnitude;
  370.  
  371.         // calculate starting speeds for xz and y. Physics forumulase deltaX = v0 * t + 1/2 * a * t * t
  372.         // where a is "-gravity" but only on the y plane, and a is 0 in xz plane.
  373.         // so xz = v0xz * t => v0xz = xz / t
  374.         // and y = v0y * t - 1/2 * gravity * t * t => v0y * t = y + 1/2 * gravity * t * t => v0y = y / t + 1/2 * gravity * t
  375.         var t = timeToTarget;
  376.         var v0y = y / t + 0.5f * Physics.gravity.magnitude * t;
  377.         var v0xz = xz / t;
  378.  
  379.         // create result vector for calculated starting speeds
  380.         var result = toTargetXZ.normalized;        // get direction of xz but with magnitude 1
  381.         result *= v0xz;                                // set magnitude of xz to v0xz (starting speed in xz plane)
  382.         result.y = v0y;                                // set y to v0y (starting speed of y plane)
  383.  
  384.         return result;
  385.     }
  386.  
  387.     public void CharonScream ()
  388.     {
  389.         MasterAudio.PlaySound3DFollowTransformAndForget("male_screams", transform, 1, 0.78f);
  390.     }
  391.  
  392.     public void ThrownBoat ()
  393.     {
  394.         MasterAudio.PlaySound3DFollowTransformAndForget("whoosh", transform);
  395.     }
  396. }
  397.  
  398. public enum DeadGender
  399. {
  400.     Male,
  401.     Female,
  402.     NonBinary
  403. }
  404.  
  405. public enum DeadType
  406. {
  407.     Mythological,
  408.     Evil,
  409.     Good,
  410.     Neutral
  411. }
  412.  
  413. public enum DeadState
  414. {
  415.     Drowning,
  416.     BeingHeld,
  417.     Thrown
  418. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement