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的执行顺序
第一阶段:初始化
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();
}