Unity 開關門腳本(不是原創)


腳本通過改變父物體的旋轉而實現開關門動作,所以需要為門添加一個父物體並將父物體的中心點位置調到門的邊框上;
掛載腳本的屬性:
isOpen:當前門開關的狀態;如果是true 表示當前門是開着的,為false表示當前門是關着的;
In_Out:有兩個選項,Inside表示,門是朝里開的(即開門時我們需要推門),outSide表示門是朝外開的(開門時我們需要拉開門);
Left_Right:有兩個選項,Right表示是右扇門,left表示是左扇門
speed:表示開門的速度

 

 

using UnityEngine;

using System.Collections;
public enum InOrOut
{
    Inside, Outside


}
public enum LeftOrRight
{
    Left, Right
}
public class OpenCloseDoor : MonoBehaviour
{
    [SerializeField] private bool isOpen = true;//門的狀態 true 表示現在是開的狀態 false 表示關的狀態
    [SerializeField] private InOrOut in_out;
    [SerializeField] private LeftOrRight left_right;
    private Transform _parentTr;//通過旋轉父物體來實現  要保證父物體的Rotation都為0
    private float z = 90;
    [SerializeField] private float speed = 5f;
    void Start()
    {
        _parentTr = transform.parent;


    }
    /// <summary>
    /// 關開門方法
    /// </summary>
    /// <param name="IsOpen">門當前狀態 門是開的還是關的 如果為true 表示當前門開着,調用這個方法則是關門動作</param>
    /// <param name="I_O">門是朝里開還是朝外開</param>
    /// <param name="L_R">是左邊的門還是右邊的門</param>
    public void Door(bool IsOpen, InOrOut I_O, LeftOrRight L_R)
    {
        if (IsOpen == true)//門是開的 需要關門
        {
            if (InOrOut.Outside == I_O)//門開門方向 朝外
            {
                if (LeftOrRight.Right == L_R)
                    StartCoroutine("WaitCloseRightDoorOut");
                if (LeftOrRight.Left == L_R)
                    StartCoroutine("WaitCloseLeftDoorOut");
            }
            if (InOrOut.Inside == I_O)//門開門方向 朝里
            {
                if (LeftOrRight.Right == L_R)//朝外開門相當於 朝里開門
                    StartCoroutine("WaitOpenRightDoorOut");
                if (LeftOrRight.Left == L_R)
                    StartCoroutine("WaitCloseLeftDoorOut");
            }
        }
        else//門是關的 需要開門
        {
            if (InOrOut.Outside == I_O)//朝外
            {
                if (LeftOrRight.Right == L_R)
                    StartCoroutine("WaitCloseRightDoorOut");
                if (LeftOrRight.Left == L_R)
                    StartCoroutine("WaitOpenLeftDoorOut");


            }
            if (InOrOut.Inside == I_O)//朝里
            {
                if (LeftOrRight.Right == L_R)
                    StartCoroutine("WaitCloseRightDoorOut");
                if (LeftOrRight.Left == L_R)
                    StartCoroutine("WaitOpenLeftDoorOut");
            }
        }


    }
    private void OnMouseDown()
    {
        Door(isOpen, in_out, left_right);
        #region 開關邏輯

 


        //if (isOpen == true)//門是開的 需要關門
        //{
        //    if (InOrOut.Outside == in_out)//門開門方向 朝外
        //    {
        //        if (LeftOrRight.Right == left_right)
        //            StartCoroutine("WaitCloseRightDoorOut");
        //        if (LeftOrRight.Left == left_right)
        //            StartCoroutine("WaitCloseLeftDoorOut");
        //    }
        //    if (InOrOut.Inside == in_out)//門開門方向 朝里
        //    {
        //        if (LeftOrRight.Right == left_right)//朝外開門相當於 朝里開門
        //            StartCoroutine("WaitOpenRightDoorOut");
        //        if (LeftOrRight.Left == left_right)
        //            StartCoroutine("WaitCloseLeftDoorOut");
        //    }
        //}
        //else//門是關的 需要開門
        //{
        //    if (InOrOut.Outside == in_out)//朝外
        //    {
        //        if (LeftOrRight.Right == left_right)
        //            StartCoroutine("WaitCloseRightDoorOut");
        //        if (LeftOrRight.Left == left_right)
        //            StartCoroutine("WaitOpenLeftDoorOut");


        //    }
        //    if (InOrOut.Inside == in_out)//朝里
        //    {
        //        if (LeftOrRight.Right == left_right)
        //            StartCoroutine("WaitCloseRightDoorOut");
        //        if (LeftOrRight.Left == left_right)
        //            StartCoroutine("WaitOpenLeftDoorOut");
        //    }
        //}  
        #endregion
        isOpen = !isOpen;


    }
    #region 右扇門朝里或朝外開關   朝外開,即是朝里關


    /// <summary>
    /// 關門 右扇門 朝外開,朝里關
    /// </summary>
    /// <returns></returns>
    IEnumerator WaitCloseRightDoorOut()
    {
        yield return null;
        float temp = -z;
        while (true)
        {
            yield return null;
            temp += speed;


            if (temp < 0)
            {


                _parentTr.localRotation = Quaternion.Euler(0, 0, temp);
            }
            else
            {
                break;
            }


        }
    }
    /// <summary>
    /// 開門 右扇門 朝外開,朝里關
    /// </summary>
    /// <returns></returns>
    IEnumerator WaitOpenRightDoorOut()
    {
        yield return null;
        float temp = 0;
        while (true)
        {
            yield return null;
            temp -= speed;


            if (temp > -z)
            {


                _parentTr.localRotation = Quaternion.Euler(0, 0, temp);
            }
            else
            {
                break;
            }


        }
    }

 


    #endregion
    #region MyRegion
    /// <summary>
    /// 關門 左扇門 
    /// </summary>
    /// <returns></returns>
    IEnumerator WaitCloseLeftDoorOut()
    {
        yield return null;
        float temp = 0;
        while (true)
        {
            yield return null;
            temp += speed;


            if (temp < z)
            {


                _parentTr.localRotation = Quaternion.Euler(0, 0, temp);
            }
            else
            {
                break;
            }


        }
    }
    /// <summary>
    /// 開門 左扇門 
    /// </summary>
    /// <returns></returns>
    IEnumerator WaitOpenLeftDoorOut()
    {
        yield return null;
        float temp = z;
        while (true)
        {
            yield return null;
            temp -= speed;


            if (temp > 0)
            {


                _parentTr.localRotation = Quaternion.Euler(0, 0, temp);
            }
            else
            {
                break;
            }


        }
    }
    #endregion


    private void OnDisable()
    {


        StopAllCoroutines();
    }
}

————————————————
版權聲明:本文為CSDN博主「RobinApp」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_23231303/article/details/80365437


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM