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

扫一扫,访问微社区

开发者专栏

关注:2315

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

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

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

[士郎] UGUI 3D界面/Z轴位移 分批失效的处理方法

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

6832

主题

7356

帖子

2万

积分

Rank: 16

UID
1231
好友
185
蛮牛币
7394
威望
30
注册时间
2013-7-29
在线时间
3511 小时
最后登录
2018-9-26

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

发表于 2018-6-20 11:54:35 | 显示全部楼层 |阅读模式

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

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

x
现在的UI选型,虽然UGUI明显是优于NGUI的,但万一遇到了和未开源的C++部分相关的问题,就只能等待官方解决,开发者自己则毫无办法。

不过考虑到这种BUG无非和Unity引擎的BUG一样,因为自己改不了就不用,那那干脆就别用Unity了。考虑到UGUI带来的好处这种程度的限制是无所谓的,又不是不给解决。
不过像那些与其说是BUG,不如说是设计缺陷的地方就不好办了。目前发现的只有一处:
当组件Z轴不为0,旋转角不为90的整数倍的时候,组件的分批Bounds检测会失效。
(并不是不分批,而是分批时相当于所有组件都重叠在一起,会严格按照Hierarchy顺序渲染,这样会产生大量额外DrawCall)
1.jpg
组件被中间的Text分隔开了
将Text和Image分隔开后就能正确合批。
2.jpg
但这样父子级关系被基本废掉了,处理Cell尤其不便。简单界面尚可,复杂界面则是灾难——至少是不如NGUI的depth机制的。
这不仅仅会影响3D界面,还会影响到界面动画里的旋转效果。

因为其他地方都不能改,看上去也只能在材质上做文章了。
Shader部分简单增加一个属性,并且和vertex mul就好了。
3.jpg
其实除了加uniform属性外,还有个办法是将变换矩阵存入顶点数据内,但这样做会增加合批时的负担。考虑到旋转一般都是旋转整个界面,直接改材质会更好一点。
但因为UI的所有材质都是共享的,而不同的3D界面旋转方向不同,必须让不同界面使用不同的材质副本,所以必须在运行期间批量设置组件的material属性。
除了默认材质外,还可能有自定义材质。而自定义材质即使加上了“_TransformModifier”参数,复制也依然必须进行,这是为了避免影响到其他共享材质的组件。还需要用字典来避免重复复制材质。
[AppleScript] 纯文本查看 复制代码
foreach (Graphic g in graphics)
{
    Material curMat = g.material;
    if (curMat == g.defaultMaterial)
    {
        g.material = modifierMat;
    }
    else
    {
        Material m;
        customMatDict.TryGetValue(curMat, out m);
        if (m == null)
        {
            m = GameObject.Instantiate(curMat);
            customMatDict.Add(curMat, m);
        }
        g.material = m;
    }
}

处理材质只需要在开始的时候做一次,而后面可能对变换矩阵做多次修改。所以需要拆分到两个函数。
[AppleScript] 纯文本查看 复制代码
static readonly int propertyNameHash = Shader.PropertyToID("_TransformModifier");
public void Refresh()
{
      Matrix4x4 matrix = Matrix4x4.TRS(position, Quaternion.Euler(rotation), Vector3.one);
      if (modifierMat != null)
      {
           modifierMat .SetMatrix(propertyNameHash, matrix);
      }      
      foreach (var m in customMatDict)
      {
          if (m.Value != null)
              m.Value.SetMatrix(propertyNameHash, matrix);
      }
}

4.jpg
修改material属性虽然比较安全,但是如果你使用了Mask这类自身也需要复制材质的功能,实际显示用的材质会和material属性的材质不一样,这样在之后修改材质的变换矩阵就没用了。
要解决这个问题,就需要直接修改materialForRendering属性而非material。但materialForRendering获取时成本较高,一刀切并不合适,所以加了一个参数来控制。
5.jpg
(此外,RectMask2D由于不会复制材质,并没有上述问题。所以用RectMask2D来代替Mask是更好的办法)
6.jpg
然而这东西最后还有一个问题没解决:点击区域。
因为只是看上去旋转了,实际上Transform都还是原样,点击区域自然也没变。本来是想通过修改GraphicRaycaster解决的,看了看有点麻烦就先算了。
——本来我关心的也只是界面的3D动画。

创建一个只负责检测点击的空界面,然后直接3D旋转到同样角度倒也是可以凑合实现的。
源文件:
游客,如果您要查看本帖隐藏内容请回复
回复可见

知乎@flashyiyi


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

使用道具 举报

5熟悉之中
557/1000
排名
5668
昨日变化
5

0

主题

92

帖子

557

积分

Rank: 5Rank: 5

UID
151878
好友
0
蛮牛币
281
威望
0
注册时间
2016-6-13
在线时间
235 小时
最后登录
2018-9-25
发表于 2018-6-20 13:47:41 | 显示全部楼层
感谢分享。。。

回复

使用道具 举报

8常驻蛮牛
7422/10000
排名
239
昨日变化

0

主题

3862

帖子

7422

积分

Rank: 8Rank: 8

