首页 >Unity3D频道 >【Unity3D拓展编辑器】 > Unity3D研究院编辑器之脚本设置ToolBar(二十三)
2016
02-05

Unity3D研究院编辑器之脚本设置ToolBar(二十三)

Unity版本5.3.2

如下图所示,ToolBar就是Unity顶部的那一横条。这里的所有按钮一般情况下都得我们手动的用鼠标去点击。这篇文章我们说说如果自动操作它们

Snip20160205_31.自动点击左边四个按钮 (拖动、坐标、旋转、缩放、矩形)

	[MenuItem("ToolBar/Tools")]
	static void ToolsMethod()
	{
		if(Tools.current  == Tool.View)
			Tools.current = Tool.Move;
		else if(Tools.current  == Tool.Move)
			Tools.current = Tool.Rotate;
		else  if(Tools.current  == Tool.Rotate)
			Tools.current = Tool.Scale;
		else  if(Tools.current  == Tool.Scale)
			Tools.current = Tool.Rect;
		else  if(Tools.current  == Tool.Rect)
			Tools.current = Tool.View;
	}

那么如果我不像自动设置,只是想监听手动点击的事件如何?

	[InitializeOnLoadMethod]
	static void StartInitializeOnLoadMethod()
	{
		SceneView.onSceneGUIDelegate = delegate(SceneView sceneView) {
			if (Event.current != null && Event.current.button == 1 && Event.current.type <= EventType.mouseUp)
			{
					Vector2 mousePosition = Event.current.mousePosition;
				    EditorUtility.DisplayPopupMenu(new Rect(mousePosition.x, mousePosition.y, 0, 0), "ToolBar/",null);
					Event.current.Use();
				}			
		};
		Type t =  typeof(Tools);
		FieldInfo info =t.GetField ("onToolChanged", BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);	

		//这段代码所属的类名, 请把这个换成你的类名
		MethodInfo method =  typeof(MyEditor).GetMethod ("OnToolChangedFunc", BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
		Delegate d = Delegate.CreateDelegate(info.FieldType,method);
		info.SetValue(null,d);
	}


	static void OnToolChangedFunc(Tool from, Tool to)
	{
                //这里还可以得到from 和 to 也就是从哪里到哪里
		Debug.Log(Tools.current +" ");
	}

OK.如下图所示,当我切换标签的时候,就会输出切换的事件。

Snip20160205_4

2.自动点击 Center Local 这两个辅助按钮

	[MenuItem("ToolBar/pivotMode")]
	static void pivotMode()
	{
		Tools.pivotMode =  	(Tools.pivotMode == PivotMode.Center)? PivotMode.Pivot : PivotMode.Center;
		Refresh();
	}

	[MenuItem("ToolBar/pivotRotation")]
	static void pivotRotation()
	{
		Tools.pivotRotation = 	(Tools.pivotRotation == PivotRotation.Global)? PivotRotation.Local : PivotRotation.Global; 
		Refresh();
	}
	static void  Refresh()
	{
		MethodInfo info =  	typeof(Tools).GetMethod("RepaintAllToolViews",BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static);
		info.Invoke(null,null);
	}

3.自动点击 Play Pause Step 这三个播放按钮

	[MenuItem("ToolBar/Play")]
	static void Play()
	{
		EditorApplication.ExecuteMenuItem("Edit/Play");
	}
	[MenuItem("ToolBar/Pause")]
	static void Pause()
	{
		EditorApplication.ExecuteMenuItem("Edit/Pause");
	}
	[MenuItem("ToolBar/Step")]
	static void Step()
	{
		EditorApplication.ExecuteMenuItem("Edit/Step");
	}

还是,那么如果我不像自动设置,只是想监听手动点击的事件如何?这样就可以监听了。

	[InitializeOnLoadMethod]
	static void StartInitializeOnLoadMethod()
	{

		EditorApplication.playmodeStateChanged = delegate() {
			Debug.Log("isPlaying :" + EditorApplication.isPlaying);
			Debug.Log("isPaused :" +EditorApplication.isPaused);
			Debug.Log("isPlayingOrWillChangePlaymode :" +EditorApplication.isPlayingOrWillChangePlaymode);
		};
	}

4.云 Account 按钮

这是云端账号系统,应该没有自动的需求吧?

5.Layers 按钮

这是设置游戏中所有层级的菜单。“小眼睛”表示是否在Scene视图中看见。“小锁头”表示是否可以在Scene视图中被鼠标选择到。 具体 内容大家可以看我之前的文章 #你好Unity3D#限制SceneView视图中不可选择游戏对象 

Snip20160205_2

自动设置的代码

	[MenuItem("ToolBar/SetLayer")]
	static void SetLayer()
	{
		Tools.visibleLayers = (1<< LayerMask.NameToLayer("UI")) |  (1<< LayerMask.NameToLayer("Default"));
		Tools.lockedLayers = (1<< LayerMask.NameToLayer("UI")) |  (1<< LayerMask.NameToLayer("Default"));
	}

 

6.Layout布局按钮 自动设置的代码如下

	[MenuItem("ToolBar/SetLayout")]
	static void SetLayout()
	{
		//把对应layout的名子填正确就行
		EditorApplication.ExecuteMenuItem("Window/Layouts/2 by 3");
	}

 

7.今天有朋友问我如何在SceneView通过脚本设置成顶视图,其实 上、下、左、右、前、后都可以通过脚本设置的。代码如下。

	[MenuItem("GameObject/Top View")]
	static void Start()
	{
		SceneView view = SceneView.lastActiveSceneView;
		if(view)
		{
			view.rotation = Quaternion.Euler(90f, 0f, 0f);
			view.pivot = Vector3.zero;
			view.size = 5f; 
			view.orthographic = true;
		}
	}

 

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院编辑器之脚本设置ToolBar(二十三)》有 8 条评论

  1. Eternity说:

    宣老师,如果我想在Play之前执行某些操作应该用哪个事件

  2. tianyazong说:

    宣老师,unity5.0以后的版本可以用AssetBundle打包C#脚本吗?盼您回复~

  3. 李明昌说:

    怎么感觉这里的好多类型我都点不出来啊,是要继承什么吗,有的已经找到了,但是有的还没有,求指教啊,momo大神,感觉自己太low了

留下一个回复

你的email不会被公开。 必填项已用 * 标注。