脚本编译
在编辑器下,每次修改完代码就会自动编译,最终所有代码将编译成DLL文件。DLL最终编译在Project/Library/ScriptAssemblies目录下。 脚本分为运行时脚本和编译时脚本,运行时脚本会被编译到游戏包中,编辑时脚本仅用于编辑器模式下。脚本的存放的目录决定了他讲编译在哪个DLL文件中Plugins目录下的脚本最先被编译,编译成Assembly-CSharp-firstpass.dll,Plugins下的Editor编译在Assembly-CSharp-Editor-firstpass.dll下,其他运行时脚本编译在Assembly-CSharp.dll下,Editor的编译在Assembly-CSharp-Editor.dll下,先编译的脚本无法访问后编译的脚本
基本改动不大的代码块放到Plugin下,改动大的放在其他位置,这样改动其他块的代码就不会编译Plugin的代码
关闭日志输出
Debug.unityLogger.logEnable = false
监听日志
Application.logMessageReceived
Font.textureRebuilt字体重建 text.FontTextureChange 刷新Text文本
更换烘焙贴图(例如更换夜晚白天)
先创建LightmapData对象,最终将需要更换烘焙贴图放入LightmapSetting.lightmaps中即可 LightmapData data = new LightmapData(); data.lightmapColor = lightmap; LightmapSetting.lightmaps = new LightmapData[1]{data};
合批
在PlayerSetting中勾选Static Batching和Dynamic Batching 自动静态合批次:在需要合批的物体上Static勾上Static Batching
运行游戏后,MeshFilter会自动生成一个新的Mesh,如果有相同材质,Shader并且参数一样,就会合并DrawCall 缺点: (1) 运行游戏,如果只有一小部分出现在摄像机里,那个整个Mesh都需要参与渲染 (2) 静态合批最大顶点数是65535,如果顶点数超过了它,Unity就会自动合并出多个Mesh
脚本静态合批:利用代码来动态设置需要合批在一起的游戏对象。如果使用代码合批,不需要勾选Static Batching,只需要调用StaticBatchingUtility.Combine()方法即可, 第一个参数,数组:所需要合批的对象 第二参数,gameobject:合并后放在那个节点下面 该方法必须在Awake周期调用 合并后的Mesh无法单独位移,只能移动指定的Root节点
动态合批:动态合批是全自动的,我们不需要做任何事情,但它是有要求的,Mesh顶点需要小于300,如果Shader使用了顶点位置、法线、UV0、UV1和切线,Mesh的顶点数必须小于180,一般用于粒子特效中
录音
Microphone类
编辑器下保留引用实例化预制体
PrefabUtility.InstantiatePrefab();
获取文件MD5
MD5 md5 = new MD5CryptoServiceProvider(): BitConverter.ToString(md5.ComputeHash(File.ReadAllBytes(“路径”))).Replace("-","").ToLower()
监听导入事件
继承AssetPostprocessor类
代码调用实现未保存状态*
通过代码修改物体上序列化的物体,不会出现未保存的状态*,通过调用EditorSceneManager.MarkSceneDirty()强制设置场景为未保存状态, EditorUtility.SetDirt()设置某个资源变成dirty状态
打包事件监听
用来实现打包时版本号(PlayerSettings.bundleVersion)自动增加之类的 , 继承接口IPreprocessBuild,IPostProcessBuild
多相机共存,
可以实现 人物的装备永远都在相机视线内,就算是故意把枪伸进模型里面也不会发生穿模现象 通过Depth来决定谁在前谁在后 主相机可以指定某个层级剔除 另外新建一个相机只选择这个层级的物体渲染,并将Clear Flags设置为DepthOnly 如果要让UI显示在模型后面,将Canvas的RenderModel设为Screen Space—Camera
多场景编辑
可以实现将多个小场景拼接成一个大场景 编辑器下只需将场景文件拖动Hierarchy视图中即可, 加载场景,调用SceneManager.LoadSceneAsync(“场景名字”,LoadSceneMode.Additive); 卸载场景:SceneManager.UnloadSceneAsync(名字); 将对象移动到指定场景中:SceneManager.MoveGameObjectToScene(); 在多场景中,需要指定一个为激活场景。如果添加游戏物体时不指定场景,都将默认放在激活场景中。 场景激活:SceneManager.SetActiveScene(SceneManager.GetSceneByName(“场景名字”)); 场景激活回调:SceneManager.activeSceneChanged 场景加载回调:SceneManager.sceneLoaded 场景卸载回调:SceneManager.sceneUnloaded 多场景烘焙:Lightmapping.BakeMultipleScene()
|