unity

Unity3D 游戏性能优化笔记

二次信任 提交于 2020-02-12 20:58:07
一、程序方面 1、尽量少new对象,减少GC的次数,可以使用对象池技术。 2、使用UGUI时,不要通过界面的z轴来做界面排序,这貌似会导致UGUI的批处理失效。 3、尽量少使用GetComponent(),频繁调用的可以用一个变量在开始时把component存起来。 4、不使用OnGui() 5、尽量少实例化游戏对象,同1,可使用对象池技术。 6、要构建字符串时,尽量使用StringBuilder代替string的默认相加操作,减少产生临时字符串。 7、将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉。 二、渲染方面 1、尽量使用光照贴图,可以节省cpu性能,因为实时光照要一直计算,很耗费cpu性能。 2、尽量不使用mesh collider,因为mesh collider相比普通的collider包含大量顶点,计算量很大。 3、把多张小图打包成一张图集,减少draw call调用。 4、尽量使用共享材质,这样的话无论如何修改材质的属性,内存中都只会占用一份,但如果使用普通的材质,每次改动材质属性Unity都会new一个新的材质出来,并在这个材质上修改。这些材质会一直占用着内存,直到调用Resources.UnloadUnusedAssets()的时候才释放,会导致内存 泄露。 5、尽量少使用逐像素光,因为像素数远比顶点数要多,会很耗费性能。 6、使用LOD

unity面试的基础问题(1)

浪尽此生 提交于 2020-02-12 11:44:46
oop:面对对象 特点: 继承:构造函数(先创建父类再子类)析构函数(先销毁子类然后父类) 多态:父类的指针指向子类而调用子类的方法 封装:不被别的访问 装箱:将值变为引用类型 拆箱:将引用类型变为值类型 内存分类: 栈:先进后出 参数/new 值类型/申明变量 堆:new的引用类型分配在堆上 (还有ref和out结合起来可学习一下) 全局变量:static 静态 const 常量 代码区;编译的方法(基本用不着) 下面有个需要注意的小问题Button的事件最好在堆上开辟 进程 线程 协程的区别? 1,进程拥有自己独立的堆和栈。(既不共享堆,亦不共享栈,进程由操作系统调度) 2,线程拥有自己独立的栈和共享的堆。(共享堆,不共享栈,线程亦由操作系统调度(标准线程是的))(线程是在主线程里开辟的(和主线程不是并列关系,不能在同一时间启用同一资源)) 3,协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。(协程是在主线程里开辟的,不需要开锁) 一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行。 协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。 lock 一个方法锁(具体可细查

Unity 工具类 之 UnityWebRequest 常用功能封装

痞子三分冷 提交于 2020-02-11 16:16:01
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; /* 使用案例: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TestScript : MonoBehaviour { public RawImage rawImage; public Text text; // Start is called before the first frame update void Start() { // 获取图片 UnityWebRequestMgr.Instance.GetTexture(Application.dataPath + "/TestAssets/Cat.jpg", SetTexttureToRawImage); // 获取文本 UnityWebRequestMgr.Instance.Get(Application.dataPath + "/TestAssets/TextFile.txt", (uwr) =>

Unity 3D之UI设置父子关系setParent坑

﹥>﹥吖頭↗ 提交于 2020-02-11 14:27:39
写在前面: 在做项目的时候,难免会碰到UI很多的情况,而动态加载UI就是一个很重要的问题。而动态加载UI就需要考虑到设置UI的父子关系。通常我们会使用transform.setparent(transform)来设置父子关系。到这里都还是没毛病。但是偏偏UI在设置父子关系的时候需要考虑到第二个参数。对于初学者往往会遇到UI加载出来,设置子物体后发现UI不见了,但是明明直接拖到UI层次中又是对的。这个问题就和第二个参数相关。 worldPositionStays 所以这也是一个需要思考的问题。 UI设置父物体的原因分析 在加载UI中,这个加载步骤其实是首先将UI实例加载到场景的根路径中,然后再设置到父物体中。这个过程可以用手工实现,先加UI拖到场景根路径中,然后在拖到父物体下,此时显示的效果就是最后的效果。 原因:在从根路径拖到父物体这个过程中,就发生了坐标的转化。具体分析和解决方法看下文。 setparent() 这里首先对这个函数进行分析。这个函数有两个重载: public void SetParent(Transform parent); public void SetParent(Transform parent, bool worldPositionStays); 第一个是我们常用的只有一个参数的函数,第二个是加了一个是否保持世界坐标系的布尔型变量。

unity3d与eclipse协同工作环境

风流意气都作罢 提交于 2020-02-11 09:53:14
原地址:http://bbs.9ria.com/thread-212576-1-1.html 这个过程非常复杂。步骤一定要谨记 1,建立一个unity3d工程,然后自己丢点模型进去吧。然后设置导出时候的包名字(重要,后面解析),build一下。就会发现工程目录下面的temp文件夹里面多了一个文件夹,如果不build是没有的,如果你关闭了unity的话这个文件夹也会消失,这个现象费了我一天的时间,看官网英文教程漏一个单词都不行啊。 2,拷贝temp文件夹里面的StagingArea出来,然后以这个文件夹为source建立一个eclipse工程,就是建立eclipse选create project from exiting source啦。 3 右键这个以stagingarea文件夹为基础的工程,选择Properties -》android-》Is Library 设置为资料 4,新建一个新的eclipse工程(包名称与unity3d设置的导出工程文件名要一致,否则直接报错),导入上一个工程作为library,就是同样在已经建立好的工程上右键,在同样的地方点选add,就可以看见啦,然后导入。 5 导入jar包,右键工程属性,java build path-》添加jar到library,Unity安装目录\Editor\Data\PlaybackEngines\androidplayer

unity与iOS、Android交互

北战南征 提交于 2020-02-11 09:46:01
1、Unity调iOS的方法 在首页的viewcontroller里面实现方法 void _PressButton3(const char *args) { // UnityAppController *unityapp = (UnityAppController *)[UIApplication sharedApplication].delegate; // [unityapp ShowWindowssubview]; } 在Unity里面 直接调用 _PressButton3(content); 2、iOS与Unity交互,传值 UnitySendMessage("Scripts", [@"Function" UTF8String], [@"Parameters" UTF8String]); 3 . unity调android里面的方法 在初始化UnityPlayer的Activity中添加方法,如下: /** * 测试Unity调用Android的方法 */ public void testMethod(String param){ System.out.println("参数为:"+param); } 对于提供的方法,不可以进行UI操作,因为Unity3D对于android的UI线程来说,只是个子线程,如果要进行UI操作,可以使用Handler发消息。 .在Unity工程中

Unity与Android间的交互

别等时光非礼了梦想. 提交于 2020-02-11 09:41:36
1.打开Android Studio,命名并自动生成包名 2.点击Next,设置最小支持的SDK 3.点击Next,选择Empty Activity 4.点击Next,默认就行不用管 5.Finish 6.在Unity安装路径下找到Class.jar 找到libs文件夹 右键点击Show In Explorer,将class.jar放进去 右键点击Class.jar,点击Add As Library 出现对话框,点OK 7.打开Android Mainifest 加上这句话: <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 8.打开build.gradle 修改一下: applicaition改成library;applicationId那一句删掉 点击右上角sync Now 9编写MainActivity代码,修改如下 10.点击Build APK 11.在项目的这个目录下找到app-debug.arr 右键选择用压缩工具打开 删掉里面的res文件夹和libs下的Class.jar 12.把app-debug.arr和AndroidManifest扔进Unity的这个文件夹下 把AndroidManifest改一下: <?xml version="1.0" encoding=

【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信

◇◆丶佛笑我妖孽 提交于 2020-02-11 06:09:40
作者: 王选易 ,出处: http://www.cnblogs.com/neverdie/ 欢迎转载 ,也请保留这段声明。如果你喜欢这篇文章,请点 【推荐】 。谢谢! 引子 在前面两篇文章: 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D 【Unity3D基础教程】给初学者看的Unity教程(三):通过制作Flappy Bird了解Native 2D中的Sprite,Animation 我们了解了2D中的Sprite,Animation,RigidBody和Collider,在继续开发游戏的过程中,我们会遇到这样的问题,如何处理GameObject之间的相互调用,比如说在FlappyBird中我们在小鸟撞倒管子的时候,要把这个消息通知给许多GameObject,管子接到这个消息之后需要停止运动,UI接到这个消息要弹出GameOver的字样。接下来,我来讲一下如何合理地解决这个问题。相关源码参考: Flappy Bird的源码 。 为什么要进行GameObject之间的通讯? 在游戏开发中我们经常遇到这样的问题,在游戏中发生了一个事件(event),我们如何把这个时间通知给其他GameObject:比如游戏中发生了爆炸

Unity入门一,什么是GameObject,MonoBehaviour

吃可爱长大的小学妹 提交于 2020-02-11 01:11:34
Unity入门一,什么是GameObject,MonoBehaviour GameObject和Component Unity是一个 Component-Based 的引擎, 所有物体 都是GameObject GameObject是游戏场景中 真实存在 的,而且 有位置 的一个物件 Component附属于GameObject,控制GameObject的各种属性 GameObject是由Component组合成的,Component的生命周期和GameObject息息相关。调用此GameObject的Destroy方法,它的子对象和对应的所有Component都会被销毁,但也可以一次只销毁一个Component 常见的Component: Component 作用 RigidBody 刚体 使物体能在物理控制下运动 Collider 碰撞器 和RigidBody刚体一起使碰撞发生,没有Collider,两个碰撞的刚体会相互穿透 Renderer 渲染器 使物体显示在屏幕上 AudioSource 音频源 使物体在scence场景播放音频 Animation 动画 Animator 动画控制器 同时所有脚本都是组件,因此都能附到游戏对象上 常用的组件可以通过简单的成员变量获取 附在游戏对象上的组件或脚本可以通过GetComponent获取 using UnityEngine;

Unity3D_04_GameObject,Component,Time,Input,Physics

て烟熏妆下的殇ゞ 提交于 2020-02-10 23:58:35
Unity3D是一个Component-Based的游戏引擎,并且为GamePlay Programmer提供了很多游戏性层上的支持。 1.可以在图形界面上设计动画状态转换的Animator。 2.可以直接在场景编辑器中方便进行调整的Collider。 3.可以动态调整动画曲线的Animation。 总的来说,Unity是一个架构比Cocos2d-x精巧许多的游戏引擎。 但是很遗憾的是,Unity本身并不开源,还好,Unity在不开源的情况下却做了比较详尽的文档支持。同时,Unity的社区也是很友好的,stackoverflow也有许多值得一看的问题。 顺便推荐几个学习Unity的网站: Unity圣典 Unity的官方文档 Unity的知乎话题 对于Unity内部的类有点儿乱,所以通过下面这份设计类图来更好地理解: GameObject和Component 由于Unity是一个Component-Based的游戏引擎,所以游戏中所有的物体都是一个GameObject,为了给这个GameObject附加上各种各样的属性,所以我们引入了Component这个概念。 GameObject是由Component组合成的,Component的生命周期和GameObject息息相关。一旦GameObject的Destroy方法,它的子对象和对应的所有Component都会被销毁,同时