2019-08-03 22:29:08 piai9568 阅读数 130

做编辑器扩展开发时,假如我们生成一个文件到Assets之外的目录,要查看它的时候,需要从系统路径一步步打开到那个目录。
Unity给我们提供了一个API可以直接打开指定目录,类似Project窗口右键文件选择“Reveal in Finder” 从系统窗口显示文件。

EditorUtility.RevealInFinder(string outputPath);

利用这个API我们可以做诸如编译成功后直接跳转到文件所在目录的操作,方便直接查看。

假设我们用编辑器生成了一个level1.txt文件 位于 configfiles目录中,点击对话框中的确定,就可以直接打开显示它。

先看下效果

代码如下:

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class ShowSystemFinder {

   [MenuItem("UnityAsk/DoTest")]
   private static void DoTest()
   {
      var outputPath = "configfiles";
      if (!Directory.Exists(outputPath))
      {
         Directory.CreateDirectory(outputPath);
      }

      File.WriteAllText(Path.Combine(outputPath,"level1.txt"),"this is level one");
      
      
      if (EditorUtility.DisplayDialog("UnityAsk的Unity3D小技巧","我完成了","确定"))
      {
         EditorUtility.RevealInFinder(outputPath);
      }
   }
}

创建ShowSystemFinder.cs文件,并放到Editor目录下。

Unity技术交流 微信公众号 UnityAsk,QQ群:891920228

2018-06-19 18:04:59 qq_39741605 阅读数 1126

开发过程中一些快捷操作可以让你减少一些重复操作

接下来说下怎么把Hierarche 窗口组件快速展开和折叠


全选你要折叠的物体 按着Shift键点击开头第一个 然后选择最后一个这样就全部选择要操作的组件

然后按着 Alt键+小键盘旁边的方向键 Alt键+→快速展开  Alt键+ ←快速折叠

inspector窗口组件快速展开折叠

如果遇见一个物体上挂载多个脚本你想要快速展开和折叠 这样就需要借助编辑器扩展Edito完成


新建脚本 InspectorManagerEditor

下面贴出代码

using UnityEditor;
using System.Reflection;

/// <summary>
/// 描述:全部 展开/收起 Inspector面板的所有组件、
/// author:
/// todo 还可以深度定制,添加两个按钮切换
/// </summary>
//[CustomEditor(typeof(Transform))]
public class InspectorManagerEditor : Editor
{
    #region ===字段===

    #endregion

    #region ===Unity事件=== 快捷键: Ctrl + Shift + M /Ctrl + Shift + Q  实现
    // 显示两个可以点击的Button 


    [MenuItem("DajiaGame/InspectorManager/全部展开组件... %#&m")]
    static void Expansion()
    {
        var type = typeof(EditorWindow).Assembly.GetType("UnityEditor.InspectorWindow");
        var window = EditorWindow.GetWindow(type);
        FieldInfo info = type.GetField("m_Tracker", BindingFlags.NonPublic | BindingFlags.Instance);
        ActiveEditorTracker tracker = info.GetValue(window) as ActiveEditorTracker;

        for (int i = 0; i < tracker.activeEditors.Length; i++)
        {
            ////可以通过名子单独判断组件展开或不展开
            //if (tracker.activeEditors[i].target.GetType().Name != "NewBehaviourScript")
            //{
            //这里1就是展开,0就是合起来
            tracker.SetVisible(i, 1);
            //}
        }
    }

    [MenuItem("DajiaGame/InspectorManager/全部收起组件... %#&n")]
    static void Shrinkage()
    {
        var type = typeof(EditorWindow).Assembly.GetType("UnityEditor.InspectorWindow");
        var window = EditorWindow.GetWindow(type);
        FieldInfo info = type.GetField("m_Tracker", BindingFlags.NonPublic | BindingFlags.Instance);
        ActiveEditorTracker tracker = info.GetValue(window) as ActiveEditorTracker;

        for (int i = 0; i < tracker.activeEditors.Length; i++)
        {
            //这里1就是展开,0就是合起来
            tracker.SetVisible(i, 0);
        }
    }

    #endregion

    #region ===方法===

    #endregion
}


新建文件夹Editor把这个脚本放在这个文件夹下

然后通过快捷键或者 选择这里就可以将 inspector窗口一个物体的组件快速展开和关闭

2017-06-01 18:35:21 u010707274 阅读数 313

Unity3D编辑器之脚本打开SpritePacker窗口