UID
3215
好友
0
蛮牛币
268
威望
0
注册时间
2013-9-4
在线时间
1628 小时
最后登录
2018-9-15
发表于 2018-6-20 20:29:03 | 显示全部楼层
顶顶顶顶顶ddddd多多多多

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1326/1500
排名
1748
昨日变化
8

0

主题

384

帖子

1326

积分

Rank: 6Rank: 6Rank: 6

UID
87577
好友
0
蛮牛币
4325
威望
0
注册时间
2015-3-31
在线时间
230 小时
最后登录
2018-9-26
发表于 2018-6-21 08:30:46 | 显示全部楼层
too good too strong!
[发帖际遇]: blastblade 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

7日久生情
4061/5000
排名
177
昨日变化
1

1

主题

410

帖子

4061

积分

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

UID
39981
好友
2
蛮牛币
7520
威望
0
注册时间
2014-8-15
在线时间
1530 小时
最后登录
2018-9-26

七夕浪漫情人

发表于 2018-6-21 08:56:18 | 显示全部楼层
66666666666666

回复

使用道具 举报

5熟悉之中
621/1000
排名
4954
昨日变化
34

0

主题

72

帖子

621

积分

Rank: 5Rank: 5

UID
108091
好友
0
蛮牛币
69
威望
0
注册时间
2015-6-14
在线时间
277 小时
最后登录
2018-9-26
发表于 2018-6-21 08:56:21 | 显示全部楼层
看看学习了
[发帖际遇]: miracle3200 捡了钱没交公 蛮牛币 降了 2 . 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
388/500
排名
6456
昨日变化
40

0

主题

117

帖子

388

积分

Rank: 4

UID
245227
好友
0
蛮牛币
462
威望
0
注册时间
2017-9-21
在线时间
75 小时
最后登录
2018-9-26
发表于 2018-6-21 09:00:39 | 显示全部楼层
{:104:}

回复

使用道具 举报

7日久生情
1851/5000
排名
1012
昨日变化
2

8

主题

164

帖子

1851

积分

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

UID
96706
好友
5
蛮牛币
1860
威望
0
注册时间
2015-4-30
在线时间
659 小时
最后登录
2018-9-26
发表于 2018-6-21 09:14:12 | 显示全部楼层
感谢分享..................

回复

使用道具 举报

3偶尔光临
284/300
排名
8918
昨日变化
1

1

主题

77

帖子

284

积分

Rank: 3Rank: 3Rank: 3

UID
256053
好友
1
蛮牛币
331
威望
0
注册时间
2017-11-24
在线时间
85 小时
最后登录
2018-9-21
发表于 2018-6-21 09:22:50 | 显示全部楼层
66666666666666

回复

使用道具 举报

5熟悉之中
838/1000
排名
5480
昨日变化
1

0

主题

433

帖子

838

积分

Rank: 5Rank: 5

UID
146677
好友
9
蛮牛币
2724
威望
0
注册时间
2016-4-25
在线时间
165 小时
最后登录
2018-9-19
QQ
发表于 2018-6-21 09:40:06 | 显示全部楼层
谢谢分享,支持一下,收藏了

回复 支持 反对

使用道具 举报

7日久生情
1610/5000
排名
1134
昨日变化
1

3

主题

203

帖子

1610

积分

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

UID
28521
好友
0
蛮牛币
6495
威望
0
注册时间
2014-6-6
在线时间
452 小时
最后登录
2018-8-30
发表于 2018-6-21 10:47:34 | 显示全部楼层
学习一下。。。

回复

使用道具 举报

3偶尔光临
152/300
排名
15404
昨日变化
8

6

主题

51

帖子

152

积分

Rank: 3Rank: 3Rank: 3

UID
285778
好友
0
蛮牛币
916
威望
0
注册时间
2018-6-14
在线时间
45 小时
最后登录
2018-8-14
发表于 2018-6-21 16:17:35 | 显示全部楼层

谢谢分享,支持一下,收藏了

回复 支持 反对

使用道具 举报

3偶尔光临
243/300

0

主题

206

帖子

243

积分

Rank: 3Rank: 3Rank: 3

UID
42245
好友
0
蛮牛币
254
威望
0
注册时间
2014-8-27
在线时间
38 小时
最后登录
2018-9-7
发表于 2018-6-21 17:40:53 | 显示全部楼层
Nice !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

回复

使用道具 举报

7日久生情
1912/5000
排名
4271
昨日变化
1

0

主题

1335

帖子

1912

积分

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

UID
267381
好友
5
蛮牛币
3200
威望
0
注册时间
2018-2-1
在线时间
257 小时
最后登录
2018-8-30
发表于 2018-6-22 08:08:22 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
2679/5000
排名
458
昨日变化
1

1

主题

320

帖子

2679

积分

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

UID
27816
好友
3
蛮牛币
8649
威望
0
注册时间
2014-6-3
在线时间
865 小时
最后登录
2018-9-26
发表于 2018-6-22 10:42:09 | 显示全部楼层
感谢分享

回复

使用道具 举报

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

本版积分规则

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