Unity 3D 学习经验总结

本文经验取自《unity3d脚本编程与游戏开发》。本文主要用于自己的总结归纳。

第一章 脚本概览

本章没啥内容。主要大概讲解了一下脚本该咋用,还有material可以用上纯色材质等。 同时还有讲解了unity中都是以gameobject为主题。还有通过挂载组件添加功能。

第二章 Unity基本概念

1.空物体也有transform这个组件来标记其位置。

2. unity中渲染也是通过mesh来进行的。(基本的图形学)。只有网格渲染器才能指定材质。添加新的material的时候是会把default-material给顶掉的。

3.灯光,unity中是会有一个叫做默认光源的玩意,就是directional light。这是一个有方向的光源

4. 对于摄像机这个的问题,我认为这个就是决定整个场景的输出界面,包括声音也是从这里出来的(audio listener)。也就是说可以通过这个玩意简易的调整声音的来源等。

5. 关于transform。 transform是unity中很重要的一个组件,父子关系,缩放等一切都是依靠于transform组件形成的。通过父子关系和prefab可以让人很快在unity中形成复用的关系。而且可以通过旋转父物体来使用对子物体的旋转。举例的话可以用门框旋转的例子。

6. 标签和层也是这章讲解的重要内容之一。通过层级的规定可以很好的避免一些物体之间发生碰撞等问题。

脚本访问的小问题

1.脚本中的this直接指代的就是脚本本身。

2. 脚本可以通过getComponent<泛型>来获取挂载在这个标本的组件,比如说获取collider。

3. transform的使用过于普遍,所以可以直接通过transform来调用Transform组件。

4. 物体中组件可以代表物体本身。也就是getComponent 获得组件可以在getComponent一次。

5. 有多个同名组件可以用getComponents来进行获取。同名时有getComponent获取的对象就不可知了。

关于父子关系(也是transform下面的找子物体的玩意)

6. GameObject.find 是一个很低效的方案。因为它会将所有的物体都遍历一遍。

7. FindGameObjectWithTag 这个标签也是

8 .物体的层级关系与文件的层级关系基本是一致的,没问题的。

9. 可以通过拖拽改变公开变量的方式引用物体和组件。

预制体问题

1. 减少复用成本,可以通过Instantiate 进行初始化,可以指定位置与朝向。prefab一般通过GameObject做公开引用来进行初始化调用等问题。

2.可以给物体添加组件(运行中代价是啥呢?),利用addComponent的方式。

3.destroy这个function并不是实时执行的,而是会在恰当的时候去执行的。(render调用之前)。

4.invoke方法可以提供延时调用某个function,但不允许传入参数。

脚本的生命周期问题

先物理系统在其它的更新,再渲染等。Awake就是普通的初始化。而start则是宣visble可视之后才会被调用。

协程问题初讲

有一点像是轮询。 首先是通过StartCoroutine来初始化一个Timer。通过yiled new waitForSecond来使时间暂停。

第三章 物理系统

1. 刚体这个玩意主要用于物理运算,包括但不限于速度角速度等问题。

2.碰撞体这个东西应该使检测是否装上了用的。

3. 物理材质,还暂时没用上我相信之后肯定能用上的。

4. 触发器,允许穿过的触发器。

5.静态碰撞体,没有挂载刚体的碰撞体。如果碰撞体会移动,请务必挂载一个刚体。

6. 动力学刚体是啥还是不太清楚啊。

7. 只要有一个是触发器就不会发生碰撞。

8.可以通过layer collision matrix (edit project setting physics 里面)来进行设置层之间的碰撞。

9.物理关节并没有使用过,不太清楚是啥。

10. fixedupdate主要是通过

刚体

可以对刚体施加外力。也就是 AddForce (new Vector3(0, 100, 0));

并且可以直接通过修改刚体的速度来对刚体的运动状态进行修改。(比如二段跳)

射线的使用

比如单机地面(如minecraft那种)要判断是否点击到了可以电机的地块。

判定子弹是否击中某物体使可以用。同时可以用射线来模拟射线。

第四章 数学相关的玩意

unity 采用的是左手坐标系。这章我认为最重要的就是四元数的问题了。还有最后一个旋转的案例。

第五章 脚本控制UI 界面

UI 组件

UI中一像素对应的就是游戏屏幕中1m。UI中所有组件选择使用rect transform,而不是transform。这个玩意对于屏幕的适配性。这其中选择的对齐方式其实代表的是基准。它改变的是你选择canvas的原点。

富文本是给文字添加标签,可以修改text组件。

button中有navigation可以修改导航顺序。就是为键盘按钮准备的。

有个特殊的玩意叫Scroll Rect。UI 系统还是建议边用边查文档。

事件系统 

包括消息分发系统,输入模块,提供常用输入事件接口。事件可以通过继承事件handler来增加功能。其它物体也可以通过挂载handler和physics raycaster来添加事件功能。

