🔬

Prefab Drawer 完成

事件处理

之前已经将 Prefab Drawer 的基本功能实现好了,现在通过对鼠标事件的处理来将之前的逻辑整合在一起:

private void HandleEvents () {
		HandleUtility.AddDefaultControl (GUIUtility.GetControlID (FocusType.Passive));
		Vector3 mousePos = Event.current.mousePosition;
	
		switch (_mode) {
		case Mode.View:
				break;
		case Mode.Paint:
				DrawSelectedPrefab ();
				if (Event.current.type == EventType.MouseDown) {
						Paint (mousePos);
				}
				break;
		case Mode.Erase:
				if (Event.current.type == EventType.MouseDown || Event.current.type == EventType.MouseDrag) {
						Erase (mousePos);
				}
				break;
		}
}

绘制函数

最后在 OnSceneGUI 中调用所有的处理函数:

private void OnSceneGUI () {
		Handles.BeginGUI ();
	
		DrawToolbar ();
	
		HandleUnityTools ();
		HandleEvents ();
	
		Handles.EndGUI ();
}

简单改进

为了让使用者更方便地选择要绘制的 Prefab(即 SelectPrefab),这里对之前的 Prefab Center 进行简单的改进,添加一条命令可以直接选择该 Prefab 为绘制对象:

/*** SceneViewExtension/Assets/Tools/PrefabCenter/Editor/PrefabCenter.cs
*/

private void OnDetailGUI (int id) {
		// ...
	
		if (GUI.Button (new Rect (5, 108, _detailPosition.width - 10, 17), "Select Prefab")) {
				SelectPrefab ();
		}
	
		// ...
}

private void SelectPrefab () {
		GameObject prefabDrawer = GameObject.Find("Prefab Drawer");
		prefabDrawer.GetComponent<PrefabDrawer.PrefabDrawer> ().SelectedPrefab = _shownItem;
}

编译完成后最终效果如下: