简易的门制作

对于一个新手来说,这个工具是最好的选择

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

优点

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

面板

参数

  • 锁:勾选后不能对门进行操作
  • 声音:激活时自动播放
  • 激活:测试开关门
  • 查看结果位置:按住查看结果,松开返回

    旋转门的使用不做介绍
推拉门(推拉抽屉):
  • 起始位置:门的初始位置
  • 结束位置:门要移动的位置
  • 得到位置按钮:当你在场景中调整门的位置后,把当前门的位置赋值到左侧

代码

挂载之后会自动添加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文件夹一样
我之前写的通用相机控制器也是一样的使用方法
感兴趣的可以查看通用相机控制器

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; //字体大小: 20GUILayout.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了,按照流程赋值粘贴代码就能用 !

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

  1. 使用Unity制作2D游戏时,给UI添加粒子效果

    环境 unity 2019.1.8f1 在有UI界面的2D游戏中,若直接添加粒子系统,则会因为渲染层级的关系被遮挡,从而无法在游戏场景中显现. 解决方法: 更改Canvas设置 Canvas-> ...

  2. RayFire for Unity制作一个可以被击碎的岩石

    RayFire for Unity制作一个可以被击碎的岩石 1.导入名字为Rock_05的Prefab 2.添加脚本 Rayfire Shatter,选择一个type,然点击Fragment,这时可以 ...

  3. arkit unity_凯蒂猫! 如何使用ARKit和Unity制作增强现实应用程序。

    arkit unity by Francesco Pallotta 由Francesco Pallotta 凯蒂猫! 如何使用ARKit和Unity制作增强现实应用程序. (Hello, Kitty! ...

  4. unity 制作书本 翻页效果

    unity 制作书籍翻页效果 unity C# 翻书效果 2D 真实翻页 不使用插件 自制 实现思路: 将书本分为两边,一边一个翻页实现: 下图为书本的右面,以OA为分界线,△OAB是下一面的如上图的 ...

  5. Unity 制作简单的任务动画

    Unity 制作简单的任务动画 1.添加人物模型到unity 我使用的是unity store中的免费模型: https://assetstore.unity.com/packages/3d/char ...

  6. Unity 制作萌系live2d桌宠:屏幕自适应+交互

    目录 准备工作 使用unity显示live2d人物 全屏+背景透明+点击穿透+置顶 屏幕自适应 交互 本文在之前的博客如何使用unity制作萌萌的live2d桌宠的基础上对项目继续改进,解决了屏幕自适 ...

  7. Unity制作格斗游戏核心思路总结

    http://anchorart9.com/2016/05/22/unity%E5%88%B6%E4%BD%9C%E6%A0%BC%E6%96%97%E6%B8%B8%E6%88%8F%E6%A0%B ...

  8. unity 制作的app发布到andriod手机

    一,unity 制作一个简单的动画. 1.场景中添加一个立方体. 2.立方体上面添加一个胶囊形状,胶囊形状添加重力属性,运行的时候往下落. 3.制作完成,保存工程,名字为"t1". ...

  9. 如何使用unity制作雷达探测目标效果动画

    如何使用unity制作雷达探测目标效果动画 如何用unity制作动画或者可以展示的软件 因为如今许多制作软件的引擎,虚幻,unity,寒霜等,unity更加便捷. 在官网www.unity3D.com ...

最新文章

  1. readelf 读取动态链接表命令
  2. java protobuffer 网络_使用Protobuf定义网络协议
  3. 北大教授吴玺宏:从发声到语言,具身物理模型让NLP回到小数据时代
  4. SAP MM Movement Type 503的使用
  5. 【react】使用代理解决跨域问题
  6. mysql删除root用户密码_MySQL忘记密码 或者误删除root用户有效解决办法
  7. 无线通信 -- 跳频技术
  8. 中国农业科学院(深圳)农业基因组所Yuwen Liu课题组诚聘副研究员(30-50万)
  9. java swing 列表框_如何在Swing中使用列表框?
  10. eclipse tomcat插件安装
  11. java中的public,protected,package-private和private之间有什么区别?
  12. jquery中的map()方法与js中的map()方法
  13. mysql innodb_double_write特性
  14. 在 RAID 磁盘上面架构 LVM 系统
  15. 武汉理工大学计算机考研专业代码,武汉理工大学代码及专业代码
  16. 微信很好用却很少人知道的浮窗功能
  17. 一个菜鸟关于winrar密码无法秒破的研究结果
  18. 魔百盒CDN00001_移动魔百盒设置最佳DNS方法
  19. 先码后看!五大学科竞赛哪个含金量最高?
  20. gps+wifi+mobile 5的手机参数对比

热门文章

  1. Android 布局旋转 横屏竖屏
  2. windows 10微软拼音输入法变成繁体
  3. MOT 指标汇总 (详讲 说明 含义 )
  4. [LibreOJ 3124]【CTS2019】氪金手游【容斥原理】【概率】【树形DP】
  5. adf盖怎么打开_兄弟7470d显示ADF盖打开是什么问?
  6. mysql gtidpurged_7. MySQL复制全解析 Part 7 gtid_next和gtid_purged 系统变量解析
  7. android投影到win7,求教,如何把安卓手机屏幕投射到win7电脑上-win7投屏设置,手机投屏到电脑win7...
  8. 买个ssl证书费用要多少钱?
  9. 数据结构与算法——赫夫曼树基本实现
  10. 回文日期 php,c语言程序实例大全,220个详细程序源代码