Unity学习

Posted by Cute Blog on January 12, 2020

Unity 学习

[toc]

Unity 3D 核心类

下面用一张图来概括Unity中的核心类,有的比较熟悉,有的则不是很熟悉,大概自己梳理一遍,看看自己那些地方需要了解和加强。

Behavior下面的继承者可以手动隐藏或显示enabled。

Component下其它的部分组件不可以手动隐藏或显示。

Unity 基本类型

在unity中它的基本类型和引用类型的规定应该和C#相同。

值类型:基本数据类型(int、float、double等),结构数据类型和枚举数据类型。直接访问数据的值。

引用类型:类,接口,数组,字符串和委托。访问数据的存储地址。

在C#中可以通过Type.IsValueType属性来判断是否为值类型,true为值类型。

现在让我们回到unity中的color,发现它是一个struct类型,所以他是一个值类型。

unity脚本的执行

Awake:游戏运行时执行,只执行一次。主要用于初始化游戏状态或者变量。

OnEnable:脚本唤醒时执行(有可能执行多次)。

Start:在Update方法执行之前调用,只执行一次。当脚本初始状态为不启,再次启用脚本会执行一次Start,之后关闭启用脚本Start将不会执行。

Update:每一帧执行,当机器忙或者性能差的时候可能会停止执行,会产生卡顿的感觉。

LateUpdate:Update执行完之后执行,Update执行完之后必定执LateUpdate,当执行完所有脚本的Update之后,开始执行LateUpdate(比如现在有十个脚本中都有Update,只有一个脚本有LateUpdate,会执行完十个Update之后再去执行LateUpdate)。

FixedUpdate:与机器性能无关,每固定帧执行一次,一般用于物理更新(关于Update与Fixedupdate的执行顺序没有固定先后顺序,与机器性能有关)。

OnDisable:与OnEnable对应,在脚本关闭或销毁之前调用(在OnDestory前必定调用)。

OnDestory:当脚本所在游戏物体销毁时调用。

Awake、OnEnable、Start、Update、LateUpdate、FixedUpdate其执行顺序并不随着父子物体改变而改变,而是根据其对象的创建先后顺序,后创建先执行。

虽然Awake、OnEnable等不随父子级变化而变化,但是OnDisable与OnDestory受到了父子级的影响:**OnDisable:子物体先执行,父物体后执行。OnDestory:父物体先执行,子物体后执行。

OnBecameVisible 和 OnBecameInvisible:当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。

unity中的基本问题

  1. 协程和多线程:多线程程序同时运行多个线程,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。Unity3d没有多线程的概念,不过 unity 也给我们提供了 StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine 为什么叫协同程序呢,所谓协同,就是当你在 StartCoroutine 的函数体里处理一段代码时,利用 yield 语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而 LoadLevelAsync 则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用 loading 条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜。
  2. Unity是可以支持多线程的,但是如果使用多线程的时候,只能使用主线程中访问Unity3D的组件,对象和 Unity3D 系统调用。
  3. 在场景中加载数据可以使用:Resource.Load和AssetBundle.Load
  4. 物体碰撞会经过:OnCollisionEnter/Stay/Exit函数这三个阶段
  5. 施加力的方式:rigidbody.AddForce/AddForceAtPosition,都是 rigidbody 的成员函数
  6. 围绕着某点旋转:transform.RotateAround。
  7. update、fixedupdate和lateupdate,Update()每一帧的时间不固定,即第一帧与第二帧的时间t1和第三帧与第四帧的时间t2不一定相同。FixedUpdate()每帧与每帧之间相差的时间是固定的。update的执行会受到渲染的物体个数的影响,所以我们一些物理属性的更新操作应该放在FxiedUpdate中操作,比如Force,Collider,Rigidbody等。外设的操作也是,比如说键盘或者鼠标的输入输出Input,因为这样GameObject的物理表现的更平滑,更接近现实。LateUpdate是在所有Update函数调用后被调用。可用于调整脚本执行顺序。现在假设有2个不同的脚本同时在Update中控制一个物体,那么当其中一个脚本改变物体方位、旋转或者其他参数时,另一个脚步也在改变这些东西,那么这个物体的方位、旋转就会出现一定的反复。如果还有个物体在Update中跟随这个物体移动、旋转的话,那跟随的物体就会出现抖动。 如果是在LateUpdate中跟随的话就会只跟随所有Update执行完后的最后位置、旋转,这样就防止了抖动。Update是在每次渲染新的一帧的时候才会调用。
  8. 协同程序:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。
  9. localPosition和position:localPosition:自身位置,相对于父级的变换的位置。 Position:在世界坐标 transform的位置。
  10. Mathf.Round四舍五入,Mathf.Clamp限制,Mathf.Lerp插值。
  11. 频繁创建一个物体:使用预制体和缓存池。
  12. resource目录:resource一般用来放置一些需要动态加载的资源,打包程序的时候会将Resource目录下的全部文件都加密压缩打进包内,这样再想使用assetbundle方式打小包的话就不行了。
  13. meshrender,material,shader:Shader(着色器)实际上就是一小段程序,它负责将输入的 Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的 Shader,以及对 Shader 的特定的参数设置,将这些内容(Shader 及输入参数)打包存储在一起,得到的就是一个 Material(材质).
  14. unity摄像机:perspective透视摄像机和orthographic正交摄像机

在使用Unity时遇到的问题

  1. 打开unity项目,发现没有自动打开unity c#项目,而是只打开了这一个脚本文件,这怎么和打开其他unity项目不一样啊?原来发现unity->edit->preferences->external tools->external script editor 默认竟然不是vs,在这里改成vs就行了。