Unity 知识点复习

物理引擎

  1. 发生碰撞的条件
    a) 主动发起碰撞方,有刚体,两者都有碰撞器
  2. 触发产生条件
    a) 发生碰撞的双方,有一方勾选了IsTrigger
  3. 给刚体施加力和力矩
    a) AddForce()
    b) AddTorque()
  4. 角色控制器
    a) Move(不使用重力)
    b) SimpleMove(使用重力)
  5. 射线检测的2个方法
    a) Physic.RayCast(起点,方向);
    b) Physic.RayCast(Ray);

寻路系统

  1. 烘焙寻路网格的步骤
    a) 物体勾选静态(NavStatic,OffMeshLinkStatic)
    b) 物体最好有碰撞(用于射线检测)
    c) 台阶高度StepHeight不能比人高
    d) 烘焙完成再运行。
    e) 必须要有NavAgent 。
  2. Obstacle(障碍物,针对动态物体对NavMesh进行挖洞)
  3. OffMeshLink(手动和自动)
  4. Area(层级概念,int32位)Cost:Agent在层上行走的消耗值。
  5. 扩展:可通行的吊桥:
    a) 使用障碍物或者控制AreaMask来实现、分离网格。

动画系统

  1. Animation系统
    a) 播放老版(Legacy动画),需要把Rig面板的AnimationType改为Legacy;
    b) 自己手动K帧(关键帧动画)(可以在animation或者animator中播放);
  2. Animator动画状态机
  3. 小地图制作

    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.  颜色
    ii. 字体大小
    iii.    加粗
    iv. 斜体
    

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

  1. 找到预制体和资源设置AssetBundle的名字(inspector右下角)(后缀统一unity3d)
  2. 使用编辑器脚本(放到Editor下)调用BuildPiple(outputPath)
  3. StreamingAssets文件夹不要打错,(不压缩,只能放assetbundle,其他资源会显示出错)
  4. 解压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(是否释放所有加载过的对象);

编辑器

  1. Center/Pivot,物体Scene视图内坐标轴显示的位置(所有子节点中心/自己的中心)
  2. Global/Local,物体Scene试图内坐标轴的方位是(世界/自身);
  3. Gizmos:Inspector视图左上角tag左边的图标,点击给物体添加辅助线。

VS快捷键

  1. Ctrl+F,本文件,搜索
  2. Ctrl+Shift+F,本文件,搜索
  3. Ctrl+S:保存脚本
  4. Ctrl+Shift+S,全部保存;
  5. F12:跳转到方法或类;
  6. Shift+F12:全局搜索方法或类的引用<区别Ctrl+Shift+F>;
  7. Atl+F4,关闭

常见异常

  1. NullReferenceException:空指针异常
    a) 解决方案:
    i. 1.找到异常的行数,确定有几个引用类型;
    ii. 2.确定哪个为空(Debug,断点)
  2. UnassignReferenceException:未赋值异常
    a) 解决方案:
    i. 1.找到异常的行数,确定有几个是拖拽而来的对象;
  3. MissingComponentException:组件丢失异常
  4. “SetDestination” can only be called on an active agent that has been placed on a NavMesh
    i. 代理Agent没有被放到Nav网格上
    ii. 代理Agent没有被激活
    iii. 自己刷的地图,有几率出现,无法解决。
    iv. 没有可行走的Area。
  5. 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

  1. DebugMode:内部测试,为true则所见即所得(跟3,5是对立的)
  2. ExampleMode:例子模式,永远为true
  3. UpdateMode:更新模式,为true,需要部署ab到服务器
  4. LuaByteMode:加密模式,lua字节码加密,默认为false
  5. 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个以上关系型数据表的结构才使用。

你可能感兴趣的:(Unity)