update和fixedUpdate的区别

Update是每一帧执行之前都要执行,Update的执行频率取决于系统硬件;fixedUpdate是单位时间内执行一次。 一般物理模拟放在FixedUpdate中。

unity线程

Unity3D是否支持写成多线程程序?如果支持的话需要注意什么? 答:仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用。 Unity所有的Update操作都是串行执行的,由主线程负责执行。Update阻塞会导致UI卡顿。 Unity一般不使用多线程,而是使用协程。 Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。

unity的MonoBehavior的运行机制

多个GameObject的Update函数是串行执行的,它们都处于同一个线程里面。 Unity会维护一个GameObjectList,在每一帧中,写一个for循环串行执行。因此无论如何都不应该阻塞Monobehavior。 for obj in GameObjectList: for behavior in obj.BehaviorList: behavior.Update()

mono behavior的回调

  • Awake:当一个脚本实例被载入时Awake被调用。我们大多在这个类中完成成员变量的初始化
  • Start:仅在Update函数第一次被调用前调用。因为它是在Awake之后被调用的,我们可以把一些需要依赖Awake的变量放在Start里面初始化。 同时我们还大多在这个类中执行StartCoroutine进行一些协程的触发。要注意在用C#写脚本时,必须使用StartCoroutine开始一个协程,但是如果使用的是JavaScript,则不需要这么做。
  • Update:当MonoBehaviour启用时,其Update在每一帧被调用。
  • FixedUpdate:当MonoBehaviour启用时,其 FixedUpdate 在每一固定帧被调用。
  • OnEnable:当对象变为可用或激活状态时此函数被调用。
  • OnDisable:当对象变为不可用或非激活状态时此函数被调用。
  • OnDestroy:当MonoBehaviour将被销毁时,这个函数被调用。

Unity Fps

第一步,在PlayerSettings中关掉VSyncCount [图片] 第二步,在脚本中设置帧率

using UnityEngine;
using System.Collections;

/// <summary>
/// 功能:修改游戏FPS
/// </summary>
public class UpdateFrame : MonoBehaviour
{
    //游戏的FPS,可在属性窗口中修改
    public int targetFrameRate = 300;

    //当程序唤醒时
    void Awake ()
    {
        //修改当前的FPS
        Application.targetFrameRate = targetFrameRate;
    }

}

第三步,把显示帧率的脚本挂载某个游戏对象上

@script ExecuteInEditMode

private var gui : GUIText;

private var updateInterval = 1.0;
private var lastInterval : double; // Last interval end time
private var frames = 0; // Frames over current interval

function Start()
{
    lastInterval = Time.realtimeSinceStartup;
    frames = 0;
}

function OnDisable ()
{
    if (gui)
    DestroyImmediate (gui.gameObject);
}

function Update()
{
#if !UNITY_FLASH
    ++frames;
    var timeNow = Time.realtimeSinceStartup;
    if (timeNow > lastInterval + updateInterval)
    {
        if (!gui)
        {
            var go : GameObject = new GameObject("FPS Display", GUIText);
            go.hideFlags = HideFlags.HideAndDontSave;
            go.transform.position = Vector3(0,0,0);
            gui = go.guiText;
            gui.pixelOffset = Vector2(5,55);
        }
        var fps : float = frames / (timeNow - lastInterval);
        var ms : float = 1000.0f / Mathf.Max (fps, 0.00001);
        gui.text = ms.ToString("f1") + "ms " + fps.ToString("f2") + "FPS";
        frames = 0;
        lastInterval = timeNow;
    }
#endif
}

移动相机动作在哪个函数里,为什么在这个函数里?

LateUpdate,是在所有的Update结束后才调用,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是所有的Update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。

脚本的执行顺序

往一个GameObject上挂载多个MonoBahavior,它们的执行顺序是怎样的? 执行顺序与添加顺序一致。 如果往不同GameObject上挂载多个Monobehavior,它们的执行顺序是怎样的? 不确定。可以在项目配置中设置脚本执行命令。

一个MonoBehavior的执行顺序

img.png

img_1.png

第一阶段:初始化

Awake、onEnable、Start

第二阶段:物理层

FixedUpdate、OnTriggerXXX、OnCollisionXXX

第三阶段:输入事件

OnMounseXXX

第四阶段:游戏逻辑

Update 调用过去的协程yield LateUpdate

第五阶段:场景渲染

  • OnWillRenderObject
  • OnPreCull
  • OnBecameVisisible
  • OnBecameInvisible
  • OnPreRender
  • OnRenderObject
  • OnPOstRender
  • OnRenderImage

OnApplicationFocus

unity从后台切换到前台的时候调用

FixedUpdate和Update的区别

FixedUpdate比Update调用频率更高。

Unity PlayMode下场景加载之后

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
    static void Initializing()
    {
        ShootsStub.GetInstance();
    }