正常情况下需要选择 Windows->SpritePacker 但是默认会选择第一个图集。如下图所示,这就很不爽了,因为我做了图集管理工具,我想在Insperctor窗口中点击某个按钮,自动打开SpritePacker并且选择我设置的图集怎么办?

1.png (22.06 KB, 下载次数: 1)

下载附件  保存到相册

2015-11-30 10:13 上传




SpritePacker窗口没有提供代码访问接口,那么我们可以使用强大的反射功能。我自己反编译一下Unity的Editor代码,然后找到图集的窗口类。然后看看它的实现方法,然后就有了如下的代码了。

[C#] 纯文本查看 复制代码
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using UnityEditor;
using System.Reflection;
using UnityEditor.Sprites;
  
public class MyEditor : Editor {
  
  
    [MenuItem("GameObject/SearchAtlas",false,0)]
    static void StartInitializeOnLoadMethod1()
    {
        //需要Sprite Packer界面定位的图集名称
        string spriteName = "atlas_name2";
        //设置使用采取图集的方式
        EditorSettings.spritePackerMode = SpritePackerMode.AlwaysOn;
        //打包图集
        Packer.RebuildAtlasCacheIfNeeded(EditorUserBuildSettings.activeBuildTarget, true);
        //打开SpritePack窗口
        EditorApplication.ExecuteMenuItem("Window/Sprite Packer");
        var window = EditorWindow.focusedWindow;
  
        //反射遍历所有图集
        var type = typeof(EditorWindow).Assembly.GetType("UnityEditor.Sprites.PackerWindow");
        FieldInfo infoNames = type.GetField("m_AtlasNames", BindingFlags.NonPublic | BindingFlags.Instance);
        string[] infoNamesArray = (string[])infoNames.GetValue(window);
  
        if(infoNamesArray != null)
        {
            for (int i = 0; i < infoNamesArray.Length; i++)
            {
                if (infoNamesArray[i] == spriteName)
                {
                    //找到后设置索引
                    FieldInfo info = type.GetField("m_SelectedAtlas", BindingFlags.NonPublic | BindingFlags.Instance);
                    info.SetValue(window, i);
                    break;
                }
            }
        }
    }
}


OK.如下图所示,脚本打开SpritePacker窗口,并且定位到我需要的图集上。

2019-03-06 16:33:25 iningwei 阅读数 153

1:playing的时候改变了代码,重编译导致各种报错

Playing状态下,Unity3D编辑器默认会在检测到代码改变后,进行重新编译,然后继续运行。
可以通过Editor->Preferences->General->Script Changes While Playing
来设置Playing状态下,代码重编译的时机。

2:最大化窗口

Shift+space快捷键,可以最大化当前focuse的窗口

3:Animation窗口快捷键

在Animation窗口中,按下Ctrl+A,所有关键帧将集中显示在窗口中;选择某些关键帧,按下F键,可将它们居中显示在窗口中;按下C键,可以在曲线视图和关键帧视图间切换;按下K键添加关键帧。

4:设置编辑器运行一帧后暂停

先点击暂停按钮,再点击运行按钮,这样编辑器即会在运行一帧后暂停游戏

5:获得资源的预览图

AssetPreview.GetAssetPreview(Object obj)该方法只能在Editor下使用。
see:https://docs.unity3d.com/ScriptReference/AssetPreview.GetAssetPreview.html

6:展开Hierarchy树状图

alt+鼠标左键点击Hierarchy视图中的“三角符号”,即可完全展开节点的树状图

7:快速创建6变形,三角形等形状的sprite

Project视图下,鼠标右键Create->Sprite->各种形状
在这里插入图片描述

8:Reset()方法导致的锅

继承自MonoBehaviour的脚本,若在其内部定义方法Reset()

    private void Reset()
    {
    }

那么在脚本第一次拖拽到节点上会触发该方法,在组件点击弹出的选择项中选择Reset选项的时候也会触发该方法。
所以建议函数命名不要使用Reset

9:调用Unity3D菜单项

EditorApplication.ExecuteMenuItem(“GameObject/Create Other/Cube”);

2017-08-30 16:41:18 jxw167 阅读数 4062

以前做端游编辑器时,制作过曲线编辑器,现在使用Unity3D编程,Unity3D为我们提供了很多组件,但是在项目开发中,我们可能只需要某个小功能,但是要把整个组件加到项目中,一旦需求变换,修改起来比较麻烦,鉴于这些原因,我们自己手动做一个曲线编辑器利用Unity3D。曲线编辑器的主要功能包括:

1.创建自定义的编辑器

2.在Scene View窗口中绘制

3.可以在Scene View窗口中编辑

4.利用数学公式创建Bezier曲线

5.可以绘制曲线的移动方向

6.通过组合曲线构建Bezier和Spine曲线

7.支持镜像控制点

8.支持循环样条曲线

9.可以在曲线放置和移动物体

效果如下所示:



线的绘制

首先我们利用脚本定义两个向量 p0和p1:

using UnityEngine;

public class Line : MonoBehaviour {

	public Vector3 p0, p1;
}
在Unity编辑器中的效果如下所示:



接下来我们开始创建曲线编辑器,代码如下所示:

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(Line))]
public class LineInspector : Editor {
}

