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;
}
}
}