unity 关闭自己脚本_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;

}

///

/// 关开门方法

///

/// 门当前状态 门是开的还是关的 如果为true 表示当前门开着,调用这个方法则是关门动作

/// 门是朝里开还是朝外开

/// 是左边的门还是右边的门

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 右扇门朝里或朝外开关   朝外开,即是朝里关

///

/// 关门 右扇门 朝外开,朝里关

///

///

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;

}

}

}

///

/// 开门 右扇门 朝外开,朝里关

///

///

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

///

/// 关门 左扇门

///

///

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;

}

}

}

///

/// 开门 左扇门

///

///

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值