Unity 知识点复习

xiaoxiao2025-04-22  18

原文:https://blog.csdn.net/yupu56/article/details/79403954 

 

物理引擎 发生碰撞的条件  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里面。 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>斜体 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; 14. 页面跳转 1.画布下页面Page的激活和隐藏(缺点:拖拽较复杂;优点:省去了销毁和创建,省性能) 2.每个页面保存成预制体,通过克隆创建新页面,销毁老页面,(缺点:频繁创建和销毁,优点:不用拖拽,不用维护老页面的激活和隐藏) 3.游戏页面

1.  每个页面是一个Panel,用一个UIController控制每个页面的展示和隐藏;游戏结束重新开始重新Load场景。 2.  每个页面是一个预制体,用一个UIController控制每个页面的克隆和销毁; 3.  UI是一个场景(登录,注册,商店,关卡选择),3D游戏是一个场景(战斗,射击); a)  页面跳转1:从关卡选择到游戏,是场景跳转Load场景,冲游戏退出回到大厅或关卡选择,是场景再跳转回来。 b)  页面跳转2:UI中页面跳转,和3D中UI的页面跳转,不涉及场景跳转,只有页面切换(panel显示和隐藏,预制体加载) 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物体,有碰撞的情况下使用; 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 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个以上关系型数据表的结构才使用。 原文:https://blog.csdn.net/yupu56/article/details/79403954   

转载请注明原文地址: https://www.6miu.com/read-5028874.html

最新回复(0)