Unity游戏开发

脚本编译

在编辑器下,每次修改完代码就会自动编译,最终所有代码将编译成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()

猜你喜欢

转载自blog.csdn.net/weixin_44806700/article/details/120583974
今日推荐