这个脚本不执行任何功能,需要我们在里面添加一个函数OnSceneGUI,这个函数是Unity自带的回调函数,定义如下所示:

	private void OnSceneGUI () {
		Line line = target as Line;

		Handles.color = Color.white;
		Handles.DrawLine(line.p0, line.p1);
	}


这样我们就能绘制一条直线了,效果如下所示:

   

我们现在看到的这条线,但是并不考虑其变换的设置, 移动,旋转和缩放。这是因为handle在世界空间中运行,而点位于线的局部空间, 我们必须明确地将这些点转换成世界空间点。这涉及到点变换:

	private void OnSceneGUI () {
		Line line = target as Line;
		Transform handleTransform = line.transform;
		Vector3 p0 = handleTransform.TransformPoint(line.p0);
		Vector3 p1 = handleTransform.TransformPoint(line.p1);

		Handles.color = Color.white;
		Handles.DrawLine(p0, p1);
	}




还有,除了显示线,我们还可以显示我们两点的位置handle。 为了做到这一点,我们也需要我们的转换旋转,所以我们可以正确对齐它们。

private void OnSceneGUI () {
		Line line = target as Line;
		Transform handleTransform = line.transform;
		Quaternion handleRotation = handleTransform.rotation;
		Vector3 p0 = handleTransform.TransformPoint(line.p0);
		Vector3 p1 = handleTransform.TransformPoint(line.p1);

		Handles.color = Color.white;
		Handles.DrawLine(p0, p1);
		Handles.DoPositionHandle(p0, handleRotation);
		Handles.DoPositionHandle(p1, handleRotation);
	}


继续介绍,虽然我们现在得到了handle,但它们不符合Unity的旋转旋转模式,我们可以使用Tools.pivotRotation来确定当前模式并相应地设置旋转。

Quaternion handleRotation = Tools.pivotRotation == PivotRotation.Local ?
			handleTransform.rotation : Quaternion.identity;





前者是局部旋转,后者是世界旋转。

    注意,由于句柄值在世界空间中,因此我们需要使用InverseTransformPoint方法将其转换回本地空间。 另外,当点改变时,我们只需要这样做, 我们可以使用EditorGUI.BeginChangeCheck和EditorGUI.EndChangeCheck。

		EditorGUI.BeginChangeCheck();
		p0 = Handles.DoPositionHandle(p0, handleRotation);
		if (EditorGUI.EndChangeCheck()) {
			line.p0 = handleTransform.InverseTransformPoint(p0);
		}
		EditorGUI.BeginChangeCheck();
		p1 = Handles.DoPositionHandle(p1, handleRotation);
		if (EditorGUI.EndChangeCheck()) {
			line.p1 = handleTransform.InverseTransformPoint(p1);
		}

最后,现在我们可以在场景中拖动我们的点!
还有两个需要注意的问题。 首先,我们无法撤消拖动操作。 这是通过在进行任何更改之前添加对Undo.RecordObject的调用来修复的。 其次,Unity不知道发生了改变,所以不要求用户在退出时保存, 这通过调用EditorUtility.SetDirty来解决。

		EditorGUI.BeginChangeCheck();
		p0 = Handles.DoPositionHandle(p0, handleRotation);
		if (EditorGUI.EndChangeCheck()) {
			Undo.RecordObject(line, "Move Point");
			EditorUtility.SetDirty(line);
			line.p0 = handleTransform.InverseTransformPoint(p0);
		}
		EditorGUI.BeginChangeCheck();
		p1 = Handles.DoPositionHandle(p1, handleRotation);
		if (EditorGUI.EndChangeCheck()) {
			Undo.RecordObject(line, "Move Point");
			EditorUtility.SetDirty(line);
			line.p1 = handleTransform.InverseTransformPoint(p1);
		}

代码下载地址:链接:http://pan.baidu.com/s/1gfrJVrl  密码:ft1o






没有更多推荐了,返回首页