Unity 制作旋转门 推拉门 柜门 抽屉 点击自动开门效果 开关门自动播放音效 (附带编辑器扩展代码)

这篇具有很好参考价值的文章主要介绍了Unity 制作旋转门 推拉门 柜门 抽屉 点击自动开门效果 开关门自动播放音效 (附带编辑器扩展代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简易的门制作

对于一个新手来说,这个工具是最好的选择
Unity 制作旋转门 推拉门 柜门 抽屉 点击自动开门效果 开关门自动播放音效 (附带编辑器扩展代码)

上一篇关于开关门的文章相对于复杂,感兴趣的可以查看上篇开关门制作

优点
  • 挂载就能使用
  • 控制面板一看就懂(全是中文)
  • 简单的调试就能获得自己想要的效果
  • 易懂且易修改的代码
面板

Unity 制作旋转门 推拉门 柜门 抽屉 点击自动开门效果 开关门自动播放音效 (附带编辑器扩展代码)

参数
  • 锁:勾选后不能对门进行操作
  • 声音:激活时自动播放
  • 激活:测试开关门
  • 查看结果位置:按住查看结果,松开返回
    Unity 制作旋转门 推拉门 柜门 抽屉 点击自动开门效果 开关门自动播放音效 (附带编辑器扩展代码)
    旋转门的使用不做介绍
推拉门(推拉抽屉):
  • 起始位置:门的初始位置
  • 结束位置:门要移动的位置
  • 得到位置按钮:当你在场景中调整门的位置后,把当前门的位置赋值到左侧
代码

挂载之后会自动添加Audio Source组件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(AudioSource))]
public class Door_Interaction : MonoBehaviour
{
    public enum doorType { RotatingDoor = 0, SlidingDoor = 1 }
    public doorType doorMovementType;
    public bool open;
    public bool locked;
    public float rotateAngle = 90;
    public float speed = 1;
    public enum axis { X = 0, Y = 1, Z = 2 }
    public axis rotateAxis = axis.Y;
    public Vector3 startingPosition;
    public Vector3 endingPosition;
    public AudioClip startClip;
    public AudioClip endClip;
    private AudioSource sound;
    public Quaternion originRotation;
    public Quaternion openRotation;
    private float r;
    private bool opening;

    [Tooltip("激活测试")]
    public bool activate = false;
    void Start()
    {
        InitRotation();
        sound = GetComponent<AudioSource>();
        r = 0;
    }
    public void InitRotation()
    {
        originRotation = transform.rotation;
        openRotation = originRotation;
        if (rotateAxis == axis.Y)
        {
            openRotation = Quaternion.Euler(new Vector3(originRotation.eulerAngles.x, originRotation.eulerAngles.y + rotateAngle, originRotation.eulerAngles.z));
        }
        else if (rotateAxis == axis.X)
        {
            openRotation = Quaternion.Euler(new Vector3(originRotation.eulerAngles.x + rotateAngle, originRotation.eulerAngles.y, originRotation.eulerAngles.z));
        }
        else if (rotateAxis == axis.Z)
        {
            openRotation = Quaternion.Euler(new Vector3(originRotation.eulerAngles.x, originRotation.eulerAngles.y, originRotation.eulerAngles.z + rotateAngle));
        }
    }

    void Update()
    {
        if (activate)
        {
            activate = false;
            if (opening == false && locked == false)
            {
                open = !open;
                r = 0;
                opening = true;
            }
        }
        if (opening)
        {
            ChangeState(open);
        }
    }
    void ChangeState(bool State)
    {
        Quaternion quaternion;
        Vector3 vector3;
        if (State)
        {
            quaternion = openRotation;
            vector3 = endingPosition;
            if (startClip!=null&& r==0)
            {
                sound.clip = startClip;
                sound.Play();
            }
            
        }
        else
        {
            quaternion = originRotation;
            vector3 = startingPosition;
            if (endClip != null && r == 0)
            {
                sound.clip = endClip;
                sound.Play(); 
            }
        }
        r += Time.deltaTime * speed;
        if (doorMovementType == doorType.RotatingDoor)
        {
            if (Quaternion.Angle(quaternion, transform.rotation) > 0.1F)
            {
                transform.rotation = Quaternion.Slerp(transform.rotation, quaternion, r);
            }
            else
            {
                transform.rotation = quaternion;
                r = 0;
                opening = false;
            }
        }
        else if (doorMovementType == doorType.SlidingDoor)
        {
            if (Vector3.Distance(transform.localPosition, vector3) > 0.005F)
            {
                transform.localPosition = Vector3.Lerp(transform.localPosition, vector3, r);
            }
            else
            {
                transform.localPosition = vector3;
                r = 0;
                opening = false;
            }
        }
    }
}
编辑器扩展代码

