物理引擎
- 发生碰撞的条件
a) 主动发起碰撞方,有刚体,两者都有碰撞器 - 触发产生条件
a) 发生碰撞的双方,有一方勾选了IsTrigger - 给刚体施加力和力矩
a) AddForce()
b) AddTorque() - 角色控制器
a) Move(不使用重力)
b) SimpleMove(使用重力) - 射线检测的2个方法
a) Physic.RayCast(起点,方向);
b) Physic.RayCast(Ray);
寻路系统
- 烘焙寻路网格的步骤
a) 物体勾选静态(NavStatic,OffMeshLinkStatic)
b) 物体最好有碰撞(用于射线检测)
c) 台阶高度StepHeight不能比人高
d) 烘焙完成再运行。
e) 必须要有NavAgent 。 - Obstacle(障碍物,针对动态物体对NavMesh进行挖洞)
- OffMeshLink(手动和自动)
- Area(层级概念,int32位)Cost:Agent在层上行走的消耗值。
- 扩展:可通行的吊桥:
a) 使用障碍物或者控制AreaMask来实现、分离网格。
动画系统
- Animation系统
a) 播放老版(Legacy动画),需要把Rig面板的AnimationType改为Legacy;
b) 自己手动K帧(关键帧动画)(可以在animation或者animator中播放); - Animator动画状态机
小地图制作
1. 新建一个小地图的摄像机,修改ViewPortRect的值和Deepth的值;(使场景可以并存两个摄像机,并且小地图在右上角) 2. 给人物加一个用于显示的圆球或箭头,并分配Layer层MiniMap;并且赋予场景的其他物体 相应的层,比如Player,Map,Default; 3. 修改小地图摄像机的CullingMask,只能看到 MiniMap层和地形;修改主相机的CullingMask不能看到MiniMap层。 4. 如需修改Scene视图的小地图的课件,在编辑器的右上角的Layers里面。
- 1
- 2
- 3
- 4
- 5
UGUI
1. Canvas:画布
- a) Overlay:永远在摄像机的最前方(所有画面的最前方),以像素为单位;
- b) Camera:需要指定一个摄像机,有3D效果(透视相机),和3D物体有前后层级;画布大小受摄像机和实际分辨率(Game视图);
- c) World:画布已经成为了一个3D的物体;大小和位置可以自定义;适用于VR;
2. Anchors:锚点
- a) 子节点在父节点上定位,用于固定子节点位置的一个点;
- b) 锚点分开,子节点的四个角会跟随锚点的四个对应角,保持位置不变;会有拉伸的自适应效果;
3. Pivot:中心点
a) 子节点自己的中心点,子物体的位置,由自己的中心点和锚点来决定;
4. Text
RichText:富文本: 支持Html的标签
i. <color></color>颜色 ii. <size></size>字体大小 iii. <b></b>加粗 iv. <i></i>斜体
- 1
- 2
- 3
- 4
- 5
5. Image:图片
- a) Simple:正常模式;
- b) Slice:拉伸模式(适用于九宫格);
- c) Tield:铺瓷砖模式,用于一个纹理重复绘制;
- d) Filled:填充模式,做血条,技能进度条;
6. RawImage:显示任意Texture类型的特殊Image;(Image)
7. Mask:遮罩,按照像素进行遮挡,(会重新绘制一次,加大cpu消耗);
8. RectMask:矩形遮罩,只能遮挡矩形。
9. Button:按钮,可以点击点击事件:OnClick;
10. Slider:滑动条,做音量控制,血条(把handle去掉);
11. ScrollBar:进度条,网页的上下滚动进度;
12. Toggle:开关,做难度选择,单选(Group)或多选;
13. 屏幕的适配
1. Iphone4:960x640;
2. Iphone5/5c/5s:1136x640;
3. Iphone6/6s/7/7s/8:1334x750;
4. Iphone6Plus:1920x1080
5. Android机型:16:9;16/10;
- 1
- 2
- 3
- 4
- 5
- 6
14. 页面跳转
- 1.画布下页面Page的激活和隐藏(缺点:拖拽较复杂;优点:省去了销毁和创建,省性能)
- 2.每个页面保存成预制体,通过克隆创建新页面,销毁老页面,(缺点:频繁创建和销毁,优点:不用拖拽,不用维护老页面的激活和隐藏)
3.游戏页面
1. 每个页面是一个Panel,用一个UIController控制每个页面的展示和隐藏;游戏结束重新开始重新Load场景。 2. 每个页面是一个预制体,用一个UIController控制每个页面的克隆和销毁; 3. UI是一个场景(登录,注册,商店,关卡选择),3D游戏是一个场景(战斗,射击); a) 页面跳转1:从关卡选择到游戏,是场景跳转Load场景,冲游戏退出回到大厅或关卡选择,是场景再跳转回来。 b) 页面跳转2:UI中页面跳转,和3D中UI的页面跳转,不涉及场景跳转,只有页面切换(panel显示和隐藏,预制体加载)
- 1
- 2
- 3
- 4
- 5
- 6
4.点击事件
1.Button组件 a) 拖拽(快,便捷,容易丢失,过多的拖拽丢失比较麻烦) b) 动态添加,Button.onClick.AddListener(函数,匿名函数,lambda); 2.接口;UGUI提供的17个接口,可以实现UI交互 a) IPointerClickHandler:点击(按下,抬起) b) IPointerDownHandler:按下 c) IDragHandler:拖拽 d) IDropHandler:必须和Drag一起使用,不能有其他的; 3.EvnetTrigger:接口的另一种形式(拖拽添加事件) a) 拖拽和动态添加; 4.OnMouseClick:3D物体,有碰撞的情况下使用;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
Legacy视频播放
- 1.QuickTime:把Mp4格式的视频导入Unity时自动帮你转码,标记为MovieTextue格式;
- 2.Ogg格式转化器Theora Converter .NET:利用win的cmd命令行,帮你吧MP4转化为ogv格式,ogv可以直接被unity识别为MovieTexture;
- 3.播放MovieTexture
a) 3D物体使用材质,把MovieTexure当成贴图贴到材质球上,用脚本播放。
b) UGUI使用RawImage,把MovieTexture拖拽到Texture变量槽。用脚本播放。
c) 视频自带音频,使用AudioSource直接播放,可以控制音频进度获取视频的进度。
VideoPlayer新版视频系统
- 1.把视频直接拖拽到3D物体上,可以直接播放,
- 2.把视频直接拖拽到摄像机上,可以直接全屏播放。
- 3.需要把VideoPlayer的RenderMode选择为RenderTexture,并选择新建的RenderTexture,再吧RenderTexture拖拽到RawImage上。
- 4.把VideoPlayer的source改为URL可以播放在线视频和本地路径视频。
- 5.直接把AudioSource组件拖到VideoPlayer的AudioSource上,可以直接播放声音。
- 6.自行编写MP3和MP4播放器
AssetBundle
- 找到预制体和资源设置AssetBundle的名字(inspector右下角)(后缀统一unity3d)
- 使用编辑器脚本(放到Editor下)调用BuildPiple(outputPath)
- StreamingAssets文件夹不要打错,(不压缩,只能放assetbundle,其他资源会显示出错)
- 解压Assetbundle
a) 写解压脚本,不要放到Editor,
b) www加载是路径要有协议(http://或者file://)
i. eg:” “file://” + Application.streamingAssetsPath + “/bundleName.unity3d”;”
c) 加载yield return www. 相当于解压到内存,然后可以克隆里面的资源。
d) www.assetbundle.loadAsset(),从压缩包中解压谁;
e) 用完后,释放bundle的镜像www.assetbundle.Unload(是否释放所有加载过的对象);
编辑器
- Center/Pivot,物体Scene视图内坐标轴显示的位置(所有子节点中心/自己的中心)
- Global/Local,物体Scene试图内坐标轴的方位是(世界/自身);
- Gizmos:Inspector视图左上角tag左边的图标,点击给物体添加辅助线。
VS快捷键
- Ctrl+F,本文件,搜索
- Ctrl+Shift+F,本文件,搜索
- Ctrl+S:保存脚本
- Ctrl+Shift+S,全部保存;
- F12:跳转到方法或类;
- Shift+F12:全局搜索方法或类的引用<区别Ctrl+Shift+F>;
- Atl+F4,关闭
常见异常
- NullReferenceException:空指针异常
a) 解决方案:
i. 1.找到异常的行数,确定有几个引用类型;
ii. 2.确定哪个为空(Debug,断点) - UnassignReferenceException:未赋值异常
a) 解决方案:
i. 1.找到异常的行数,确定有几个是拖拽而来的对象; - MissingComponentException:组件丢失异常
- “SetDestination” can only be called on an active agent that has been placed on a NavMesh
i. 代理Agent没有被放到Nav网格上
ii. 代理Agent没有被激活
iii. 自己刷的地图,有几率出现,无法解决。
iv. 没有可行走的Area。 - IndexOutOfRange:数组越界异常
ULUA热更新
热更新原理:
- 1.C#脚本是编译后执行,不可以进行热更新。
- 2.lua脚本是解释型脚本语言,可以当做资源在unity中加载,利用C#读取lua逻辑实现热更新。(C#解析lua:1.反射,2.非反射cstolua)
- 3.luaInterface:是用于lua和.net进行交互的一个库。在所有的lua热更新框架中使用。
- 4.luaFramework:是ulua框架的一个demo。使用热更新最多的框架。
- 5.ulua:包含一个pureMVC框架,用于启动luaMgr,运行lua环境,加载Game.lua和Main.lua 脚本(lua逻辑的入口,开启lua游戏逻辑)
AppConst
- DebugMode:内部测试,为true则所见即所得(跟3,5是对立的)
- ExampleMode:例子模式,永远为true
- UpdateMode:更新模式,为true,需要部署ab到服务器
- LuaByteMode:加密模式,lua字节码加密,默认为false
- LuaBundleMode:bundle模式,lua脚本会被打包成bundle,上线必为true
pureMVC
1.luaManager:lua解析管理类。
2.GameManager:lua热更新判断和lua入口。
3.AppConst:热更新框架常量文件
4.PanelManager:页面管理器,供lua使用
5.ResourceManager:资源管理器,加载Bundle中的预制体等资源,供lua使用。
6.ThreadManager:线程管理器,用于多线程下载资源,C#处理更新使用。
. 热更新流程
- 1.热更流程:(ulua热更新流程)
1.使用C#编写通用的,网络相关(使用lua写比较费性能)模块。
2.使用lua编写游戏逻辑,可以调用C#相关模块。
3.打包lua脚本和预制体到AssetBundle,上传到服务器使用www下载。
4.通过下载files.txt文件比对各个bundle的MD5,判断是否有更新。
*(热更新时判断和加载的代码在GameManager中(puremvc框架中的一个管理类)) 2.具体操作
a) UpdateMode和luaBundleMode打开,DebugMode关闭
b) 生成Wrap文件
c) Build xxx Resources到StreamingAsset
d) 把StreamingAsset传到服务器,网址赋值给AppConst.WebUrl
e) 游戏加载(GameManager)i. 判断本地有没有解压文件 ii. 第一次安装则解压文件 iii. 判断远程的File文件里面各个ab的hashId有没有更新 iv. 更新文件 v. 准备完毕,进入Lua
- 1
- 2
- 3
- 4
- 5
- 6
f) 注释
- 1.Main是最早加载的lua脚本,用于Require其他的lua脚本,引用lua需要使用的的UnityEngine的类。
- 2.Game是Main之后第一个运行的lua脚本(UIRoot),用于启动UI的第一个界面,开启网络连接等。
Socket和http和tcp
1.tcp:和udp都是网络传输协议。5层协议的传输层
2.http:短连接(应用层传输协议5层协议的应用层)。基于tcp协议。需要request才有response。
请求过程需要3次握手。常用语游戏中的登录,注册,商店,签到,活动等非频繁交互网络页面。弱联网游戏使用,强联网游戏也可以使用。
3.socket(套接字):长连接, 套接字不是一个协议,而是传输层的一个API,可基于tcp、udp进行长连接,理论上一旦理解就不会中断,用于强联网游戏,如moba的5v5实时对战,mmorpg中的5人组队,卡牌和棋牌类游戏的多人实时对战。
优化相关
1.cpu优化:
- 1.减少drawcall:合并材质,打图集,lightingMap,光照探针。
- 2.减少顶点:遮挡剔除,LOD,优化模型,合并Mesh
- 3.脚本优化:避免update中使用foreach,new,GetComponent,使用对象池,锁帧。
2.gpu优化:(图片带宽和shader)
- 减少图像大小和质量,减少透明shader,减少多材质,减少pass,mipmap
3.内存优化:
- (一般项目的资源占用内存的70%,而资源主要分为纹理(Texture)、网格(Mesh)、动画片段(AnimationClip)、音频片段(AudioClip)、材质(Material)、着色器(Shader)、字体资源(Font)以及文本资源(Text Asset))
- 缩小图片,九宫格,贴图设置减少mipmap使用,减少read/write enable使用,尽量用compress替换TrueColor,注意Resouces和assetbundle内存释放,压缩纹理,压缩音频,压缩视频,压缩模型,避免内存泄露。
数据存储
- 1.txt记事本(按照‘,’分割/json格式/xml格式)、
a>Json解析使用litjson.dll
b>Xml解析使用System.Xml
参考:http://www.xuanyusong.com/archives/1901 - 2.playerprefs(xml格式):适合较简单数据存储
- 3.excel存储(类似数据库)
参考:http://blog.csdn.net/yupu56/article/details/50580277。 - 4.sqlite(轻量级关系型数据库)
a>要求增删改查命令。
b>只能单用户单进程操作,前端使用,后端使用mysql。
c>至少3个以上关系型数据表的结构才使用。