文档章节

Unity 开关门脚本(不是原创)

o
 osc_ogi0qclx
发布于 2019/08/23 15:09
字数 790
阅读 20
收藏 0

精选30+云产品,助力企业轻松上云!>>>

脚本通过改变父物体的旋转而实现开关门动作,所以需要为门添加一个父物体并将父物体的中心点位置调到门的边框上;
挂载脚本的属性:
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

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
mapbox-unity-sdk学习小结

Mapbox不是一个专门的增强现实SDK,是一个移动和网络应用程序的位置数据平台,提供构建基块,将地图,搜索和导航等位置功能。 国内基于地理定位的增强现实开发的时候,其实很麻烦。Google地图...

生活在他方
03/31
0
0
Unity接安卓sdk学习记录

1、Unity导出Gradle接入android studio 把libs下的复制到安卓工程,并添加到库 把src/main 下的assets 和 jniLibs 和 java下的脚本,复制到安卓工程的对应目录下 最后androidManifest下的设置...

深林_
03/31
0
0
unity零基础开始学习做游戏(一)为了实现你的游戏,你需要提前做的准备工作

-------小基原创,转载请给我一个面子   正所谓,工欲善其事,必现准备好电脑。接下来跟着小基一步一步来搭建你的开发环境吧 1.下载安装unity 上面的那个是破解软件,下面是unity5.5.6的安...

osc_snzhxf3u
2018/05/06
2
0
Unity WebGL与浏览器脚本交互

Unity发布成WebGL之后,可以与浏览器脚本进行交互, 官方说明链接:https://connect.unity.com/doc/Manual/webgl-interactingwithbrowserscripting 浏览器脚本调用Unity方法 在浏览器脚本中,...

生活在他方
03/31
0
0
Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收(九)

Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6926746 ...

彭博
2012/03/09
828
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊rocketmq-client-go的TraceInterceptor

序 本文主要研究一下rocketmq-client-go的TraceInterceptor TraceInterceptor rocketmq-client-go-v2.0.0/producer/interceptor.go // WithTrace support rocketmq trace: https://github.c......

go4it
32分钟前
0
0
如何在Android文本视图周围添加边框? - How do I put a border around an Android textview?

问题: 是否可以在textview周围绘制边框? 解决方案: 参考一: https://stackoom.com/question/EfXR/如何在Android文本视图周围添加边框 参考二: https://oldbug.net/q/EfXR/How-do-I-put...

法国红酒甜
47分钟前
10
0
设计模式(4) 建造者模式

什么是建造者模式 经典建造者模式的优缺点 对建造者模式的扩展 什么是建造者模式 建造者模式将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了...

zhixin9001
59分钟前
14
0
ArrayList源码分析 —— JDK8

ArrayList的特性 ArrayList内部使用数据作为存储结构,ArrayList可以理解为数组的扩展对象,封装了常用的和非常用的操作数组的方法。以及当数组长度不足以保存数组时,自动扩容数组,通常Arr...

XuePeng77
今天
42
0
__slots__的用法? - Usage of __slots__?

问题: Python中__slots__的目的是什么-尤其是关于何时以及何时不使用它的目的? 解决方案: 参考一: https://stackoom.com/question/1ymu/slots-的用法 参考二: https://oldbug.net/q/1ym...

富含淀粉
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部