需要注意!这个代码必须放在Editor文件下才能正常使用,Unity会自己处理Editor文件夹,就像Resources文件夹一样
我之前写的通用相机控制器也是一样的使用方法
感兴趣的可以查看通用相机控制器
Unity 制作旋转门 推拉门 柜门 抽屉 点击自动开门效果 开关门自动播放音效 (附带编辑器扩展代码)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Door_Interaction)), CanEditMultipleObjects]
public class Door_Interaction_Editor : Editor
{
    private SerializedProperty open;
    private SerializedProperty locked;
    private SerializedProperty rotateAngle;
    private SerializedProperty speed;
    private SerializedProperty rotateAxis;
    private SerializedProperty startingPosition;
    private SerializedProperty endingPosition;
    private SerializedProperty activate;
    private SerializedProperty startClip;
    private SerializedProperty endClip;
    private GUIStyle defaultStyle = new GUIStyle();

    public void OnEnable()
    {
        open = serializedObject.FindProperty("open");
        locked = serializedObject.FindProperty("locked");
        rotateAngle = serializedObject.FindProperty("rotateAngle");
        speed = serializedObject.FindProperty("speed");
        rotateAxis = serializedObject.FindProperty("rotateAxis");
        startingPosition = serializedObject.FindProperty("startingPosition");
        endingPosition = serializedObject.FindProperty("endingPosition");
        activate = serializedObject.FindProperty("activate");
        startClip = serializedObject.FindProperty("startClip");
        endClip = serializedObject.FindProperty("endClip");
    }
    bool IsButtonDown = false;
    Vector3 CurrentPosition= Vector3.zero;
    Quaternion CurrentRotation = Quaternion.identity;
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        var myScript = target as Door_Interaction;
        var doorGUIContent = new GUIContent("门类型", "选择不同门的类型参数也有所改变");
        GUIContent[] doorOptions;
        doorOptions = new[] { new GUIContent("旋转门"), new GUIContent("推拉门") };

        myScript.doorMovementType = (Door_Interaction.doorType)EditorGUILayout.Popup(doorGUIContent, (int)myScript.doorMovementType, doorOptions);
        EditorGUILayout.PropertyField(open,new GUIContent("当前状态"));
        EditorGUILayout.PropertyField(locked, new GUIContent("锁"));
        EditorGUILayout.PropertyField(speed, new GUIContent("执行速度"));

        EditorGUILayout.PropertyField(startClip, new GUIContent("打开时的声音"));
        EditorGUILayout.PropertyField(endClip, new GUIContent("关闭时的声音"));
        EditorGUILayout.PropertyField(activate, new GUIContent("激活"));

        GUILayout.Space(20);//间隔
        if (myScript.doorMovementType == Door_Interaction.doorType.RotatingDoor) {

            EditorGUILayout.PropertyField(rotateAngle, new GUIContent("旋转角度"));
            EditorGUILayout.PropertyField(rotateAxis, new GUIContent("轴", "门的旋转轴。 默认是Y "));
            GUILayout.Space(20);//间隔
            if (GUILayout.RepeatButton(new GUIContent("查看结束位置", "在视图中查看结束位置")))
            {
                if (IsButtonDown == false)
                {
                    IsButtonDown = true;
                    myScript.InitRotation();
                    CurrentRotation = myScript.transform.localRotation;
                }
                myScript.transform.rotation = myScript.openRotation;
            }
            else
            {
                if (IsButtonDown)
                {
                    IsButtonDown = false;
                    myScript.transform.localRotation = CurrentRotation;
                }
            }
        } else if (myScript.doorMovementType == Door_Interaction.doorType.SlidingDoor) {

            defaultStyle.alignment = TextAnchor.UpperCenter; //字体对齐方式: 水平靠左,垂直居中
            defaultStyle.normal.textColor = Color.yellow; //字体颜色:黄色
            defaultStyle.fontSize = 15; //字体大小: 20

            GUILayout.Label("起始位置", defaultStyle);
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PropertyField(startingPosition, new GUIContent(""));
            if (GUILayout.Button(new GUIContent("得到位置", "将当前的局部坐标赋值给开始位置")))
            {
                myScript.startingPosition = myScript.transform.localPosition;
            }
            EditorGUILayout.EndHorizontal();

            GUILayout.Label("结束位置", defaultStyle);
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PropertyField(endingPosition, new GUIContent(""));
            if (GUILayout.Button(new GUIContent("得到位置", "将当前的局部坐标赋值给结束位置")))
            {
                myScript.endingPosition = myScript.transform.localPosition;
            }
            EditorGUILayout.EndHorizontal();

            GUILayout.Space(20);//间隔
            if (GUILayout.RepeatButton(new GUIContent("查看结束位置", "在视图中查看结束位置")))
            {
                if (IsButtonDown==false)
                {
                    IsButtonDown = true;
                    CurrentPosition = myScript.transform.localPosition;
                }
                myScript.transform.localPosition = myScript.endingPosition;
            }
            else
            {
                if (IsButtonDown)
                {
                    IsButtonDown = false;
                    myScript.transform.localPosition = CurrentPosition;
                }
            } 
        }
        serializedObject.ApplyModifiedProperties();//顾名思义 应用修改的属性
        if (GUI.changed == true) {
            EditorUtility.SetDirty(target);//这个函数告诉引擎,相关对象所属于的Prefab已经发生了更改。
        }
    }
}

