Unity基础(23)-UGUI

Unity基础(23)-UGUI,第1张

控件是UGUI内置的,控件上面因因包含不同的组件而不同。

关于按钮的事件统一管理方法

小练习:写个小框架滑动菜单

在实际使用UGUI开发的过程中发现一个UGUI的BUG:当Content下的子物体增加时,ScrollBar下的Handle滑条大小没有实时根据发生Content下的子物体数量发生变化。(在Hierarchy面板中右键创建UI->ScrollView,在子物体中找到Content,需要按行列布置的游戏物体都作为Content的子物体挂在Content下)(以开发垂直的ScrollView为例)在查找问题的过程中发现:我的这个项目里Content的高小于遮罩层Viewport的的高,致使ScrollBar滑条的size一直为1的状态。调整Content的高使高大于遮罩层Viewport的的高后又发现如下问题:在编辑模式下ScrollBar滑条的size只根据Content与遮罩层Viewport的大小比例进行了调整,而不是根据Content的子物体数量进行变换,致使了在Content下添加的子物体的总高大于Content设置的高时下拉滑条并不能全部显示的问题,并且在游戏运行时ScrollBar的Size又重新变回1了,无论怎么调整参数都无济于事。于是自己写了一个脚本,根据Content下的子物体的个数来控制Content的宽高(原理是修改RectTransform的sizedelta)

我们在Unity创建一个Canvas游戏对象,会默认添加Canvas,CanvasScaler,GraphicRaycaster这三个组件,下面会详细介绍一下各个组件的作用。

Canvas 组件是UI布局和渲染的抽象空间,所有的UI都必须在此元素之下(子物件),简单来说 Canvas 就是渲染 UI 的组件。

UI渲染的方式(Render Mode),有以下三种

GraphicRaycaster会观察 Canvas下所有图形,并检测是否被击中,射线检测其实就是指定位置与方向后,投射一条隐形线并判断是否有碰撞体在线上,用于判断是否点选到UI上。

举例:如果画面上有一个 Button 与 Cube 位置故意重叠,现在点击重叠之处会发现 Button 还是会被触发。

Blocked Objects 设定为 Three D,再次点选重叠区域,会发现 Cube 会阻碍射线检测,此时按钮不会有反应

Canvas Scaler是Unity UI系统中,控制UI元素大小和像素密度的组件,Canvas Scaler的缩放比例影响Canvas下的元素,包含字体大小和图像边界。

可以看出,Canvas Scaler 通过设置Canvas下的Scale Factor,缩放所有在此Canvas下的元素

Canvas Size 始终等于 Screen Size,通过Scale Factor直接缩放所有UI元素

介绍Reference Pixels Per Unit之前需要先介绍图片设置中的Pixels Per Unit(表示一张Sprite,在世界坐标中一单位由几个Pixel组成)

这里使用的测试图片为原始尺寸100*100 的图片

由此可以推导出公式: Sprite 在世界坐标中大小 = 原图大小(Pixels) / Pixels Per Unit

让我们回到 Reference Pixels Per Unit,官方解释是,如果图片有设置Pixels Per Unit,则会将Sprite 的 1 pixel 转换成 UI 中的 1 pixel,下面将以Image源码说明:

可以看出 Image 通过过 spritePixelsPerUnit / referencePixelsPerUnit 方式算出新的 pixelsPerUnit

在设定 Image 图片大小时,是把 Sprite宽高 / pixelsPerUnit

由此可以推导出公式: UI大小 = 原图大小(Pixels) / (Pixels Per Unit / Reference Pixels Per Unit)

或者 UI大小 = Sprite 在世界坐标中大小 * Reference Pixels Per Unit

通过设定的Reference Resolution(预设屏幕大小)来缩放

分别对ScaleFactor Width、Height取对数后,再进行平均混合,那为什麽不直接使用Match对Width、Height进行混合呢???让我们来比较一下

完整源码算法:

通过硬体设备的Dpi(Dots Per Inch 每英吋点数),进行缩放

      unity3d第一个项目已经算是完成了,从cocos引擎转过来也有一段时间了,下面列出一些在使用中遇到的坑或者unity3d与cocos2d差异比较大的地方。适合其他引擎转U3D或者纯新手小白,万一有路过的大神请 踩了我这朵野花 指出错误,好好学习天天向上。游戏主要是2D界面,搭配live2d伪3D效果。 我也想做纯3D的可是没有钱啊。

一 .版本以及部分插件工具

     (1).unity_5.3.5p6

     (2).UGUI

     (3).DoTween

     (4).SceneManager

     (5).live2d

     (6). playerMakerAnti-Cheat (都已弃用)

