Unity Editor禁止通过键盘删除GameObject
如果希望某类GameObject不可以通过键盘的Delete键进行删除,可以为该类型实现一个自定义的编辑器扩展类,并使该扩展类继承下面的 InterceptKeyboardDeleteEditor
类。
InterceptKeyboardDeleteEditor
类的作用原理是,在脚本被激活时每帧检测Unity Editor的 Event
,如果当前的 Event
对应了Delete键事件,则将其标记为 Used
,这样Unity Editor便不再处理该 Event
。
InterceptKeyboardDeleteEditor:
/// <summary>
/// 编辑器扩展基类。
/// 此基类禁止使用键盘删除GameObject,
/// 但是不能禁止在Hierarchy中通过右键菜单删除GameObject。
/// </summary>
public abstract class InterceptKeyboardDeleteEditor : Editor
{
protected virtual void OnEnable()
{
EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI;
}
protected virtual void OnDisable()
{
EditorApplication.hierarchyWindowItemOnGUI -= OnHierarchyGUI;
}
// 禁止在Scene中通过键盘删除
protected virtual void OnSceneGUI()
{
InterceptKeyboardDelete();
}
// 禁止在Hierarchy中通过键盘删除
protected virtual void OnHierarchyGUI(int instanceID, Rect selectionRect)
{
InterceptKeyboardDelete();
}
// 拦截键盘删除事件
private void InterceptKeyboardDelete()
{
var e = Event.current;
if (e.keyCode == KeyCode.Delete)
{
//e.Use(); // warning
e.type = EventType.Used;
}
}
}