别要Demo了,按照流程赋值粘贴代码就能用 !文章来源地址https://www.toymoban.com/news/detail-424166.html

到了这里,关于Unity 制作旋转门 推拉门 柜门 抽屉 点击自动开门效果 开关门自动播放音效 (附带编辑器扩展代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Html 3D旋转相册制作

     程序示例精选 Html 3D旋转相册制作 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 这篇博客针对Html 3D旋转相册制作编写代码,代码整洁,规则,易读。 学习与应用推荐首选。           一、所需工具软件         二、使用步骤  

    2024年02月12日
    浏览(37)
  • 【Python】使用Print函数制作旋转的动画

    如果你想有效地学习Python,这篇文章可能不适合你。接下来的一切都可能是愚蠢、和浪费时间,但哪有怎么样,毕竟这玩意很有趣呀! 首先,我们来看两个好玩的Python脚本,如下: 在终端中运行上述脚本,可以得到结果如下: 在来看第二个脚本,如下所示: 在终端中,运行

    2024年02月04日
    浏览(47)
  • yolov5旋转目标框的数据集标签制作

    1.rolabelimg标注 https://blog.csdn.net/qq_42921511/article/details/127619447 2. roxml转为dota格式的txt roxml文件格式: dota的txt格式: 修改完路径后运行roxml_to_dota.py即可 3. dota格式txt转为yolo格式的txt标签 ** 环境配置: python=3.7 pip install opencv-python==4.1.2.30 (ps:必须为这个版本) 图片:长和宽一致的

    2024年02月04日
    浏览(45)
  • 【UE4 塔防游戏系列】05-制作可跟踪旋转的炮塔

    目录 效果 步骤 一、设置游戏观察视角  二、设置PlayerController 三、制作可跟踪旋转的炮塔   一、设置游戏观察视角  在视口中调整好位置,能够看到敌人行走的全部路线即可。然后在此处创建CameraActor  打开关卡蓝图,设置使用这个相机的视角  在世界场景设置中,默认的

    2024年02月16日
    浏览(47)
  • Unity中Shader旋转矩阵(二维旋转矩阵)

    在Shader中,我们经常对顶点进行旋转变换。我们在这篇文章中了解一下旋转使用的旋转矩阵。 我们先在2D平面下,了解2D原理 我们需要求的就是坐标系旋转后,P点在旋转后坐标系中的位置。 因为,我们旋转物体时,我们是围绕着一个轴旋转。 旋转后,我们需要求的就是物体

    2024年02月04日
    浏览(38)
  • Unity中Shader旋转矩阵(四维旋转矩阵)

    在上篇文章中,我们推算出了Shader物体旋转所使用的二维旋转矩阵。 Unity中Shader旋转矩阵(二维旋转矩阵) 在这篇文章中,我们来推算得到四维旋转矩阵。 围绕X轴旋转代表,物体顶点的X轴不变。 我们把P 2 增加一维且分量为1 M rotate * P 1 = P 2 M rotate = P 2 * P 1 -1 最后得到M ro

    2024年02月04日
    浏览(36)
  • ThreeJS 炫酷特效旋转多面体Web页 Demo 01《ThreeJS 炫酷特效制作》

    本案例为一个 threejs 的特效网页,大小球体进行包裹,外球体为透明材质,但是进行了线框渲染,使其能够通过外球踢查看其内球体。 注:案例参考源于互联网,在此做代码解释,侵删 本案例除 ThreeJS 外不适用任何第三方框架,放心食用 懒的同学可以直接下载代码,打赏作

    2024年02月08日
    浏览(57)
  • 【Unity】常见对象旋转方法

            记录下常见的游戏对象旋转API。         自身旋转。 public void Rotate(Vector3 eulers, Space relativeTo = Space.Self); eulers:旋转角度。 relativeTo:坐标轴。 代码: 演示: 代码: 演示:         绕某一点的某轴旋转。 public void RotateAround(Vector3 point, Vector3 axis, float angl

    2024年01月18日
    浏览(38)
  • Unity实现人物旋转+移动

    思路:首先要有个变量去记录下操作前的一个方向状态。(本次操作的对象是正面对着屏幕的。)然后还有有个变量去描述将要发生的方向。接着要明确,前和后,左和右是横跨180°的,其他的两两是相差90°的。所以我们可以以90°一个单位去做旋转。并且利用前面总结的方向

    2024年02月14日
    浏览(42)
  • Unity中的旋转方式

    1. transform.rotation 赋值四元数 Euler 返回一个旋转,它围绕 z 轴旋转 z 度、围绕 x 轴旋转 x 度、围绕 y 轴旋转 y 度(按该顺序应用)。 注意:将欧拉角存储在一个类变量中,并仅使用该变量作为欧拉角进行应用,但从不依赖于读回欧拉值。若从四元数读取、修改并写入欧拉值会

    2024年02月01日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包