二.经验总结

    (1).分辨率适配

         1.使用UGUI Canvas  Render Mode :Screen space-Camera 绑定摄像机,摄像机采用正交 Orthographic Canvas Scaler:UI Scale Mode 采用 Scale With Screen Size Reference Resolution 使用640*960分辨率, Screen Match  Mode:expand.

         2.部分背景设为1136*1136 在iphone5,6上依然会有白边,目前解决方案是背景设为1138*1138。

         3.建议美术CG与背景出图大小为,1024*1024(不重要的背景可512*512通过拉伸显示)。

     (2).资源相关及优化

         1.图片尽量使用尺寸为2的次幂 32*32,64*64 到 2048*2048,format 采用 compressed 压缩,个别尺寸不好做处理资源又大,可以采用16bit,采用这一方法美术需少使用渐变色,否则图片会严重色块化。

        2. 图片也可直接导入PSD(相当于图集),texture Type 使用Sprite(2D and UI)SpriteMode 使用Multiple, 然后使用 Sprite  Editor自动切割,适用某个界面一堆小图。缺点是每次替换PSD需重新切割,改动有可能会使之前自动切割的被重新命名。

        3.图片参数需把Generate Mip Maps 选项勾掉,可减少一定大小,这个选项的功能是在3D游戏中视野远近影响物体模糊。

        4.字体可使用ttf,不需要美术单一出atlas, text控件也支持富文本、描边、阴影等。

        5.plist不再可用,策划需提供TEXT文本或JSON等。

        6.音频文件支持.AIFF  .WAV  .MP3 .OGG 。

           视屏文件支持.MOV  .MPG  .MPEG .MP4  .AVI  .ASF。

        7.修改stripping level,通过库剖离来减少DLL的空间大小。

   (3).UGUI、脚本、其他控件相关

         1.一个场景尽量使用一个canvas,需显示不同层级可使用多个摄像机,不同摄像机culling mask不同layer,通过修改摄像机Depth来控制层级关系。

         2. live2d比较特殊,如果需要将其他控件置于它的上面,除了用单一摄像机照射外,还需改变Live2d的Z轴与它摄像机Clipping Planes的Far参数。

         3.需要做屏蔽层,只需创建一个panel 即可,改变它的层级即可屏蔽下方的点击与触摸。

         4.如果在一个button上添加image等其他控件,其他控件的范围大小也会影响到按钮的点击区域。

         5.支持帧动画,只需全部选中图片拖入Hierarchy即可生成。

         6.U3D粒子系统不支持particle Designer等粒子生成插件,但源生的功能更强,可实现预加热功能。

         7.动画建议使用自带的animator控件,也可以使用ITween,DoTween,HotTween等一些插件来实现简单的位移变形等。

         8.如果使用tween类插件,建议使用DoTween,更加类似cocos写法,性能优化等比较好,(NGUI自带itween)。

         9.注意所有的tween类插件均不支持image sprite单个透明度的变化,只能修改材质透明度,而所有的UGUI image控件共用同一材质,除非每个image单独添加材质。也可通过单独手写脚本来控制透明度变化,需要在update里计算,比较繁琐。

         10.脚本中一般使用的update有 Update 与FixedUpdate等,update 跟当前帧数相关,fixedUpdate则是物理时间,所以一些物理逻辑要放入FixedUpdate进行。

         11.想在场景切换后还保持某个GameObject存在使用方法 DontDestroyOnLoad(transform.gameObject);

         12.把一些模型投影到ui上可以用RenderTexture,也可用这个创建小地图、镜相、动态阴影等效果。注意rendertexture消耗比较大。

         13.unity 5.0后增加了AudioMixer混音器,可以把所有audioSource输出放入同一音轨,通过这个实现全局音乐开关和音效开关。

         14.游戏暂停可使用 Time.timeScale = 0。

         15.使用u3d自带animator编辑动画,动画结束后可添加回调、动画可倒播。通过状态机可完成比较复杂的动画模块,特定情况下的动画需要与脚本同时控制。

         16.3D物理碰撞同样使用于2D,GameObjecr上需添加刚体控件。

         17.粒子贴图与cocos相似,尺寸大小最好小于64*64。

     (4)多语言

         1.简体版与繁体版,通过修改text所挂的ttf来实现,文字尽量在unity里输入,减少贴图上文字的数量,这样只需改变ttf即可实现简体繁体的切换。

         2.英文版等共存,unity内需要输入的文字全部写在text里,需要写脚本通过key value来读取每个text显示的内容。

         3.一些界面图片上的文字不好通过UNTIY输入来替换的(比如IAP礼包等界面),可创建多个不同的prefab,进入场景时候通过区分

语言环境来调用。

     (5)与IOS Android 交互

          1.多语言 通过Application.systemLanguage区分当前设备语言环境。注意:ios9以后Unity通过Application.systemLanguage返回的简体中文和繁体中文都是SystemLanguage.Chinese,所以需要在ios 上返回当前语言参数给unity。

         2.ios上显示插屏等会应为Unity 的rootViewController时长改变而造成奔溃或者不显示,需要在调用第三方SDKd出时候添加

UnityAppController *appController = (UnityAppController *)[UIApplication sharedApplication].delegate

         3.Andoird 需要在点击购买后d出屏蔽层,否则点击过快或造成传入的参数改变。提供去除屏蔽的回调,java层在购买和失败后调用。

         4.iap与兑换码最好写成单例,某些Android渠道要求在一开始调用IAP回调,回复购买只在IOS与google版本中显示,需留好接口在不同渠道中开启或关闭。

         5.unity使用ARC,ios某些广告低版本SDK未使用,需要在这些广告类中单独添加参数 -fobjc-arc。

三.遗留问题

     1.shader等使用不熟练。

     2.过场采用sceneManager插件,用GUI实现,如使用UGUI animator如何实现。

     3.所有按钮点击放大等效果公用一个animator,再触摸屏幕其他区域有可能会使其他按钮响应放大效果。

     4.Android下手机如果有系统提示或来电,在进入游戏内游戏声音丢失,需重启游戏。

     5.scorllview背包等因为包含物品数量较少没有使用动态池。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11252140.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存