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();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_23231303/article/details/80365437