游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:792

当前位置:游戏蛮牛 技术专区 教程分享

查看: 561|回复: 11

[实例教程] 【Unity3D编辑器扩展】小技巧!右键菜单复制文件名

[复制链接]  [移动端链接]
5熟悉之中
841/1000
排名
3060
昨日变化
11

2

主题

76

帖子

841

积分

Rank: 5Rank: 5

UID
9302
好友
1
蛮牛币
1706
威望
0
注册时间
2013-12-1
在线时间
301 小时
最后登录
2018-11-17
发表于 2018-7-7 00:07:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 karsion 于 2018-7-11 08:48 编辑

其实这次要分享的内容实际只有8行代码!代码如下:
[C#] 纯文本查看 复制代码
        #region Project窗口
        [MenuItem("Assets/Copy Name")]
        private static void CopyName()
        {
            TextEditor te = new TextEditor();
            te.text = Selection.activeObject.name;
            te.OnFocus();
            te.Copy();
        }
        #endregion

效果图如下:
GIF.gif


下面是得到上面代码的过程(流下了技术的泪水):
起因是最近做项目,涉及到旧版的animation播放,代码中存在很多需要调用animationClip的地方。比如:
[C#] 纯文本查看 复制代码
        tank.animation.CrossFadeClampForever("变形_后翻变坦克").SetSpeed(0.7f);

关键是动作名字需要靠记忆,然后手打,动作多了就要鼠标点来点去有点受不了,得想想办法偷懒。
于是又每次到做了扩展的Inspector中复制(点击相依clip的GetName按钮):
AnimationInspector.png AnimationInspector2.png
用了3分钟还是觉得挺麻烦,因为多数情况还是在非运行时转到Project的fbx文件中,预览一下确认过眼神,才决定要使用这个动作!
想了想,如果在预览动作的时候可以给我复制到动作名就好了,那可能要扩展编辑器了,接着开始写自定义Clip编辑器:
[C#] 纯文本查看 复制代码
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(AnimationClip))]
internal class AnimationClipInspector : Editor
{
    public override void OnInspectorGUI()
    {
        if (GUILayout.Button(new GUIContent("Copy Name", "Copy the clip's name to the clipboard"), EditorStyles.miniButton, GUILayout.ExpandWidth(false)))
        {
            TextEditor te = new TextEditor();
            te.text = target.name;
            te.OnFocus();
            te.Copy();
        }

        base.OnInspectorGUI();
    }
}

AnimationClipEditor.png
很明显无解。
接近放弃的时候,突然想起可以用反射来得到指定的编辑器来刷界面(请参考雨松MOMO的http://www.manew.com/thread-49452-1-1.html),那么开始调代码:
[C#] 纯文本查看 复制代码
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(AnimationClip))]
internal class AnimationClipInspector : CustomCustomEditor
{
    internal AnimationClipInspector()
        : base("AnimationClipEditor")
    {
    }

    protected override void OnHeaderGUI()
    {
        bool flag = AssetPreview.IsLoadingAssetPreview(target.GetInstanceID());
        Texture2D texture2D = AssetPreview.GetAssetPreview(target);
        if (!texture2D)
        {
            if (flag)
            {
                Repaint();
            }

            texture2D = AssetPreview.GetMiniThumbnail(target);
        }

        GUI.DrawTexture(new Rect(6, 6, 32, 32), texture2D);
        GUILayout.BeginHorizontal();
        GUILayout.Space(40);
        GUILayout.BeginVertical();
        GUILayout.Label(target.name, EditorStyles.largeLabel);
        if (GUILayout.Button(new GUIContent("Copy Name", "Copy the clip's name to the clipboard"), EditorStyles.miniButton, GUILayout.ExpandWidth(false)))
        {
            TextEditor te = new TextEditor();
            te.text = target.name;
            te.OnFocus();
            te.Copy();
        }

        GUILayout.EndVertical();
        GUILayout.EndHorizontal();
    }

    //原来的编辑器是没有OnSceneGUI的,留空
    protected override void OnSceneGUI()
    {
    }
}

AnimationClipEditor2.png
OK!好像可以了!虽然有点丑陋,还是能用的。
原本以为这样就结束了,但万万没想到悲剧还是发生了,在模型的ImportSettings中报错!!
ImportSettings.png Error.png
于是去查源码,看到了ModelImporterClipEditor类中的这行代码
[C#] 纯文本查看 复制代码
this.m_AnimationClipEditor = (AnimationClipEditor)Editor.CreateEditor(previewAnimationClipForTake);

因为不可能强转为原来的AnimationClipEditor类,所以自定义编辑器是行不通了。
郁闷了一会,终于想起了Project的右键菜单。然后8行代码实现名字的复制!

回复

使用道具 举报

5熟悉之中
885/1000
排名
6010
昨日变化
41

0

主题

515

帖子

885

积分

Rank: 5Rank: 5

UID
254705
好友
1
蛮牛币
897
威望
0
注册时间
2017-11-16
在线时间
152 小时
最后登录
2018-11-16
发表于 2018-7-11 11:07:55 | 显示全部楼层
6666666666666666666666666666

回复 支持 反对

使用道具 举报

5熟悉之中
841/1000
排名
3060
昨日变化
11

2

主题

76

帖子

841

积分

Rank: 5Rank: 5

UID
9302
好友
1
蛮牛币
1706
威望
0
注册时间
2013-12-1
在线时间
301 小时
最后登录
2018-11-17
 楼主| 发表于 2018-7-11 14:37:40 | 显示全部楼层
15234084053 发表于 2018-7-11 11:07
6666666666666666666666666666

终于有人回复了,谢谢您!

回复 支持 反对

使用道具 举报

7日久生情
3364/5000
排名
1817
昨日变化
7

0

主题

2124

帖子

3364

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
1
蛮牛币
2511
威望
0
注册时间
2017-7-12
在线时间
534 小时
最后登录
2018-11-16

活力之星

发表于 2018-7-11 16:01:12 | 显示全部楼层
谢谢分享

回复

使用道具 举报

排名
214
昨日变化

37

主题

882

帖子

4492

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
6108
好友
17
蛮牛币
4941
威望
0
注册时间
2013-10-22
在线时间
1421 小时
最后登录
2018-11-16

社区QQ达人七夕浪漫情人

QQ
发表于 2018-7-11 16:28:43 | 显示全部楼层
你的积分不错

回复

使用道具 举报

5熟悉之中
841/1000
排名
3060
昨日变化
11

2

主题

76

帖子

841

积分

Rank: 5Rank: 5

UID
9302
好友
1
蛮牛币
1706
威望
0
注册时间
2013-12-1
在线时间
301 小时
最后登录
2018-11-17
 楼主| 发表于 2018-7-12 09:05:20 | 显示全部楼层

谢谢支持

回复 支持 反对

使用道具 举报

7日久生情
3452/5000
排名
2186
昨日变化
8

0

主题

2460

帖子

3452

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185339
好友
1
蛮牛币
4472
威望
0
注册时间
2016-11-20
在线时间
380 小时
最后登录
2018-11-16
发表于 2018-7-13 09:32:02 | 显示全部楼层

回复

使用道具 举报

7日久生情
2220/5000
排名
2710
昨日变化
9

1

主题

1427

帖子

2220

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
119154
好友
0
蛮牛币
2419
威望
0
注册时间
2015-8-21
在线时间
280 小时
最后登录
2018-11-16
发表于 2018-7-13 10:18:29 | 显示全部楼层
谢谢楼主大大,太喜欢了。

回复 支持 反对

使用道具 举报

5熟悉之中
841/1000
排名
3060
昨日变化
11

2

主题

76

帖子

841

积分

Rank: 5Rank: 5

UID
9302
好友
1
蛮牛币
1706
威望
0
注册时间
2013-12-1
在线时间
301 小时
最后登录
2018-11-17
 楼主| 发表于 2018-7-13 14:22:42 | 显示全部楼层
boy840102 发表于 2018-7-13 10:18
谢谢楼主大大,太喜欢了。

您别客气,哈哈哈

回复 支持 反对

使用道具 举报

排名
5669
昨日变化
3

12

主题

82

帖子

700

积分

Rank: 9Rank: 9Rank: 9

UID
215257
好友
4
蛮牛币
1670
威望
0
注册时间
2017-3-29
在线时间
332 小时
最后登录
2018-11-15
发表于 2018-7-13 14:41:33 | 显示全部楼层
以前想到过,不过没这需求就没去实践,原来这样可以直接复制到剪贴板的呀
改成
[C#] 纯文本查看 复制代码
 [MenuItem("Assets/Copy Name %c")]
    private static void CopyName()
    {
        TextEditor te = new TextEditor
        {
            text = Selection.activeObject.name
        };
        te.OnFocus();
        te.Copy();

    }

会不会更好,只是不知道会不会快捷键冲突。
又想起同事把我写的工具的快捷键改成Ctrl + A了

回复 支持 反对

使用道具 举报

5熟悉之中
841/1000
排名
3060
昨日变化
11

2

主题

76

帖子

841

积分

Rank: 5Rank: 5

UID
9302
好友
1
蛮牛币
1706
威望
0
注册时间
2013-12-1
在线时间
301 小时
最后登录
2018-11-17
 楼主| 发表于 2018-7-13 17:21:25 | 显示全部楼层
m2675 发表于 2018-7-13 14:41
以前想到过,不过没这需求就没去实践,原来这样可以直接复制到剪贴板的呀
改成 [mw_shl_code=csharp,true]  ...

哈哈哈,都可以,我不经常用,所以不弄热键

回复 支持 反对

使用道具 举报

5熟悉之中
885/1000
排名
6010
昨日变化
41

0

主题

515

帖子

885

积分

Rank: 5Rank: 5

UID
254705
好友
1
蛮牛币
897
威望
0
注册时间
2017-11-16
在线时间
152 小时
最后登录
2018-11-16
发表于 2018-8-1 16:20:18 | 显示全部楼层
karsion 发表于 2018-7-11 14:37
终于有人回复了,谢谢您!

谢谢分享!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

站长推荐 上一条 /1 下一条

快速回复 返回顶部 返回列表