一种类似Vim的高效舒适Unity快捷键管理方式,受Whichkey.nvim启发。
WhichKey 使用激活
加序列键而不使用组合键,for 比如说你使用 Space
作为激活键:
- Unity : Move To view
ctrl
+alt
+f
Align with viewctrl
+shift
+f
- WhichKey: Move to View
space
v
m
, Align with Viewspace
v
a
序列键比起组合键更加清晰,并且不用同时按折磨手指。WhichKey和Unity原味快捷键也没有冲突.
有很多不常用的快捷键会很容易忘掉,如果实在想不起来后面的快捷键是什么,WhichKey会在一小段时间(可设置)后打卡一个窗口提示你.
我感觉很多向我一样的vim用户最讨厌的就是手要在鼠标和键盘之间来回切换。因为WhichKey可以提供更多快捷键,你可以将大部分快捷键设置在单手区域来避免切换鼠标键盘。也可以加上一些双手快捷键在IDE和Unity切换时使用
WhichKey还在开发状态,可能会有很多更新,建议使用OpenUPM安装
OpenUPM
- 打开
Edit/Project Settings/Package Manager
- 添加 Scoped Registry:
Name: OpenUPM URL: https://package.openupm.cn/ Scope(s): com.postcyberpunk.whichkey
- 点击Save
- 打开 Package Manager
- 点击左上角的 +
- 选择 Add from Git URL
- 输入
com.postcyberpunk.whichkey
- 点击 Add
你需要先用Unity内置快捷键绑定WhichKey/Actie
🚀你可以通过WhichKey/Extra/Load Quickstart Example来获得一个简单的预设
你可以在Preferences窗口的Whichkey选项卡中的Mapping部分添加快捷键,ProjectSetting中也有同样的选项,
点击Bind
按钮来绑定快捷键,注意WhichKey目前不支持Ctrl
Alt
等组合键,仅可以使用shift
与字母数字的组合假案
-
Layer
你可以把他当作目录,比如你有一系列以
g
开头和Gameobject相关的组合键,你就可以添加一个Gamobject的layer作为提示 Treat it like a folder,for example,you have some GameObject related shortcuts follow byg
,you can add a layerg
and set hints to "GameObject"你也可以在Layer列表中添加layer
-
Menu
作用就是
EditorApplication.ExecuteMenuItem
,用来绑定菜单的,Argument里填菜单路径在Menu列表中会有一个辅助按钮,但是一些内置的菜单路径并不能通过反射获得,仍然需要手动添加
菜单路径必须使用全英文,区分大小写,有的还会有
...
,总而言之 一字不差才行 -
Method 如果你有很多自制的方法想要绑定,但是不想菜单过于混乱,可以为你的方法添加WhichKeyMethod(id)属性,然后把id填在argument里,
using PCP.WhichKey;
...
[WhichKeyMethod(101)]
public static void WKHelloWorld()
{
Debug.Log("WhichKey:Hi");
}
该部分作为api示例,不提供过多支持
-
AssetNav
创建一个
AssetNavData
ScriptableObject,在ProjectSettings窗口WhichKey/Assets Navigation选项卡中添加他,像图里一样绑定快捷键
现在你可以通过f
A
[key]
为asset添加标记,使用 f
a
[key]
来定位Asset,你可以他创建多个AssetNav对象,在argument填入对应的索引值
- SceneNav
场景中Gameobject的书签管理,可以通过WhichKey/Extra/Scene Nav Window进行设置
参照 Extra 或者 Wiki
在Assets文件夹里添加下面两个文件,在 ThemePreview
里编辑USS.
在ProjectSettings窗口中的Whichkey选项卡里把Theme.uss
分配到Custom USS即可
Theme.uss
.main {
background-color: rgb(56, 56, 56);
border-left-color: rgb(47, 47, 47);
border-right-color: rgb(47, 47, 47);
border-top-color: rgb(47, 47, 47);
border-bottom-color: rgb(47, 47, 47);
border-left-width: 5px;
border-right-width: 5px;
border-top-width: 5px;
border-bottom-width: 5px;
flex-direction: column;
padding-left: 15px;
padding-right: 15px;
padding-top: 15px;
padding-bottom: 15px;
justify-content: center;
align-items: center;
}
.frame {
flex-grow: 1;
background-color: rgba(0, 0, 0, 0);
flex-direction: row;
padding-top: 0;
padding-bottom: 0;
border-left-color: rgb(47, 47, 47);
border-right-color: rgb(47, 47, 47);
border-top-color: rgb(47, 47, 47);
border-bottom-color: rgb(47, 47, 47);
border-left-width: 2px;
border-right-width: 2px;
border-top-width: 2px;
border-bottom-width: 2px;
align-items: center;
padding-left: 5px;
}
.key {
font-size: 20px;
color: rgb(210, 210, 210);
width: auto;
background-color: rgb(42, 42, 42);
-unity-text-align: middle-center;
border-left-color: rgb(91, 91, 91);
border-right-color: rgb(91, 91, 91);
border-top-color: rgb(91, 91, 91);
border-bottom-color: rgb(91, 91, 91);
border-left-width: 3px;
border-right-width: 3px;
border-top-width: 3px;
border-bottom-width: 3px;
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
min-width: 30px;
}
.hint {
font-size: 20px;
margin-left: 10px;
color: rgb(166, 173, 200);
white-space: nowrap;
}
.title {
font-size: 20px;
color: rgb(166, 173, 200);
white-space: nowrap;
align-self: center;
-unity-font-style: bold;
-unity-text-align: upper-center;
align-items: auto;
margin-bottom: 10px;
}
ThemePreview.uxml
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="True">
<Style src="project://database/Assets/Default/Theme.uss?fileID=7433441132597879392&guid=a9ebbc19d7d87044f9a8356a5dd9f474&type=3#Theme" />
<ui:VisualElement name="Main" class="main">
<ui:Label tabindex="-1" text="Label" display-tooltip-when-elided="true" name="Title" class="title" />
<ui:VisualElement name="Frame" class="frame">
<ui:Label tabindex="-1" text="A" display-tooltip-when-elided="true" name="Key" class="key" />
<ui:Label tabindex="-1" text="Hello this is a test Hint" display-tooltip-when-elided="true" name="Hint" class="hint" />
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>
2023.1 和 2022.3都测试过