HolyFot

Door Script C# Unity

Oct 6th, 2020 (edited)
233
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Perfect Door/Chest/DrawBridge Animation Script
  2. //Author: HolyFot
  3. //License: CC0
  4. using UnityEngine;
  5. using System.Collections;
  6.  
  7. public class Door : MonoBehaviour
  8. {
  9.     [SerializeField] public GameObject doorObj;
  10.     [SerializeField] public GameObject pivot;
  11.     [SerializeField] public bool isBackwards = false;
  12.     [SerializeField] private float startY = 0f;
  13.     [SerializeField] public float openSpeed = 100f;
  14.     [SerializeField] public float targetAngle = 90f;
  15.     [SerializeField] public AnimationCurve speedCurve = new AnimationCurve(new Keyframe(0, 0.3f), new Keyframe(0.1f, 0.3f), new Keyframe(0.5f, 1f), new Keyframe(0.9f, 0.3f), new Keyframe(1f, 0.3f));
  16.     [SerializeField] public DoorOpenMethod doorOpenType;
  17.     [SerializeField] AudioClip openSound;
  18.     [SerializeField] AudioClip closeSound;
  19.     [SerializeField] AudioSource audioSource;
  20.     [SerializeField] float playCloseSoundAtPercent = 0.9f;
  21.  
  22.     public bool isOpen = false;
  23.     public bool isTesting = false;
  24.     private bool isOpening = false;
  25.     private bool isClosing = false;
  26.     private bool playedCloseSound = false;
  27.     private Vector3 startPos;
  28.  
  29.     void Awake()
  30.     {
  31.         if (doorObj == null)
  32.         {
  33.             Debug.LogWarning("Door Object not set!");
  34.             return;
  35.         }
  36.         if (pivot == null)
  37.         {
  38.             Debug.LogWarning("Pivot Object not set!");
  39.             return;
  40.         }
  41.         if (audioSource == null)
  42.         {
  43.             audioSource = gameObject.AddComponent<AudioSource>();
  44.         }
  45.  
  46.         if (doorOpenType == DoorOpenMethod.X_Mode)
  47.         {
  48.             startY = doorObj.transform.localRotation.eulerAngles.x;
  49.             if (isTesting)
  50.                 Debug.Log("start X: " + startY.ToString());
  51.         }
  52.         else if (doorOpenType == DoorOpenMethod.Z_Mode)
  53.         {
  54.             startY = doorObj.transform.localRotation.eulerAngles.z;
  55.             if (isTesting)
  56.                 Debug.Log("start Z: " + startY.ToString());
  57.         }
  58.         else if (doorOpenType == DoorOpenMethod.Y_Mode)
  59.         {
  60.             startY = doorObj.transform.localRotation.eulerAngles.y;
  61.             if (isTesting)
  62.                 Debug.Log("start Y: " + startY.ToString());
  63.         }
  64.         startPos = doorObj.transform.localPosition;
  65.     }
  66.  
  67.     void Update()
  68.     {
  69.         if (isTesting)
  70.         {
  71.             if (Input.GetKeyDown(KeyCode.F))
  72.             {
  73.                 ToggleDoor();
  74.             }
  75.         }
  76.     }
  77.  
  78.     public void ToggleDoor()
  79.     {
  80.         if (isOpen)
  81.             CloseDoor();
  82.         else
  83.             OpenDoor();
  84.     }
  85.  
  86.     public void OpenDoor()
  87.     {
  88.         StopDoorAnims();
  89.         isOpening = true;
  90.  
  91.         if (!isBackwards)
  92.             StartCoroutine("ForwardDoor2");
  93.         else
  94.             StartCoroutine("ReverseDoor2");
  95.  
  96.         if (openSound != null)
  97.             audioSource.PlayOneShot(openSound);
  98.         isOpen = true;
  99.     }
  100.  
  101.     public void CloseDoor()
  102.     {
  103.         StopDoorAnims();
  104.         playedCloseSound = false;
  105.         isClosing = true;
  106.  
  107.         if (!isBackwards)
  108.             StartCoroutine("ReverseDoor2");
  109.         else
  110.             StartCoroutine("ForwardDoor2");
  111.  
  112.         isOpen = false;
  113.     }
  114.  
  115.     public void StopDoorAnims()
  116.     {
  117.         StopCoroutine("ForwardDoor2");
  118.         StopCoroutine("ReverseDoor2");
  119.     }
  120.  
  121.     private IEnumerator ForwardDoor2()
  122.     {
  123.         if (doorOpenType == DoorOpenMethod.X_Mode)
  124.         {
  125.             while (doorObj.transform.localRotation.eulerAngles.x < startY + targetAngle - 1f)
  126.             {
  127.                 float calcSpeed = CalcSpeedRamp2(doorObj.transform.localRotation.eulerAngles.x, startY, startY + targetAngle);
  128.                 doorObj.transform.RotateAround(pivot.transform.position, Vector3.right, calcSpeed * Time.deltaTime);
  129.                 //if (isTesting)
  130.                     //Debug.Log("Opening.. X: " + doorObj.transform.localRotation.eulerAngles.x.ToString("0.000"));
  131.                 isOpening = true;
  132.                 yield return null;
  133.             }
  134.             doorObj.transform.localEulerAngles = new Vector3(targetAngle, doorObj.transform.localEulerAngles.y, doorObj.transform.localEulerAngles.z);
  135.         }
  136.         else if (doorOpenType == DoorOpenMethod.Z_Mode)
  137.         {
  138.             while (doorObj.transform.localRotation.eulerAngles.z < startY + targetAngle - 1f)
  139.             {
  140.                 float calcSpeed = CalcSpeedRamp2(doorObj.transform.localRotation.eulerAngles.z, startY, startY + targetAngle);
  141.                 doorObj.transform.RotateAround(pivot.transform.position, Vector3.up, calcSpeed * Time.deltaTime);
  142.                 //if (isTesting)
  143.                     //Debug.Log("Opening.. Z: " + doorObj.transform.localRotation.eulerAngles.z.ToString("0.000"));
  144.                 isOpening = true;
  145.                 yield return null;
  146.             }
  147.             doorObj.transform.localRotation = Quaternion.Euler(doorObj.transform.localRotation.eulerAngles.x, doorObj.transform.localRotation.eulerAngles.y, targetAngle);
  148.         }
  149.         else if (doorOpenType == DoorOpenMethod.Y_Mode) //Rotate around Y
  150.         {
  151.             while (doorObj.transform.localRotation.eulerAngles.y < startY + targetAngle - 1f)
  152.             {
  153.                 float calcSpeed = CalcSpeedRamp2(doorObj.transform.localRotation.eulerAngles.y, startY, startY + targetAngle);
  154.                 doorObj.transform.RotateAround(pivot.transform.position, Vector3.left, calcSpeed * Time.deltaTime);
  155.                 //if (isTesting)
  156.                     //Debug.Log("Opening.. Y: " + doorObj.transform.localRotation.eulerAngles.y.ToString("0.000"));
  157.                 isOpening = true;
  158.                 yield return null;
  159.             }
  160.             doorObj.transform.localEulerAngles = new Vector3(doorObj.transform.localEulerAngles.x, targetAngle, doorObj.transform.localEulerAngles.z);
  161.         }
  162.         isOpening = false;
  163.     }
  164.  
  165.     private IEnumerator ReverseDoor2()
  166.     {
  167.         if (doorOpenType == DoorOpenMethod.X_Mode)
  168.         {
  169.             while (doorObj.transform.localRotation.eulerAngles.x > startY && doorObj.transform.localRotation.eulerAngles.x < targetAngle + 1f)
  170.             {
  171.                 float calcSpeed = CalcSpeedRamp2(doorObj.transform.localRotation.eulerAngles.x, startY, startY + targetAngle);
  172.                 doorObj.transform.RotateAround(pivot.transform.position, Vector3.right, -1 * calcSpeed * Time.deltaTime);
  173.                 //if (isTesting)
  174.                     //Debug.Log("Close door X: " + doorObj.transform.localRotation.eulerAngles.x.ToString("0.000"));
  175.                 isClosing = true;
  176.                 yield return null;
  177.             }
  178.             doorObj.transform.localEulerAngles = new Vector3(startY, doorObj.transform.localEulerAngles.y, doorObj.transform.localEulerAngles.z);
  179.             doorObj.transform.localPosition = startPos;
  180.         }
  181.         else if (doorOpenType == DoorOpenMethod.Z_Mode)
  182.         {
  183.             while (doorObj.transform.localRotation.eulerAngles.z > startY && doorObj.transform.localRotation.eulerAngles.z < targetAngle + 1f)
  184.             {
  185.                 float calcSpeed = CalcSpeedRamp2(doorObj.transform.localRotation.eulerAngles.z, startY, startY + targetAngle);
  186.                 doorObj.transform.RotateAround(pivot.transform.position, Vector3.up, -1 * calcSpeed * Time.deltaTime);
  187.                 //if (isTesting)
  188.                     //Debug.Log("Close door Z: " + doorObj.transform.localRotation.eulerAngles.z.ToString("0.000"));
  189.                 isClosing = true;
  190.                 yield return null;
  191.             }
  192.             doorObj.transform.localEulerAngles = new Vector3(doorObj.transform.localEulerAngles.x, doorObj.transform.localEulerAngles.y, startY);
  193.             doorObj.transform.localPosition = startPos;
  194.         }
  195.         else if (doorOpenType == DoorOpenMethod.Y_Mode)
  196.         {
  197.             while (doorObj.transform.localRotation.eulerAngles.y > startY && doorObj.transform.localRotation.eulerAngles.y < targetAngle + 1f)
  198.             {
  199.                 float calcSpeed = CalcSpeedRamp2(doorObj.transform.localRotation.eulerAngles.y, startY, startY + targetAngle);
  200.                 doorObj.transform.RotateAround(pivot.transform.position, Vector3.left, -1 * calcSpeed * Time.deltaTime);
  201.                 //if (isTesting)
  202.                     //Debug.Log("Close door Y: " + doorObj.transform.localRotation.eulerAngles.y.ToString("0.000"));
  203.                 isClosing = true;
  204.                 yield return null;
  205.             }
  206.             doorObj.transform.eulerAngles = new Vector3(doorObj.transform.rotation.x, startY, doorObj.transform.rotation.z);
  207.             doorObj.transform.localPosition = startPos;
  208.         }
  209.         isClosing = false;
  210.     }
  211.  
  212.     private float CalcSpeedRamp2(float value, float min, float max)
  213.     {
  214.         float curr = 1f;
  215.         float percent = Mathf.Abs(value) / Mathf.Abs(max - min);
  216.  
  217.         curr = openSpeed * speedCurve.Evaluate(percent);
  218.  
  219.         if (isClosing)
  220.         {
  221.             if (!playedCloseSound && 1f-percent >= playCloseSoundAtPercent)
  222.             {
  223.                 if (closeSound != null)
  224.                     audioSource.PlayOneShot(closeSound);
  225.                 if (isTesting)
  226.                     Debug.Log("Play Close: Curr Precent: " + percent.ToString("0.000"));
  227.                 playedCloseSound = true;
  228.             }
  229.         }
  230.         return curr;
  231.     }
  232. }
  233.  
  234. public enum DoorOpenMethod
  235. {
  236.     Z_Mode,
  237.     Y_Mode,
  238.     X_Mode
  239. }
RAW Paste Data