AssetBundle
在网络游戏中,可能需要在运行时下载并更新资源,而Unity提供了AssetBundle组件,可以将指定的一部分资源构建成AssetBundle文件。如果需要下载,那么需要将这些AssetBundle文件上传到CDN上。
设置AssetBundle选择需要构建的AssetBundle资源,在右下角写入资源名以及资源的后缀名,在代码中调用BuildPipeline.BuildAssetBundles()方法,只需提供一个输出的目录就可以构建AssetBundle了,最终将输出在AssetBundleFolder文件夹下
在Editor文件夹内新建BuildAssetBundleScript脚本,注意一定要在Editor文件夹中
123456789101112131415161718192021using UnityEngine;using UnityEditor;using System.IO;public class BuildAssetBundleScript { [MenuItem("Tools/BuildAssetBundles")] ...
版本管理、运行模式资源管理
多人开发游戏时,需要对项目的版本进行管理,通常会将整个工程上传SVN或者Git。但这并不是很必要,资源在导入Unity的时候,会自动生成很多中间资源,这些资源是不需要上传的。只需要将Assets、ProjectSettings文件夹下的的所有文件以及.meta文件上传即可
.meta文件.meta文件是Unity自动生成的。每个游戏资源都会有一个对应的.meta文件,它会标记资源在引擎中的一些设置信息。也就是我们在Unity中选中一个资源时,在Inspector中设置的导入信息,资源在用户无感知的情况下被Unity优化了。
当我们在Edit——Project Settings——Version Control中,选择Mode为Visible Version Files,就能在文件资源管理器中看到meta文件用来版本管理。
我们随便打开一张贴图对应的.meta文件,每个.meta文件都会记录guid这个重要信息。guid就是用来关联资源与游戏对象的引用的。比如场景中有个模型,引用了这张贴图,那么模型对应的.prefab文件就会引用这个guid;如果模型不是Prefab,只是保持在场景 ...
编辑模式资源管理
Unity提供了强大的Profiler工具,它专门查看每一帧内存的占用以及加载的耗时。此外,它还提供了自定义接口,开发者也可以自定义一个查看区间。
Unity还提供了Frame Debugger,它可以查看每一帧渲染的详细过程。如果DrawCall很多的话,可以参照它来想办法合并。
Unity有丰富的资源加载接口,我们可以在编辑模式下加载资源,在运行模式下加载本地资源和下载资源。
编辑模式加载资源编辑器模式下Unity可以访问加载到硬盘上的任意资源,这对拓展引擎内置的编辑器是非常好的。引擎可以读取任意资源来丰富编辑器。
编辑模式下的资源可分为两类:一类是引擎可识别的资源,例如Prefab、声音、视频、动画和UI等;另一类是引擎无法识别的资源,例如外部导入资源,这类资源需要通过第三方工具将它的信息解析出来,最终组织成引擎内可识别资源才可以使用。
Unity标志性的类AssetDatabase,它专门负责读取工程内的资源。它读取的资源必须放在项目的Assets目录下,其他位置的资源可以尝试用File类来读取
我们在场景中随便放一个cube(没有父对象),坐标设置为(7,7,-6),并拉取 ...
多媒体视频
Unity提供了Video Player组件来专门处理视频,只需将视频文件直接拖入Hierarchy便可以自动创建。
视频播放器 (Video Player) 组件 - Unity 手册 (unity3d.com)
视频文件Unity支持的视频文件包括.mp4、.mov、.webm、.wmv。另外,视频文件还支持从一个网址播放。
一些MP4在线视频测试URLhttp://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4
http://vjs.zencdn.net/v/oceans.mp4
https://media.w3.org/2010/05/sintel/trailer.mp4
http://mirror.aarnet.edu.au/pub/TED-talks/911Mothers_2010W-480p.mp4
http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4
http://vfx.mtime.cn/Video/2019/03/21/mp4/1903211538531 ...
多媒体音频
在游戏中,都需要播放声音与视频,其中声音又可以分为音乐和音效两种。
音乐就和背景音乐一样,一直在循环播放;
而音效用得就更多了,例如释放技能、被攻击所带来的声音,而且音效很可能同时需要播放好几组。
为了满足更加逼真的效果,Unity提供了强大的回音模式以及3D音频模式,如果远处和近处都有音效,听起来真实。
另外,Unity提供Audio Mixer组件,在编辑模式下使用它来组合播放各种声音以及混合播放多音频。
新版的视频功能既可以将视频输出在摄像机的前面或后面,也可以将视频放在UI以及场景中间,还可以将视频材质输出并自定义渲染在贴图上。
音频文件音频由多个Audio Source组件和一个Audio Listener组件组成,其中Audio Listener负责监听所有的Audio Source,最终通过扬声器播放出来。如果是3D音效,Unity会自动判断Audio Listener与Audio Source的距离,从而增强或者减少音量。
同一个场景只能有一个Audio Listener组件启用,它默认添加在主摄像机上
Unity支持的音频文件非常丰富,他们包括.mp3、.ogg、.w ...
寻路网格和反射探头
寻路就是提供一个目标点,根据障碍物自动计算出一条最优的路径。Unity寻路使用的是AStar算法。寻路可分为动态寻路和静态寻路。动态寻路就是障碍物的位置可以动态修改。静态寻路表示无法移动的障碍物,静态寻路是效率更高的寻路。
导航和寻路 - Unity 手册 (unity3d.com)
设置网格参与寻路计算的对象需要选中Navigation Static复选框,接着在导航栏中选择Window——AI——Navigation。
在Bake选项卡中,我们可以设置代理角色胶囊体的一些参数。
Agent Radius表示半径
Agent Height表示高度
Max Slope表示爬坡的最高坡度
Step Height表示每次爬楼梯的高度
Generated Off Mesh Links合并无法使用可行走表面来表示的导航捷径。例如,跳过沟渠或围栏,或在通过门之前打开门,全都可以描述为网格外链接。
最后,单击Bake按钮即可。
我们来做一个简单寻路,让图中的方块越过障碍物自动走路
首先要给方块添加Navmesh Agent组件,然后在方块上挂载此脚本
新建NavigatorMov ...
遮挡剔除Occlusion Culling和静态合批Batching
游戏中的元素非常多,但是摄像机能看到的内容是有限的,并且有些元素会被另外一些元素挡住。遮挡剔除顾名思义,摄像机看不见的,就剔除掉。
遮挡剔除 - Unity 手册 (unity3d.com)
遮挡关系例如一面墙后面放了很多元素,那么墙就属于遮挡物Occluder,墙后的物体就是被遮挡物Occludee。
我们在场景中放一些方体来做遮挡,在最前面放一个很大的做墙(注意一定要很大才行,unity默认情况下需要很大的Occluder),这些方体都要勾选Static Occluder和Static Occludee。
选择Window——Rendering——Occlusion Culling,打开烘焙面板,选择Bake选项卡,可以在里面设置最小遮挡距离,最小遮挡空隙以及背面的阈值,最后单击Bake按钮即可烘焙Static对象
烘焙结束后,Unity会在场景scene所在位置创建一个StaticObject文件夹,然后在其中放入OcclusionCullingData.asset文件,之前讲的场景烘焙文件也放在这里
然后,在scene面板中的Occlusion Culling小面板 ...
Lightmap
静态对象静态对象是Unity提供的一个属性,它可以附加在游戏对象或者Prefab上。它的原理是限制物体在运行中不能发生位移变化,预先生成一些辅助数据,从而达成一种用内存换时间的优化方式。静态元素的种类很多。选择任意游戏对象,单击inspector右上角的Static下拉框,即可设置该对象的静态元素了,具体如下
Lightmap Static:这个勾选Static后会自动出现,用来表示接受烘焙光照计算,可烘焙光照贴图。
Occluder Static:表示自身是否可以遮挡其他元素。
Bathing Static:表示支持静态合批
Navigation Static:表示可烘焙寻路网格
Occludee Static:表示自身可以被遮挡剔除掉
Off Mesh Link Generation:寻路连接不同区域的点,就像角色从山顶跳下来?
Reflection Probe Static:反射探头(Probe),就像玻璃反射一样的镜面效果。
Lightmap设置烘焙贴图lightmap技术的原理是将场景中的灯光与物体产生的光照与阴影信息烘焙在一张或者多张Lightmap贴图中,这些物体将 ...
网络Socket
Socket编程-UDP和TCP协议的区别
TCP会保证包的顺序,先发的先到达,UDP不保证
Socket编程-TCP服务器端+客户端TCP服务器端1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253using System;using System.Text;using System.Net.Sockets;using System.Net;namespace SocketNetLearning1{ class Program { static void Main(string[] args) { //1.创建Socket(内网、流、TCP协议) Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolTyp ...
XML和YAML
XML在开发中使用也很频繁,此时要以标签的形式来组织数据结构。C#提供了创建、解析、修改、查询等方法,可以很方便地操作它
创建XML需要System.Xml命名空间
123456789101112131415161718192021222324252627282930313233using UnityEngine;using System.Xml;using System.IO;public class XMLCreate : MonoBehaviour{ void Start() { //创建XmlDocument XmlDocument xmlDoc = new XmlDocument(); XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null); xmlDoc.AppendChild(xmlDeclaration); //在Node中 ...