当你习惯了ctrl + c 还会鼠标右键选复制么?一个成熟的软件自然也少不了各种快捷键,当然快捷键也是一个菜单选项的快速入口,所以菜单和快捷键是分不开的。
用快捷键者,快捷也。
Unity提供了不少键位,这里就不阐述了,下面两个网址是Unity自带的快捷键:
http://docs.unity3d.com/Manual/UnityHotkeys.html
http://www.ceeger.com/Manual/UnityHotkeys.html
正文
需求并不可怕,可怕的是不合理的需求。
但是此时,我们得站在策划的角度思考未来的人生,思考有哪些功能可以做成菜单或是快捷键,下面列举一下我的:
- 复制、粘贴物体的世界坐标(再也不用手输坐标了)
- 删除空文夹(菜单only)
- SendMessage到物体的某方法(直到现在还一直受用,我太TM机智了)
- TimeScale的递增递减(用它来控制游戏进程太爽了)
- 让物品的变换(坐标、旋转、大小)变为整数。(专治强迫症,Unity复制物品时,Scale经常变为0.999999,此时这个方法的价值就突现了)
有光的地方,就会有着阴影,并非每个方法都是有用的,策划犯的错,我同样也会犯,或许不同的地方在于心理阴影的面积;自己背别人的锅,会产生抱怨,而自己背自己的锅,会得到教训,叫慎重!这篇文章不讨论团队合作的重要性,所以回归主题,细数往事:
- 加入3D音效,并自动录入设置
- 将所有的粒子数量设置在XX以下
- 创建Prefab到指定的地方
- Unity自动寻路一键设置
- 给每一个新场景自动生成快速进入的菜单项(技术定位错误,以致无法实现)
或许是天马行空的胡思乱想,也可能是纯粹的想扩充菜单库,但是最终没有形成有意义的产物。
码文
1.规则
快捷键对应的字符:
- % 对应 Ctrl (mac cmd)
- # 对应 Shift
- & 对应 Alt
- abc……xyz 123……0-+ 为键盘键位
2.例1
将一个方法加入菜单,并且生成对应的快捷键:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using UnityEditor; public class TestMenu { [MenuItem("MyTools/SendMessage方法KMDebug到对象 %#l")] public static void KMDebug() { GameObject go = Selection.activeGameObject; if (go != null) { go.SendMessage("KMDebug", SendMessageOptions.DontRequireReceiver); } } } |
1 |
Selection.activeGameObject //此函数为你在当前场景中选择的物品 |
这个快捷键的属性是,增加开发人员在项目中的战斗力5000,令BUG无处逢生,居家开发之必备良药。广告结束,在你的脚本里写入KMDebug方法时,可以按快捷键运行方法里面的内容,即使是编辑器不运行的情况下也能执行,游戏运行中也是如此,这时能用到的地方就多了去了。如测试技能的时候,我想要CD快点;KMDebug里直接可以改CD参数;如测试一个数学函数直接写里面Call。
3.例2:删除空文件夹
1.在Editor下新建脚本 DeleteEmptyFolders
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
using UnityEditor; using UnityEngine; using System; using System.IO; /// <summary> ///delete empty folders /// </summary> public class DeleteEmptyFolders { public const string TITLE_AREYOUSURE = "你确定吗"; public const string DESC_DELETE_FOLDERS = "是否删除所有的空文件夹"; static int numFoldersDeleted = 0; static int numFoldersChecked = 0; [MenuItem("Tools/删除空文件夹")]// add item to menu static void DeleteFolders() { numFoldersChecked = 0; string[] dirs = Directory.GetDirectories("Assets"); foreach (string dirPath in dirs) { if (Directory.GetFiles(dirPath).Length == 0 && Directory.GetDirectories(dirPath).Length == 0) { numFoldersChecked++; } } if (numFoldersChecked > 0) if (EditorUtility.DisplayDialog (TITLE_AREYOUSURE, DESC_DELETE_FOLDERS, "Yes", "No")) { //Debug.Log("Running DeleteEmptyFolders editor script..."); RemoveFolders("Assets"); // start recursive call from root of Assets folder ShowDeletedFolderCount(); // display output log of empty folders found AssetDatabase.Refresh(); // refresh project hierarchy window in Unity editor } } static void RemoveFolders(string path) // recursive function { string[] dirs = Directory.GetDirectories(path); foreach (string dirPath in dirs) { RemoveFolders(dirPath); // recursive call, performing depth-first search // check if no files or folders inside the current path, to see if it's empty if (Directory.GetFiles(dirPath).Length == 0 && Directory.GetDirectories(dirPath).Length == 0) { //Debug.Log("Empty folder found!!!! called: " + dirPath); Directory.Delete(dirPath); // delete empty folder File.Delete(dirPath + ".meta"); // delete metafile also, if exists numFoldersDeleted++; } } } static void ShowDeletedFolderCount() { if (numFoldersDeleted > 0) Debug.Log("Empty folders deleted: " + numFoldersDeleted + ". Folders checked: " + numFoldersChecked + "."); numFoldersDeleted = 0; // reset counters for next run numFoldersChecked = 0; } } |
新建几个空文件夹,菜单中选择后:
窗口提示代码:
1 |
EditorUtility.DisplayDialog |
结尾
—————END