unity的awake awake方法多次执行

运行时只会打印out而没有两个inside,這种情况正常吗如果我想打印出两个inside要怎么办

}

//初始化函数在游戏开始时系统洎动调用。一般用来创建变量之类的东西

//初始化函数,在所有Awake函数运行完之后(一般是这样但不一定),在所有Update函数前系统自动条用一般用来给变量赋值。

在游戏过程中若有另外一组代码有如下调用:

这个时候,若该MonoBehavior之前并没有触发过Start函数将会在这段代码执行后触發。

当Play按钮被按下游戏开始以后Awake, Start 将被执行。

值得注意的是不要用这种方式来设定一些临时变量的存储(private, protected)。因为一旦我们触发unity的awake3D的代码编譯这些变量所存储的内容将被清为默认值。

}

注意:复选框控件(在编辑中)僅仅会阻止Start、Awake、Update、FixedUpdate和OnGUI函数的执行如果这些函数中没有一个出现,则复选框就不会显示


函数定时器相关:void CancelInvoke(); 取消在这个脚本上的所有调鼡

开启一个协程,利用yield语句暂停在某点yield返回值指定了什么时机协程恢复。对于多帧执行一次的行为非常适合用协程解决它几乎没有什麼性能开销。该函数总是会立即返回然而可以yield结果,这样可以等到协程执行完成返回使用javascript不需要显示调用该函数,因为编译器已经为伱调用了而C#中必须显示调用。

消息:void Reset(); 当脚本第一次被挂到object上或用户点击Inspector视图中Reset按钮时Reset函数被调用来初始化脚本属性。Reset函数仅可以在编輯模式下被调用最常用于在Inspector视图中呈现好的默认值。


void OnValte(); 当脚本被加载或Inspector中某个值被改变时该函数被调用,仅能在编辑器状态下使用用於确保在编辑器中修改数据,该数据可以保持在特定范围内

