Ⅰ Unity怎么用UGUI制作图表,柱状图,饼图
XCharts纯源码绘制、可高度定制的UGUI绘图插件;支持折线图,柱形图,饼图,雷达图等。
Ⅱ 如何使用vs2012单步调试uGUI
使用自己编译的uGUI
1.首选下载uGUI代码,如何下载参考相关文档。
2.使用vs2012打开解决方案UISystem.sln,看到三个工程。
UnityEditor.UI工程:生成Edtior/UnityEditor.UI.dll,主要是包含各UGUI控件在Editor的Inspector功能。
UnityEngine.UI工程:生成Standalone/UnityEngine.UI.dll,主要是UGUI在发布包中使用的功能。
UnityEngine.UI-Editor工程:生成UnityEngine.UI.dll,主要是UGUI在编辑器中使用的功能。
3.修改DLL输出路径
UnityEditor.UI工程输出路径:d:
UnityEngine.UI工程输出路径:d:
UnityEngine.UI-Editor工程输出路径:d:
到这步按F7就可以把uGUI代码编译出的dll给unity使用。
uGUI单步调试
1.使用工具pdb2mdb.exe生成mdb文件
不过在Unity中还是无法调试到uGUI的源代码中,因为刚刚编译出来的调试信息文件是pdb,而mono的调试信息文件是mdb。因此我们需要用pdb2mdb工具将它进行。转工具:d:.5pdb2mdb.exe
把CMD工作目录转到d:。然后开始转换。
但还是报错了:
未经处理的异常:System.IO.FileNotFoundException:未能加载文件或程序集“Mono.Cec
il,Version=0.9.5.0,Culture=neutral,PublicKeyToken=0738eb9f132ed756”或它的某
一个依赖项。系统找不到指定的文件。
在Pdb2Mdb.Driver.Main(String[]args)
解决方法:
下一个新的pdb2mdb.exe工具
https://gist.github.com/jbevain/ba23149da8369e4a966f
终于成功了:
可以看到目录d:下生成了UnityEngine.UI.dll.mdb文件。
2.开始单步调试:
A.下好断点。
B.运行Unity3D测试例子。
C.把dll附加到unity中去
4.做相应操作触发断点。(我这里是点击测试例子的按钮)
Ⅲ unity3d ngui uibutton 可带参数吗
最近写的游戏中UI部分用的NGUI,感觉NGUI真心没UGUI好用啊,功能封装的不全,想要什么功能还得去翻源码。比如PopList加滑动。。。
今天说说UIButton的点击事件,最简单的拖动就不说了,功能很鸡肋,一是不好维护,而是很多情况下我们要动态生成一些button并且对这些button回调,NGUI中封装了一个EventDelegate类用来添加回调函数,再把很多个EventDelegate封装成一个List委托链实现一对多的观察者模式。所以如果我们想让UIButton带参传递,关键是如何向EventDelegate中封装参数。
我们先看看EventDelegate的执行方法,核心代码就一句:
mMethod.Invoke(mTarget, mArgs);
显然我们在实例化EventDelegate时,至少给他一个方法名,让他的mMethod可以通过反射找到方法,至少给他一个类实例,让他知道执行哪个实例中的方法,mTarget在声明时规定MonoBehavior类型,显然我们还要给他一个组件实例,正好对应我们想要接受回调函数的那个实例。而第二个参数mArgs正是我们需要的回调参数,那我们再看看EventDelegate中是否有参数传递的相关属性或者方法。
幸运的是EventDelegate类中封装了参数类,类似通知模式通过强转Object可以传递各种类型的参数。
Ⅳ ugui怎么获取到当前拖拽事件的对象发
这个draggable插件确实没用过,你应该多查查文档、API啥的,应该都有提供一些参数、返回值什么的,甚至可以读读它的源码
至于e.target,你可以理解为"当前对象",当前操作的对象,比如现在有个叫做btn1的input[type=button],你点击这个按钮,这时候e.target就是这个button
Ⅳ unity editorscencemanager 怎么使用
总的来说,unity没有啥天坑。只要肯研究,后期都能改进,也都不会影响到上线。
小坑太多,说不完。unity上手容易坑太多,基本事件机制,生存周期,场景和资源管理,mono虚拟机的gc机制都是坑。
要说的话,真正影响到架构的是(排序)
1. 是否要用lua
2. (对于需操作的游戏)客户端游戏如何做战斗验证
-----------------------------------------------------
公司的话,推荐:
参加Unity年会
购买Unity的官方支持问答平台,人有源代码,还能找总部
-----------------------------------------------------
下面列举小坑吧。不建议都绕开,毕竟没有那么多时间做前期调研的。
对应版本Unity4.x
1. 客户端程序层面
总的来说C#超级给力的,不过别玩脱了
1) mono虚拟机gc
Unity的mono虚拟机使用不分代的gc算法,临时对象积攒起来,导致重量级GC游戏频繁卡顿。
Unity官方:认真review每帧20B以上,以及一次2K以上的GC Alloc的行为。传闻:Unity5会改进。
推荐阅读:
Gamasutra: Wendelin Reich's Blog
评价:请像C++一样精确了解各种行为的gc,foreach 都不要随便用。严重,但游戏是可以卡巴卡巴上线的。后期一位核心开发人员修2~3周。
2) 苹果aot编译问题:模板问题
mono在苹果上采用aot将C#编译为静态代码。首先,依赖于动态代码生成的复杂模板容易运行时崩溃;其次,mono会将客户端生成一个库。模板代码实例化容易膨胀导致该库超过40M而无法链接。
实战:碰到了改写法吧。不过我本人是静态类型检查派的。
3) 少用coroutine
yield只支持try--finally,与异常体系兼容性极差;难以提供返回值;异步本身是非线性的,很难保证逻辑完备
实战:复杂异步逻辑用状态机。不致命,多修bug也能抗过。
4) 自行处理配置数据序列化
严重影响配置读取速度。C#自带的xml序列化很慢,自带的二进制序列化也不够快。
实战:打包配置考虑protobuf或者代码生成器。中后期一周左右。
5) 反射
手机上jit情况下,第一次反射一个类很慢。乱用足够影响启动速度。
6) 本地化
如果公司习惯于做海外市场,一开始就可以考虑全套本地化方案。后期改需要一个人1~2个月工作量。
2 资源优化
Unity资源优化,一个靠谱的TA很重要。
1) 资源内存占用
512内存机器能用的资源大概只有50~60M。
需透彻研究贴图。考虑换皮怪资源复用、UI的图集合理化。
没有UI优化经验的话,强烈建议一个核心开发死跟,像抠代码优化一样优化图集总结经验。这个后期很难收场。
每个粒子发射器占用10K内存;有些项目在动画上会有内存问题。
2) 关注资源包大小
最大的是贴图和骨骼动画。贴图关注内存即可。骨骼动画可以占到模型的一半大小,重做的话有各种优化方案。但超标后期也很难收场。
3) 依赖打包
Unity4.x和Unity5完全不同。其中Unity4.x机制庞大繁杂容易错,要有心理准备。扯一些要点:
* 一定要搞清其内存占用和生存周期。要实测,特别容易跌眼镜。
* 每个API都有坑。我个人目前推荐压缩模式、LoadFromCache,此时不能拆太碎。战斗前预加载。
* shader加载慢,应当放入依赖包
* bundle不能重名
4) 场景、drawcall、camera
场景面多了考虑动态batching
不同材质透明物体(例如粒子)穿插可能引起drawcall暴增。
camera是重型对象,越少越好
5) svn
资源选Text模式、显式保存.meta,便于版本管理。资源分人或者锁了改,规避冲突。
3 Unity
和Flash一样容易学的3D编辑器
1 ) 事件机制
Unity事件机制很不好用。单个对象,Awake,Start,Enable调用时机相当复杂。Unity完全不保证多个对象的事件执行顺序,导致很多人绕开Start。不恰当的使用事件,很容易导致父子对象不在同一帧出现,画面不干净。
Destroy操作是延迟的,对象会活到帧的结尾,然后必定销毁。库级设计时,必须考虑到这一点(例如对象池/动画库)。
2) 资源管理
只说Unity4.x。合理做法是依赖很卡的UnloadUnusedAssets、LoadScene清理无引用资源(另注意前者是异步的),或者Bundle.Unload(true),这些方案各有限制。试图更细粒度手工清理的困难在于,并不存在系统性文档解释Unity资源的分类和生存周期,且Destroy操作很保守。例如,销毁mesh时,并不会销毁material、texture,更不会清理脚本资源。
此外,特定的普通操作会造成资源克隆。例如访问Renderer.meterial,Animation.AddClip。
4 NGUI
久经验证的掉链子王。新项目也可以尝尝uGUI
1) panel重绘
widget改变后,所在panel需要生成多边形,很慢,坑新人没商量,注意合理分panel。panel中多边形过多会爆(貌似是65535个顶点?)。
uGUI原理相同,就是c代码比C#快不少。
2) panel渲染顺序
搞清楚ui上放置3D物体咋办,ui如何和特效混合排序。
3) 策划/美术ui规范
潜规则很多。Anchor、动画不可作用于同一个物体。widget必须是panel的子节点,不然他就会自己造panel,经常搞出乱子。再加上上面的panel规则等,要策划美术折腾ui可费神了。
项目组自制UI编辑器自然是极好的,不过不一定必要。
4) 创建速度慢
由于序列化字段多,NGUI对象创建可导致卡顿。多状态对象不要靠隐藏-显示,而要动态创建。尤其是状态中包含粒子发生器/Animation,这俩还有内存问题(10K一个)。
5) 与Unity事件机制强耦合
与Unity的事件机制强耦合,不完备,容易有bug。例如,panel绘制依赖于LateUpdate。coroutine中同时关闭旧界面,创建新界面,此时当前帧 LateUpdate 已过,表现为有一帧画面为空白。
----------------------------------------------------------------------------------------
正文分割线
Q:回答Ye Deng在评论区的问题 “能详细说说使用 UnloadUnusedAssets()、LoadScene() 等等 APIs 的细节吗? 有没有替代方案 ”。
A: 需要区分 SceneMemory和Asset。Instantiate出的GameObject及其Component属于SceneMemory。贴图、Mesh、Shader、自定义Component代码、AnimationClip等,还有AssetBundle中的GameObject及其Component属于Asset。
Destroy仅删除SceneMemory对象,不删Asset。
UnloadUnusedAssets、LoadScene 检索代码堆(不检查栈),删除所有未引用的Asset。
AssetBundle.Unload(true) 删除bundle自有Asset。
DestroyImmediate 删除Asset
说一下UnloadUnusedAssets慢的原因。核心问题在于,Unity希望C#代码可以引用资源,而且能维持其资源生命周期。然后Unity决定每次UnloadUnusedAssets都去扫描所有C#对象!这个挺慢的。
从API看,下面是比较原汁原味Unity的模式,都避免了关卡中间UnloadUnusedAssets:
A. 静态关卡
关卡进入前加载所有资源,在关卡结束后一次性清理。特别的,Unity觉得你应该使用Scene,他的lightmap、navimesh都是与Scene绑定的。这种情况下,都不需要调用UnloadUnusedAssets()。优点是关卡非常流畅,但是关卡必须是有限大小,有限内容。
B. AssetBundle为单位管理动态资源
动态资源放到AssetBundle中,不再使用时,用Unload(true)彻底删除Asset。缺点是和A方案比起来加载可能会卡;此外不卸载的bundle本身,合到一起经常有10~30M的额外内存占用。
具体游戏,怪物、特效、UI、玩家用A还是B就是权衡问题了。
最后,如果觉得Unity不好,可以考虑全手动管理资源,能绕开一些限制,多榨一些性能。如果项目可以有一个人专门深度优化技术,可以考虑尝试,时间两个月起,也会引入不少bug。不少项目是主程做这事,也有让较厉害的程序做这的。
Ⅵ 如何快速优化手游性能问题
一、UGUI简介
UGUI是Unity官方推出的UI系统,集成了所见即所得的UI解决方案, 其功能丰富并且使用简单,同时其源代码也是开放的
相比于NGUI,UGUI有以下几个优点:
1. 所见即所得的编辑方式,在Scene窗口中即可编辑。
2. 智能的Sprite packer可以将图片按tag自动生成图集而无需人工维护,生成的图集合并方式比较合理,无冗余资源。
3. 渲染顺序与GameObject的Hierarchy顺序相关,靠近根节点显示在底层,而靠近叶子节点显示在顶层;这样的渲染方式使得调整UI的层级比较方便和直观。
4. RectTranForm及锚点系统更适合于2D平面布局,并且非常方便多分辨率屏幕自适配。
二、UI制作规范和指导方法
本文是关于UGUI优化的,或许你会觉得UI的制作规范及指导方法与优化无关,其实很多性能问题往往是资源的不合理使用造成的,比如使用了尺寸过大的图片、引用了过多的图集以及加载了不必要的资源等。如果从设计和制作UI一开始就遵守特定的规范,则可以规避不必要的性能开销。笔者根据参与的多个项目总结了以下几点通用的规范和指导方法(这些规范适用于所有项目,不管你使用UGUI还是NGUI)。
1.合理的分配图集
合理的分配图集可以降低drawcall和资源加载速度;具体细节如下:
同一个UI界面的图片尽可能放到一个图集中,这样可以尽可能的降低drawcall。
共用的图片放到一个或几共享的图集中,例如通用的弹框和按钮等;相同功能的图片放到一个图集中, 例如装备图标和英雄头像等;这样可以降低切换界面的加载速度。
不同格式的图片分别放到不同的图集中,例如透明(带Alpha)和不透明(不带Alpha)的图片,这样可以减少图片的存储空间和占用内存。(UGUI的sprite packer会自动处理这种情况)
2.resources目录中应该只保存prefab文件,其它非prefab文件(例如动画,贴图,材质等)应放到resource目录之外
Ⅶ 如何优化 canvas cpu占用
一、UGUI简介
UGUI是Unity官方推出的UI系统,集成了所见即所得的UI解决方案, 其功能丰富并且使用简单,同时其源代码也是开放的,下载地址:
相比于NGUI,UGUI有以下几个优点:
1. 所见即所得的编辑方式,在Scene窗口中即可编辑。
2. 智能的Sprite packer可以将图片按tag自动生成图集而无需人工维护,生成的图集合并方式比较合理,无冗余资源。
3. 渲染顺序与GameObject的Hierarchy顺序相关,靠近根节点显示在底层,而靠近叶子节点显示在顶层;这样的渲染方式使得调整UI的层级比较方便和直观。
4. RectTranForm及锚点系统更适合于2D平面布局,并且非常方便多分辨率屏幕自适配。
二、UI制作规范和指导方法
本文是关于UGUI优化的,或许你会觉得UI的制作规范及指导方法与优化无关,其实很多性能问题往往是资源的不合理使用造成的,比如使用了尺寸过大的图片、引用了过多的图集以及加载了不必要的资源等。如果从设计和制作UI一开始就遵守特定的规范,则可以规避不必要的性能开销。笔者根据参与的多个项目总结了以下几点通用的规范和指导方法(这些规范适用于所有项目,不管你使用UGUI还是NGUI)。
1.合理的分配图集
合理的分配图集可以降低drawcall和资源加载速度;具体细节如下:
同一个UI界面的图片尽可能放到一个图集中,这样可以尽可能的降低drawcall。
共用的图片放到一个或几共享的图集中,例如通用的弹框和按钮等;相同功能的图片放到一个图集中, 例如装备图标和英雄头像等;这样可以降低切换界面的加载速度。
不同格式的图片分别放到不同的图集中,例如透明(带Alpha)和不透明(不带Alpha)的图片,这样可以减少图片的存储空间和占用内存。(UGUI的sprite packer会自动处理这种情况)
2.resources目录中应该只保存prefab文件,其它非prefab文件(例如动画,贴图,材质等)应放到resource目录之外
因为随着项目的迭代,可能会导致部分资源(动画,贴图)等失效,如果这些文件放在resource目录下,在打包时,unity会将resource目录下文本全部打成一个大的AssetBundle包(非resouce目录下的文件只有在引用到时才会被打到包里),从而出现冗余,增加不必要的存储空间和内存占用。可以通过以下代码(Mac环境下)在控制台窗口中查看当前目录下所有非prefab资源的代码:find . -type f | egrep -v "(prefab|prefab.meta|meta)$"
例如在笔者的一次扫描中,发现在了如下结果:
3.关卡内的UI资源不要与外围系统UI资源混用
在关卡内,需要加载大量的角色及场景资源,内存比较吃紧,一般在进入关卡时,都会手动释放外围系统的资源,以便使关卡内有更多的内存可以使用。如果战斗内的UI与外围系统的UI使用相同图集里的图片,则有可能会使得外围系统的图片资源释放不成功。对于关卡内与外围共用的UI资源需要特殊处理,一般来说复制一份出来专门给关卡内使用是比较好的选择。
4.适当的降低图片的尺寸
有时UI系统的背景可能会使用全屏大小的图片,比如在Iphone上使用1136*640大小的图片;使用这样尺寸的图片代价是很昂贵的,可以和美术同学商量适当的降低图片的精度,使用更低尺寸的图片。
5.在android设备上使用etc格式的图片
目前,几乎所有android设备都支持etc1格式的图片,etc1的好处是第个像素点只战用0.5个字节而普通rgba32的图片每个像素点占4个字节,也就说一张1024*1024图片如果使用rgba32的格式所占用的内存为4M而etc1格式所占用的内存仅为0.5M。但是使用etc1格式的图片有两个限制——长和宽必须是POT的(2的N次方)并且不支持alpha通道,因此使用etc1时需要额外的一张图来存储alpha通道,并且使用特殊的shader来对alpha采样。具体的细节可参考:
6.删除不必要的UI节点、动画组件及资源
随着项目的迭代,可能有部分ui节点及动画已经失效,对于失效的节点及动画一定要删除,在很多项目中,有部分同学为了方便省事,只是将失效的节点及动画disable了。这样做虽然在运行时不会对cpu造成太多负担,但是在加载时会增加不必要的加载时间以及内存占用。对于废弃的UI图片资源,虽然未放到Resource目录最终不会打到包里,但是在Editor模式下仍然会打到图集中从而影响优化决策。笔者写了一个扫描未使用到UI贴图资源的工具,代码地址:;
另外,对于废弃的脚本,可能还会有某些对象持有对它的引用,而加载这样的对象也比较耗时,笔者也写了一个扫描废弃脚本的工具,代码地址:
三、CPU优化
一般来说,优化cpu性能应该先用profiler定位到性能热点,找到消耗最高的函数,然后再想办法降低它的消耗。经过笔者多次使用profiler对UGUI的分析来看,其CPU性能开销高主要原因之一是Canvs对UI网格的重建,有很多情况会触发Canvas对网格的重建,例如Image,Text等UI元素的Enable及UI元素的长、宽或Color属性的变化等。Canvas中UI Mesh顶点较多的话,则该项将会出现较高的CPU开销。在Unity的Profiler中则对应的是Canvas.SendWillRenderCanvases或Canvas.BuildBatch占用过多的时间。
Canvas.BuildBatch主要功能是合并Canvas节点下所有UI元素的网格,合并后的网格会缓存起来,只有其下面的UI元素的网格发生改变时才会重新合并。而UI元素的网络变化主要是因为Canvas.SendWillRenderCanvases调用时,rebuild了Layout或者craphic。该函数的调用过程时序图如下:
该过程由CanvasUpdateRegistry监听Canvas的WillRenderCanvases(上图中1)而执行,主要是对前标记为dirty的layout和craphic执行rebuild。引起layout和graphic的dirty主要原因是因为Canvas树形结构下的UI元素发生了变化(例如增加删除UI对象,UI元素的顶点,rec尺寸改变等)调用了Graphic.SetDirty(实际上最终都会调用CanvasUpdateRegistry.)。
在rebuild layout之前会对Layout rebuild queue中的元素依据它们在heiarchy中的层次深度进行排序(上图中的2),排列的结果是越靠近根的节点越会被优先处理。
rebuild layout(上图中的3),主要是执行ILayoutElement和ILayoutController接口中的方法来计算位置,Rect的大小等布局信息。
rebulid graphic(上图中的4),主要是调用UpdateGeometry重建网格的顶点数据(上图中5)以及调用UpdateMeterial更新CanvasRender的材质信息(上图中6)。
基于以上UGUI的网格更新原理,我们可以做以下优化:
a.使用尽可能少的UI元素;在制作UI时,一定要仔细查检UI层级,删除不不必要的UI元素,这样可以减少深度排序的时间(上图中的2)以及Rebuild的时间(上图中的3,4)。
b.减少Rebuild的频率,将动态UI元素(频繁改变例如顶点、alpha、坐标和大小等的元素)与静态UI元素分离出来,放到特定的Canvas中。
c.谨慎使用UI元素的enable与disable,因为它们会触发耗时较高的rebuild(图中的3、4),替代方案之一是enable和disableUI元素的canvasrender或者Canvas。
d.谨慎使用Text的Best Fit选项,虽然这个选项可以动态的调整字体大小以适应UI布局而不会超框,但其代价是很高的,Unity会为用到的该元素所用到的所有字号生成图元保存在atlas里,不但增加额外的生成时间,还会使得字体对应的atlas变大。
Ⅷ 游戏开发需要懂几种语言
游戏开发大致可以分为PC端游戏开发和移动端游戏开发,但不管怎样都离不开这三大语言,即Java、C语言和C++语言,用来的开发引擎主要就是Unity3D和Cocos,比较熟悉的还是unity.
Unity过去主要针对3D游戏开发的市场,目标是占领整个游戏开发团队。72%的以游戏开发类别为首要工作的参与者选择Unity作为他们的首选游戏开发工具。采用Unity目标定位于桌面平台的开发又占了一半,这可显然比均值高很多,此外还有一些其他的垂直功能,例如视觉结构,军事仿真和教育等Unity都迎合了设计者的需求。
编译原理之类的都需要学习;动画做工具),STL,而不是程序。这些只是属于基础知识,只有引擎并不是一个游戏,比如说一个网游里面有10个副本:
网络游戏里面有副本系统。
如果你单纯想知道游戏引擎相关的技术,线性代数,撤销,你说的操作系统,数据结构,有了引擎。
比如说你会需要了解3DSMAX Script(用来给美术,自动存盘,场景,里面怪物的模型,不过根据不同的游戏类型可以设计出各种不同的开发工具,等等之类的;粘贴NPC;动画,游戏本身事实上是数据驱动的,叫副本编辑器,统筹方法,目前的情况游戏程序员大部分的时间都是在做各种工具,设计模式,副本的关卡设置。
理论上讲戏编程开发包含的内容太广了,主要集中在对DX API的了解,设置关卡,而且有了工具,那么副本的制作就需要有一条制作流水线。
======================================
补充回答楼主的问题,游戏里面要实现20个不同的副本,等等之类的,则和工具没什么关系,很难做到完美的数据驱动,而工具则和具体的游戏类型相关的,我举这么个例子,另外需要自己学习的就是了解一下游戏开发中一般常用的一些方法和工具流水线,版本控制等等之类的,比较重要的还有线性代数;重做,而不是通过程序员写代码来实现的,这个工具本身和引擎无关。工具编写又牵扯到很多其他方面的编程技巧(和游戏本身无关的)比如说复制,编写makefile,物理,设计模式;美术可视化的在场景里面放置机关,里面可以让策划。那么基于以上的一些策划,图形学,这10个副本都是通过各种工具配置出来的,算法,因为引擎是更加通用的,等等,比方说副本的美术场景资源,我们就需要开发一个工具;软件信息,奖励系统,Office系列软件的COM接口(用来给策划做工具),还是需要制作。
Ⅸ 缺少CUGUIIrrlichtrenderer.dII 在哪下载
你好!
如果你需要的是CEGUIIrrlichtRenderer.dll
你以>CUGUIIrrlichtrenderer.dII>为搜索关键词>点>网络一下>前3个>点击进去都可以下载
如果不是你要找的,网络和谷歌上都没有你说的CUGUIIrrlichtrenderer.dII的下载地址,
你只能看看是哪个软件会用到它,重新安装一下试试,或者找个完整版重装一下,
Ⅹ 怎么让unity的play动画不全屏显示
什么是play动画?
你的意思是按下那个三角箭头以后不让它最大化显示Game视图吗?
如果是这样的话,把Maximize on Play点掉就好了。