输入事件有三种参数。baseeventdata, pointerEventData, AxisEventData. base这个玩意一想就知道是基类,pointer代表的是指针滑动,单机的数据。AxisEventData则代表所有轴类输入。

3. 关于如何动态添加响应方法,需要将物体与function 动态绑定起来。利用事件.addlistener绑定事件。

4.事件触发器 

如果同一个函数绑在不同的事件trigger中,则需要区别事件。

界面制作与适配

1.确定游戏需要适配的机型,先创建画布。利用下方的几比几来进行模拟适配情况。

2. unity有三种适配方案,分别是 Match width or height、 Expand(整体不变形。扩展到满足长款其中任意一边为止), Shrink(同时匹配宽和高,长宽会变形这种)这三种。

3.分辨率参考值和每单位像素数参考值。 Reference resolution 和 reference pixels per unit。前面这个主要用于适配等考虑,而下面这个主要用于适配图片像素大小等。

4. panel控件做父物体的好处有很多。他带一个image 组件,可以看到它的区域。

5. 为什么要用顶部区域做控件主要要看是不是要贴边之类的。主要还是为了适配,为了那些要贴边的部分来制作的。UI要再试试,但是适配的问题还是分为8部分,上下左右中间可以缩放移动部分。

第六章 关于动画的问题

1. 物体挂载animator之后,animator中的变量变化应该获取Animator组件后利用set来改变其中变量。

2. 可以利用检测物体周围的collider来判断物体是否落地。利用Physics2D.OverlapCircleAll来进行判断。

3. 关于3D 动画,利用下方的Avatar definition 可以设置骨骼数据来自哪里。因为3d动画也推荐复用,所以其允许模型,骨骼定义和动画都独立保存。3d动画过于复杂,建议搞一套mmd来试试看看动画应该怎么做。或者这个重不重要。

4. blend tree。1d类型指bool类型的,2d simple directional 指的应该两个方向的bool,但是两者不能融合。而2d freeform cartisian应该是指有两个变量可以任意组合那种,可以融合。

5.根骨骼动画的应用。根骨骼可以让人物动起来而不用修改其transform。

6.帧事件可以让开发人员更好的将把脚本跟动画中某一帧联系起来。动画帧事件会调用该物体挂载所有脚本的事件。

我个人感受,大部分unity的动画技术都是给3d准备的,其实还准备的非常的好。

第7章 特效问题

第8章 声音处理问题

第九章 工程与资源

1. unity 是通过生成meta文件来进行管理文件的引用关系以及之类的东西的。meta文件应该被同样加入版本管理系统中。每个资源都有自己的GUID,写在meta文件中。所以不能用ctrl d来克隆meta文件。

2. 通过resource文件夹动态加载资源。利用函数来决定上面资源被加载,内容加载和实例化不是一步。

3. 资产包 asset bundles可以打包再调用。

4.真实的游戏开发绝对不能使用绝对地址,Application.dataPath 是数据文件夹,对应assets文件夹。其二Application.streamingDataPath也是另外个数据路径,对应的就是streamingassets文件夹,移动端这个文件夹是只读文件夹。Application.persistentDataPath是持久化数据路径,存档啊资产包都应该放在里面。

5.资产包中应该包含所有的依赖项。为了避免资产包过大,所以应该把前置包放进单独的包中提前加载。

第十章 序列化问题

序列化就是将类用各种方式存储起来。这个到时候需要储存的时候再重新看一下罗。

第十一章 AI 问题

1. 导航的烘培问题。 首先为什么要烘培导航,我个人理解是因为在游戏中计算这个东西会花费用户大量的计算力,所以提前在制作的时候进行烘培可以显著提高用户游戏体验。其它具体细节需要之后用具体案例来进行练习之后才能得到要点。

2. 有限状态机。通过这个东西可以节省大量的if判断语句。从简入繁,之后再设计复杂点也没有任何关系。

3. 模拟AI 视觉。可以利用多条视觉模拟一个锥性体,这样就能避免了小间距遍历。利用四元数的性质旋转特性依次遍历每条射线。

4. mesh本身就是点状物,就是用点来表示。本身就是三角形着色。

13 unity编程优化

unity 对象池

1. 对象池就是避免频繁创建销毁,放在对象池里面到时候要用的时候再调用就好了。用queue就好了。setactive就是用在这个地方。并且要把对象池设置为父对象。

2. 可以使用dictionary 来分配多种对象,这个数据结构要更复杂一点,利用一个 两个dict来完成这个东西。

unity协程详解

协程死循环也会导致unity卡死。所以协程不是线程。协程怎么样都会延迟一帧继续。携程就是返回IEnumerator的的function。

unity事件详细解答

unity事件其实就是c#委托。UnityEvent。

你可能感兴趣的:(unity)