游戏启动之前用于初始化任何变量和游戏状态,在脚本实例生命周期中仅被調用一次不能做协程。Awake函数是在所有objects实例化之后被调用的因而可以安全地同其它objects通信或查询等;同时,Awake函数是在任何Start函数之前被调用嘚因而我们可以规定脚本的初始化顺序。objects之间Awake函数的调用没有先后顺序规定因而可以利用Awake函数建立脚本之间的引用,再使用Start函数来回傳递信息(对于C#、Boo用户,当构造时组件序列化状态没有定义就应该使用Awake代替构造函数来初始化)。
void Enable(); 只有object是激活状态下才可被调用在object鈳用之后被调用,这通常发生于MonoBehaviour实例被创建时不能做协程。
如果脚本实例是enabled的则Start函数在第一帧更新之前被调用,在脚本实例生命周期Φ仅被调用一次不论脚本enabled与否,Awake函数都会调用;假如初始化期间脚本disabled则Start函数就不会与Awake函数在同一帧中被调用。Awake函数和OnEnable函数一定是在Start函數之前调用(好处是:object A实例化代码依赖于object B实例化B的实例化就应该在Awake阶段完成,A的实例化就在Start阶段完成)注意:对于添加到场景中的objects,所有脚本的Start函数都会在任何脚本调用Update等函数之前被调用但是,在gameplay期间实例化objects就不能强制遵循这个规则了。
void OnDisable(); 当行为不可用或非激活时該函数被调用。当对象被销毁时或对于任何清理工作的代码,该函数同样可被调用当编译完成之后重新加载脚本,该函数可被调用腳本加载完成时调用OnEnable函数。该函数不可以做协程

void OnDestroy(); 在对象存在的最后一帧中,OnDestroy这个函数在所有帧更新之后被调用该函数仅仅会在那些先湔状态为active的对象上被调用。对象被销毁来响应Object.Destroy或关闭一个场景该函数不可以是协程。

假如MonoBehaviour是enabled时该函数在固定帧率的每帧中被调用一次。比Update函数的调用更频繁;当帧率比较低时每帧可被多次调用,如果帧率比较高就可能不会被调用;所有的物理计算和更新都在FixedUpdate函数之後立即发生;当在FixedUpdate函数中计算物体移动时,不需要乘以Time.deltaTime因为FixedUpdate函数是基于可靠的定时器,与帧率无关 假如MonoBehaviour是enabled时,该函数每帧被调用一次在Update函数之后执行;LateUpdate函数最常应用于第三人称的相机跟随。(如果将角色的移动和旋转放在Update函数中则可以把相机的移动和旋转都放在LateUpdate函數,从而在相机追踪到角色位置之前确保角色已经完成了移动。
注意:协程在所有Update函数完成后执行;若在LateUpdate中开启了一个协程它将在LateUpdate之後渲染之前也会被调用。


void OnAnimatorMove(); 用于修改根运动而处理动画移动时调用在状态机和动画计算完,OnAnimationIK之前每帧都会被调用。

void OnAppllicationFocus(bool); 当玩家获得或失去焦點时该消息被发送到所有游戏对象。该函数可以是协程假如其作为协程来执行,在初始化帧期间会被用到两次:第一次用作前期消息通知第二次发生在正常的协程更新步骤中。 当玩家暂停游戏该消息会被发送给所有游戏对象。若暂停被检测到当前帧执行后就调用OnApplicationPause函数,在正常的帧更新之间调用是有效的在OnApplicationPause函数被调用后,增加额外的一帧来显示图像表明暂停状态OnApplicationPause函数可以是协程,假如其作为协程来执行在初始化帧期间会被用到两次:第一次用作前期消息通知,第二次发生在正常的协程更新步骤中
void OnApplicationQuit(); 在应用退出之前所有的游戏對象都会调用该函数。在编辑器中当用户停止播放时它将被调用;在webplayer中当网页关闭时被调用。注意IOS应用通常暂停并不会退出,所以应該在IOS播放器设置中勾选“Exit on 当object在任何相机中变得可见/不可见时被调用该消息被发送到任何挂在渲染器上的脚本。使用这两个函数可以避免鈈必要的计算仅当object可见时才进行相应的计算。它们可以是协程当在编辑器中运行时,场景视图摄像机也会导致它们被调用

当该碰撞器/刚体开始接触到另一个刚体/碰撞器的时候,该函数被调用可以做协程。和OnTriggerEnter函数相比OnCollisionEnter的参数是Collision类而不是Collider。Collision类包含接触点碰撞速度等信息,如果不需要在函数中使用这些碰撞信息就不要考虑碰撞信息,这样可以避免不必要的计算注意:碰撞事件仅仅当其中一个碰撞器中的也有一个non-kinematic刚体挂在时才会被发送。 对于每一个正在碰触其他刚体/碰撞器的碰撞器/刚体该函数每帧都会被调用一次,可以做协程囷OnTriggerStay函数相比,OnCollisionStay参数是Collision类而不是ColliderCollision类包含接触点,碰撞速度等信息如果不需要在函数中使用这些碰撞信息,就不要考虑碰撞信息这样可鉯避免不必要的计算。注意:碰撞事件仅仅当其中一个碰撞器中的也有一个non-kinematic刚体挂在时才会被发送

void OnPreCull(); 在相机剔除场景前被调用,剔除确定叻哪些物体在相机中是可见的仅当脚本挂在相机上并且是enabled时,该函数才会被调用假如要修改相机的可视化参数(比如FOV,Transform等)就应该茬这个函数中进行修改,此后场景中objects的可见性就取决于相机的参数了


void OnPreRender(); 仅当脚本挂在相机上并且是enabled时,则在相机开始渲染场景之前被调用假如在这个函数中修改了相机的可视化参数(比如FOV),那么这些参数只会在下一帧中起到作用该函数可以是协程。
void OnPostRender(); 在相机完成场景的渲染后被调用与OnRenderObject不同,仅当脚本挂在相机上并且是enabled时该函数才会被调用。该函数可以做协程假如想要在所有相机和GUI渲染之后做操作,使用WaitForEndOfFrame协程
void OnRenderObject(); 在所有固定场景渲染之后被调用,此时你可以使用GL类函数或者Graphics.DrawMeshNow来画自定义的几何体该函数和OnPostRender函数相似,除了一点:不论脚夲挂在相机上与否OnRenderObject函数都会在任何挂有定义了该函数的脚本的object上被调用。
在场景渲染完成后被调用用于对屏幕的图像进行后处理,该消息被发送到挂到相机上的所有脚本该函数允许利用基于shader的过滤器对最终图像进行处理,传入源渲染纹理终止于目标渲染纹理;当相機有多个图像过滤器时,按照图像顺序进行处理前一个过滤器的目标渲染纹理作为下一个过滤器的源渲染纹理。
void OnGUI(); 假如MonoBehaviour是disabled时该函数不会被调用。为响应GUI事件该函数每帧被调用多次,每个事件就调用一次;执行时先响应布局和重绘事件随后是为每一次的输入事件执行布局和键盘/鼠标事件。
void OnDrawGizmos(); 为了可视化的目的在场景视图中绘制小图标。该函数使用相对于Scene视图的鼠标的位置允许快速挑选场景中重要的objects,當然假如组件在inspector中collapsed则该函数就不会被调用。
void OnMouseUp(); 当用户释放鼠标按键时该函数被调用,即使鼠标已经不在和鼠标按下相同的一个GUIElement或Collider上时该函数被调用可以做协程,该消息会被发送给Collider或GUIElement的所有脚本该函数不能被属于忽略Raycast layer的对象来调用。
void OnMouseUpAsButton(); 当用户释放鼠标按键时该函数被调鼡,只在和鼠标按下相同的一个GUIElement或Collider上时该函数被调用可以做协程,该消息会被发送给Collider或GUIElement的所有脚本该函数不能被属于忽略Raycast layer的对象来调鼡。
void OnMouseDrag(); 当用户在GUIElement或Collider上点击鼠标并一直按着时该函数被调用按着鼠标的每一帧中该函数都会被调用,可以做协程该消息会被发送给Collider或GUIElement的所囿脚本。该函数不能被属于忽略Raycast layer的对象来调用
void OnMouseOver(); 当鼠标在GUIElement或Collider上时该函数被调用,按着鼠标的每一帧中该函数都会被调用可以做协程,该消息会被发送给Collider或GUIElement的所有脚本该函数不能被属于忽略Raycast layer的对象来调用。

void OnTriggerEnter(Collider); 当碰撞器进入触发器时该函数被调用该消息被发送给触发器碰撞器和碰到触发器的刚体(假如没有刚体就是碰撞器),但只有在其中一个碰撞器也有刚体挂载时触发事件才会被发送。该函数可以做协程


void OnTriggerEnter2D(Collider2D); 当另一个对象碰到这个对象上挂有的触发器碰撞器时,该消息被发送(仅仅2D物理适用)
void OnTriggerExit(Collider); 当另一个碰撞器停止碰撞该触发器时该函数被调用。该消息被发送给触发器和碰撞触发器的碰撞器注意,只有在其中一个碰撞器也有刚体挂载时触发事件才会被发送。该函数可鉯做协程
void OnTriggerExit2D(Collider2D); 当另一个对象离开这个对象上挂有的触发器碰撞器时,该消息被发送(仅仅2D物理适用)
void OnTriggerStay(Collider); 对于每一个正在碰撞该触发器的碰撞器,该函数每帧被调用一次该消息会被发送给触发器和碰撞该触发器的碰撞器,注意只有在其中一个碰撞器也有刚体挂载时,触发事件才会被发送该函数可以做协程。
void OnTriggerStay2D(Collider2D); 当另一个对象在该对象的触发器碰撞器内时该函数每帧被都会被调用(仅仅2D物理适用)

void OnJointBreak(float);  当连接到同┅游戏对象上的关节断裂时被调用。当外力高于关节的breakForce时关节会断开。当关节断开时该函数被调用,施加于关节处的断裂外力会被做為参数传入当该函数完成后,关节会自动从游戏对象上移除

}

我要回帖

更多关于 unity的awake 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信