1.生命周期
Awake —> OnEnable —> Start —> FixedUpdate —>Update —> LateUpdate—> OnGUl —> OnDisable —> OnDestroy
- Awake :用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次,Awake在所有对象被初始化之后调用,
当脚本设置为不可用时,运行时Awake方法仍然会执行一次。
所以你可以安全的与其他对象对话或用诸如GameObject.FindWithTag 这样的函数搜索它们。每个游戏物体上的Awake以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息,Awake总是在Start之前被调用。它不能用来执行协同程序。
-
OnEnable :当对象变为可用或激活状态时被调用事件监听。
-
Start :在behaviour的生命周期中只被调用一次。它和Awake的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码。Start总是在Awake之后执行。这允许你协调初始化顺序。
-
Update :每帧调用一次用于更新游戏场景和状态,比较适合做控制。
-
FixedUpdate:每隔固定物理时间间隔调用一次用于物理状态的更新,和Update不同的是FixedUpdate逻辑帧,Update是渲染帧。如果帧率很低,可以每帧调用该函数多次;如果帧率很高,可能在帧之间完全不调用该函数。 FixedUpdate 内应用运动计算时,无需将值乘以 Time.deltaTime。这是因为 FixedUpdate 的调用基于可靠的计时器(独立于帧率)。
-
LateUpdate 每帧调用一次(在 update 之后调用) 用于更新游戏场景和状态,和摄像机相关的更新。 官网上例子是摄像机的跟随,都是所有的Update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
-
OnGUI 渲染和处理 OnGUI 事件。
-
OnDisable 当对象变为不可用或非激活状态时被调用事件移除。
-
OnDestroy 当对象被销毁时调用。
2.碰撞
物体发生碰撞的必要条件。
两个物体都必须带有碰撞器Collider,其中一个物体还必须带有Rigidbody刚体。
碰撞器与触发器: 1.碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
- 当ls Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数; 3.当ls Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/lExit函数。
- 如果既要检测到物体的接触,又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域,这时就可以用到触发器。
3.协程
Unity中的协程(Coroutines) 是一种特殊的方法,用于在多个帧中分步执行代码,而不是在一帧中立即执行完毕。协程非常适合处理需要等待或延迟执行的操作,比如等待一段时间、加载资源、或等待某个条件满足等。
基于c#迭代器实现。 内部生成一个状态机类,会保存当前的状态(代码的执行位置),提供current属性返回当前结果。MoveNext方法可以从中断处继续执行。 当你启动一个协程时,它允许你暂停一个方法的执行,稍后再继续执行。 协程不会阻塞主线程,它们只是让方法在每一帧中逐步执行,Unity 在特定时间点会检查并恢复协程的运行。
4.Ugui渲染顺序
1不同的 Camera 的 Depth,值越大越后渲染。
2canvas根据RenderMode不同显示不同属性。当为ScreenSpace-Overlay时,只有sort Order属性,管理不同canvas渲染顺序。其他两种模式有sorting layer和order in layer属性,原因是Screen Space-Overlay渲染模式下,UI元素将在场景的上面,不受sorting layer的影响。
3相同 Camera depth 下的不同 SortingLayer值越大越后面渲染。spriteRender组件也有sortingLyaer。
4Order in Layer在相同sortinglayer也是值越大越后面渲染。
5UGUI画布上面的UI对象的层级关系不受Z轴的影响,按照hierachy层级面板中由上到下的顺序进行渲染。游戏对象层的Z轴影响渲染顺序,渲染优先级处于Camera.depth,sorting layer,order in layer之后。
Tag,layer和sortinglayer
tag主要用于标识和分类游戏物体。简化查找物体和管理。例如:设置enemy和player的tag,分类管理。
layer将对象分层,方便控制对象的物理交互和渲染。例如:在渲染过程中,Layer 可以用来控制哪些对象被哪些相机渲染。例如,可以通过设置不同的 Layer 来优化场景的渲染效率,仅渲染需要显示的对象;在 Physics 设置中配置 Layer 碰撞矩阵,开发者可以指定哪些 Layer 之间可以发生碰撞,而哪些 Layer 之间不能发生碰撞。
sortinglayer:Sorting Layer 是 Unity 中特有的一个功能,用于控制 2D 游戏中图层的渲染顺序。 与传统的 Layer 不同,Sorting Layer 专门用于处理 2D 图形的绘制顺序,从而确保不同图层的元素能够按预期显示。
5.不同分辨率保持UI一致性
1.解决多分辨率下UI的相对位置保持不变,就是改变锚点位置就可以解决。
2.解决多分辨率下UI的大小尺寸保持不变,也就是适配尺寸。Unity中Canvas的大小不能直接修改,需要用Canvas下面的一个组件CanvasScaler来进行修改。
3.CanvasScaler中UI Scale Mode有三种模式,Constant Pixel Size、Scale With Screen Size、Constant Physical Size,其中第二个就是根据屏幕分辨率来进行缩放适配。在这个模式下,有两个参数,一个是我们在开发过程中的标准分辨率,一个是屏幕的匹配模式,通过这里面的设置,就可以完成多分辨率下的适配问题。Expand模式,UI可能会被放大以填充整个屏幕。Match Width or Height根据宽高进行ui的缩放。ui元素通过锚点来调整,如果想要元素在左上角,就把锚点置于左上角。
4.遇到异性界面(刘海屏),unity内置有一个安全区域,它不会被遮挡到。用一个panel作为节点,不想被遮挡的元素都放在panel下面,代码计算panel的位置,正好去覆盖安全区域,这样就解决异形界面问题。
6.Image和Rawlmage的区别
rawimage主要用于显示Texture类型的图像资源。它可以处理较为原始的图像数据,适合放置大背景图。
image可以缩放、拉伸、旋转等高级显示效果,比rawimage更消耗性能,只能使用sprite类型图片
7.unity常用的旋转
1 transform.rotate():增量式旋转,即它会在当前的旋转状态基础上叠加新的旋转,而不是直接设置绝对角度。
// 绕自身 X 轴旋转 45 度
transform.Rotate(new Vector3(45, 0, 0), Space.Self);
// 绕局部 Y 轴旋转 90 度
transform.Rotate(Vector3.up, 90, Space.World);
//围绕某个点的x轴进行旋转
transform.RotateAround(tar.position, Vector3.right, 30*Time.deltaTime);
2 让物体转向目标物体:
lookat(target.position):让物体的z轴指向目标
Quaternion dir= Quaternion.LookRotation(tar.position-transform.position); //得到一个指向目标点的向量
transform.rotation = dir;
Quaternion.LookRotation(forward, up)方法重载:z轴看向forward方向,y轴看向up
8.Prefab的作用:
预制件允许创建、配置和存储游戏对象及其所有组件、属性值和子游戏对象作为可重用资源。Prefab相当于一个模板,在此模板的基础之上可以在场景中创建新的预制件实例。但是不代表所有预制件实例都是完全相同的,可以有预制件的变体