unity引擎基础
unity引擎基础
生命周期
- Reset 是在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个最常用的默认值。
- Awake 用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次,当脚本设置为不可用时,运行时Awake方法仍然会执行一次。Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如 GameObject.FindWithTag 这样的函数搜索它们。每个游戏物体上的Awke以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息 ,Awake总是在Start之前被调用。它不能用来执行协同程序。
- OnEnable当对象变为可用或激活状态时被调用事件监听。
- Start 在behaviour的生命周期中只被调用一次。它和Awake的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码。Awake总是在Start之前执行。这允许你协调初始化顺序。
- FixedUpdate 当MonoBehaviour启用时,其在每一帧被调用。处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)。
- Update 是实现各种游戏行为最常用的函数。
- LateUpdate 每帧调用一次(在 在所有Update函数调用后被调用) 用于更新游戏场景和状态,和摄像机相关的更新。 官网上例子是摄像机的跟随,都是所有的Update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
- OnGUI 渲染和处理GUI事件时调用。这意味着你的OnGUI程序将会在每一帧被调用。要得到更多的GUI事件的信息查阅Event手册。如果Monobehaviour的enabled属性设为false,OnGUI()将不会被调用。
- OnDisable 不能用于协同程序。当对象变为不可用或非激活状态时此函数被调用。
- OnDestroy 当对象被销毁时调用。
- OnApplicationQuit 当用户停止运行模式时在编辑器中调用。当web被关闭时在网络播放器中被调用。
移动相机动作在哪个函数里,为什么在这个函数里?
LateUpdate,是在所有的Update结束后才调用,比较适合用于命令脚本的执行。
官网上例子是摄像机的跟随,都是所有的Update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。物理更新一般放在哪个系统函数里?
在Unity中,物理更新通常放在FixedUpdate
函数中,而不是放在Update
函数中。Update
函数是每一帧都会调用的函数,用于处理物体的位置、旋转和缩放等变换,但它不适用于物理计算,因为它的执行频率高于FixedUpdate
。
FixedUpdate
函数在每一帧的固定时间间隔内调用,用于执行物理模拟和碰撞检测。因此,如果你的代码涉及到物理模拟或碰撞检测,应该放在FixedUpdate
函数中。
物理
- Unity3D中的碰撞器和触发器的区别?
答:碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器。
碰撞器 | 触发器 |
---|---|
当两个物体碰撞时,会触发物理引擎的碰撞响应(如反弹、摩擦力)。 | 不触发物理碰撞响应,物体可以互相穿透。 |
需要至少一个物体附加 Rigidbody 组件。 | 同样需要至少一个物体附加 Rigidbody 组件。 |
碰撞后根据物理材质(Physics Material)计算力的作用。 | 无力的计算,仅触发事件。 |
- 物体发生碰撞的必要条件?
答:两个物体都必须带有碰撞器Collider,其中一个物体还必须带有Rigidbody刚体。
光照
Unity提供了几种光源,分别是什么?
四种。
- 平行光:Directional Light
- 点光源:Point Light
- 聚光灯:Spot Light
- 区域光源:Area Light
资源加载
- 简述prefab的用处
在游戏运行时实例化,prefab相当于一个模板,对你已经有的素材、脚本、参数做一个默认的配置,主要用于经常会用到的物体做成一个集合方便反复使用,以便于以后的修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。
- 动态加载资源的方式?
- instantiate:最简单的一种方式,以实例化的方式动态生成一个物体。
- Assetsbundle:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object,unity官方推荐也是绝大多数商业化项目使用的一种方式。
- Resource.Load:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不管有没有场景引用,都会将其全部打入到安装包中
- AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的。