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

扫一扫,访问微社区

开发者专栏

关注:2236

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 945|回复: 10

[士郎] 扩展Unity模型编辑器

[复制链接]  [移动端链接]
排名
3
昨日变化

6471

主题

6989

帖子

2万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
2704
威望
30
注册时间
2013-7-29
在线时间
3318 小时
最后登录
2018-6-22

社区QQ达人活力之星原创精华达人突出贡献奖财富之证游戏蛮牛QQ群会员蛮牛妹VIP

发表于 2018-6-8 09:58:58 | 显示全部楼层 |阅读模式

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

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

x
最近来回使用Unity/UE两个引擎,发现有个可视化UV/Normal的小功能不错,花了一晚上在Unity 5.6里面山寨了下
1.jpg

2.jpg





要实现这个功能,首先需要自定义Mesh的Inspector。这里我参考了Unity3D研究院编辑器之不影响原有布局拓展Inspector(二十四),在引擎原有ModelInspector基础上进行扩展:

[AppleScript] 纯文本查看 复制代码
class SGModelInspector : DecoratorEditor[/color][/size][/font][/align][/align][font=微软雅黑][size=3]
[/size][/font][align=left][font=微软雅黑][size=3][color=rgb(26, 26, 26)]{[/color][/size][/font][/align][font=微软雅黑][size=3]
[/size][/font][align=left][font=微软雅黑][size=3][color=rgb(26, 26, 26)]public SGModelInspector(): base("UnityEditor.ModelInspector")[/color][/size][/font][/align][font=微软雅黑][size=3]
[/size][/font][align=left][font=微软雅黑][size=3][color=rgb(26, 26, 26)]{[/color][/size][/font][/align][font=微软雅黑][size=3]
[/size][/font][align=left][font=微软雅黑][size=3][color=rgb(26, 26, 26)]}[/color][/size][/font][/align][font=微软雅黑][size=3]
[/size][/font][align=left][size=3][font=微软雅黑][color=#1a1a1a]
[/color][/font][/size][/align][font=微软雅黑][size=3]
[color=#1a1a1a][align=left]public override void OnInspectorGUI ()[/align]
[/color][color=#1a1a1a][align=left]{[/align]
[/color][color=#1a1a1a][align=left]// TODO: Draw Buttons[/align]
[/color][color=#1a1a1a][align=left]}[/align]
[/color]
[color=#1a1a1a][align=left]public override void OnPreviewGUI (Rect r, GUIStyle background)[/align]
[/color][color=#1a1a1a][align=left]{[/align]
[/color][color=#1a1a1a][align=left]// TODO: Draw Mesh[/align]
[/color][color=#1a1a1a][align=left]}[/align]
[/color][color=#1a1a1a][align=left]}[/align]
[/color][align=left][color=#1a1a1a]

这儿使用DecoratorEditor的思路很简单: 利用反射新建一个ModelInspector的实例,然后所有方法实现是调用这个instance对应接口。不过原版代码有点问题——OnInspectorGUI确实能被调用到,而OnPreviewGUI始终不会被调用到。这时候只能掏出Decompiled Unity查一下Editor.cs里是怎么做的:

[AppleScript] 纯文本查看 复制代码
public virtual void DrawPreview(Rect previewArea
{
   ObjectPreview.DrawPreview(this, previewArea, this.targets);
}

public virtual void OnInteractivePreviewGUI(Rect r, GUIStyle background)
{
   this.OnPreviewGUI(r, background);
}




也就是说在绘制预览的时候,ModelInspector实例是直接调用了自己的方法,那么就在对应的地方调用SGModelInspector就行了。

[AppleScript] 纯文本查看 复制代码
static MethodInfo ObjectPreviewDrawPreview = typeof(ObjectPreview).GetMethod("DrawPreview", BindingFlags.Static | BindingFlags.NonPublic);

public override sealed void DrawPreview (Rect previewArea)
{
   ObjectPreviewDrawPreview.Invoke(null, new object[]{this, previewArea, this.targets});
}

public override sealed void OnInteractivePreviewGUI (Rect r, GUIStyle background)
{
   this.OnPreviewGUI(r, background);
}


搞定这个之后就可以开始动手折腾显示。

ModelInspector
接下来要解决的是模型究竟是怎么绘制的…看了下ModelInspector的核心函数,发现其实最后是调用的PreviewRenderUtility.DrawMesh,还能带材质球来着。


[AppleScript] 纯文本查看 复制代码
this.m_PreviewUtility.BeginPreview(r, background);
this.DoRenderPreview();
this.m_PreviewUtility.EndAndDrawPreview(r);

所以问题最后就转化成如何用Shader画Normal和UV。


Shader可视化顶点信息Visualize UV


可视化UV这个太简单了,在线框模式下一句话解决
[AppleScript] 纯文本查看 复制代码
v2f vert(appdata v)
{
   v2f o;
   o.vertex = float4((v.uv.xy - 0.5) * 2, 1, 1);
   return o;
}



Visualize Normal
可视化Normal麻烦一些,一开始考虑过根据Mesh的normal来手动DrawLine或者生成一个新的Mesh,但是这样不够好玩。所以折腾了下Geometry Shader,也是在线框模式下刷LineStream就行了。


最后测试兼容性的时候发现两个小问题:
  • OSX Editor下禁用Metal Support
  • 平台下关掉Graphics Emulation

知乎@钱康来




跟我念“站长妹纸萌萌哒!”我说站长,你说YO!爱你们么么哒~
回复

使用道具 举报

排名
28906
昨日变化
35

0

主题

56

帖子

98

积分

Rank: 2Rank: 2

UID
128268
好友
0
蛮牛币
72
威望
0
注册时间
2015-11-8
在线时间
32 小时
最后登录
2018-6-8
发表于 2018-6-8 10:17:10 | 显示全部楼层
感谢大佬分享~~~
[发帖际遇]: yeshengwu 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
2926/5000
排名
2631
昨日变化
14

0

主题

2024

帖子

2926

积分

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

UID
219676
好友
0
蛮牛币
2454
威望
0
注册时间
2017-7-12
在线时间
412 小时
最后登录
2018-6-24

活力之星

发表于 2018-6-8 10:41:05 | 显示全部楼层
谢谢分享

回复

使用道具 举报

排名
32090
昨日变化
33

0

主题

24

帖子

37

积分

Rank: 1

UID
284877
好友
0
蛮牛币
30
威望
0
注册时间
2018-6-8
在线时间
5 小时
最后登录
2018-6-13
发表于 2018-6-8 11:30:06 | 显示全部楼层
谢谢分享

回复

使用道具 举报

排名
15610
昨日变化
398

0

主题

13

帖子

75

积分

Rank: 2Rank: 2

UID
284153
好友
0
蛮牛币
149
威望
0
注册时间
2018-6-4
在线时间
22 小时
最后登录
2018-6-24
发表于 2018-6-8 12:30:04 | 显示全部楼层

回复

使用道具 举报

6蛮牛粉丝
1333/1500
排名
3430
昨日变化
2

5

主题

595

帖子

1333

积分

Rank: 6Rank: 6Rank: 6

UID
239879
好友
1
蛮牛币
2175
威望
0
注册时间
2017-8-26
在线时间
349 小时
最后登录
2018-6-22
发表于 2018-6-8 13:53:02 | 显示全部楼层

回复

使用道具 举报

排名
20392
昨日变化
2

0

主题

8

帖子

38

积分

Rank: 1

UID
249404
好友
0
蛮牛币
184
威望
0
注册时间
2017-10-18
在线时间
8 小时
最后登录
2018-6-20
发表于 2018-6-8 14:15:34 | 显示全部楼层
666666666666666666666669

回复 支持 反对

使用道具 举报

4四处流浪
308/500
排名
13559
昨日变化
2

2

主题

189

帖子

308

积分

Rank: 4

UID
282383
好友
0
蛮牛币
240
威望
0
注册时间
2018-5-23
在线时间
63 小时
最后登录
2018-6-22
发表于 2018-6-8 20:48:40 | 显示全部楼层
多谢分享, !!!

回复

使用道具 举报

6蛮牛粉丝
1392/1500
排名
1013
昨日变化
4

15

主题

70

帖子

1392

积分

Rank: 6Rank: 6Rank: 6

UID
165566
好友
0
蛮牛币
2638
威望
0
注册时间
2016-10-8
在线时间
331 小时
最后登录
2018-6-24
发表于 2018-6-10 07:48:22 | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
1500/5000
排名
3470
昨日变化
25

3

主题

843

帖子

1500

积分

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

UID
246489
好友
0
蛮牛币
2510
威望
0
注册时间
2017-9-28
在线时间
276 小时
最后登录
2018-6-24

活力之星迈向小康

发表于 2018-6-10 13:03:06 | 显示全部楼层
谢谢分享

回复

使用道具 举报

排名
16012
昨日变化
4

0

主题

18

帖子

97

积分

Rank: 2Rank: 2

UID
76081
好友
0
蛮牛币
9
威望
0
注册时间
2015-2-27
在线时间
42 小时
最后登录
2018-6-20
发表于 2018-6-10 21:08:07 | 显示全部楼层
有趣的案例~

回复

使用道具 举报

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

本版积分规则

关闭

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

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