一、Unity基础—脚本的生命周期

一个游戏组件的脚本有一个生命周期——一开始实例化,直到结束实例被销毁。在这期间,他们有时候处于激活状态,有时候处于非激活状态;对于激活状态,对用户有时候可见,有时候不可见

转自雨松MOMO

下面详解编程过程中常用的方法:

1)void Reset()

Reset是在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。
Reset最常用于在检视面板中给定一个最常用的默认值。

using UnityEngine;
using System.Collections;
public GameObject target;
void Reset() {          
  target = GameObject.FindWithTag("Player");
}
2)void Awake()

1.当一个脚本实例被载入时Awake被调用。Awake用于在游戏开始之前初始化变量或游戏状态。
在脚本整个生命周期内它仅被调用一次Awake在所有对象被初始化之后调用,所以可以安全的与其他对象对话或用诸如 GameObject.FindWithTag 这样的函数搜索它们。Awake像构造函数一样只被调用一次。
2.每个游戏物体上的Awke以随机的顺序被调用。
3.Awake总是在Start之前被调用。

using UnityEngine;
using System.Collections;
private Transform handAnchor = null;  
void Awake () {
       handAnchor = transform.Find("hand_anchor"); 
    }  

void GetWeapon ( GameObject go ) {  
    if ( handAnchor == null ) {  
        Debug.LogError("handAnchor is null");  
        return;  
    }  
    go.transform.parent = handAnchor;  
}  
3)void OnEnable()

1.当对象变为可用或激活状态时此函数被调用。
2.OnEnable不能用于协同程序。

using UnityEngine;
using System.Collections;
public class OnEnabledTest : MonoBehaviour 
{ 
     void OnEnable() {  
        Debug.Log("script was enabled");
     }
}
4)void Start()

1.Start仅在Update函数第一次被调用前调用。
2.Start在behaviour的生命周期中只被调用一次。
3.它和Awake的不同是Start只在脚本实例被启用时调用。
4.可以按需调整延迟初始化代码。
5.Awake总是在Start之前执行。
6.允许你协调初始化顺序。
初始化目标变量, 目标是私有的并且不能在检视面板中编辑

using UnityEngine;
using System.Collections;
public class StartTest : MonoBehaviour 
{ 
     private GameObject target; 
    void Start()
    {   
        target = GameObject.FindWithTag("Player");
    }
}
5)void FixedUpdate()

1.固定更新void FixedUpdate ()处理基于物理游戏行为一般用该方法处理Rigidbody时,需要用FixedUpdate代替Update。当MonoBehaviour启用时,其 FixedUpdate 在每一帧被调用。
ps.例如:给刚体加一个作用力时,必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)每帧应用一个向上的力到刚体上

using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour
{   
     void FixedUpdate() 
     {      
          rigidbody.AddForce(Vector3.up);
     }
}
6)void OnTriggerXXX (Collider other)
  1. 进入触发器void OnTriggerEnter (Collider other)
    当Collider(碰撞体)每进入trigger(触发器)时调用OnTriggerEnter。
  2. 逗留触发器void OnTriggerStay (Collider other)
    当碰撞体接触触发器时,OnTriggerStay将在每一帧被调用。
  3. 退出触发器void OnTriggerExit (Collider other)
    当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
    void OnTriggerEnter(Collider other) {
        Debug.Log("进入触发器");
    }
    void OnTriggerStay(Collider other) {
        Debug.Log("停留在触发器内");
    }
    void OnTriggerExit  (Collider other) {
        Debug.Log("离开触发器");
    }
}
7)void OnCollisionXXX (Collision collisionInfo)
  1. 进入碰撞 void OnCollisionEnter (Collision collisionInfo),
    当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionEnter将会在开始碰撞时调用。
  2. 逗留碰撞 void OnCollisionStay (Collision collisionInfo),
    当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionStay将会在每一帧被调用。
  3. 退出碰撞 void OnCollisionExit (Collision collisionInfo),
    当此collider/rigidbody停止触发另一个rigidbody/collider时,OnCollisionExit将被调用。
    Collision包含接触点,碰撞速度等细节。如果在函数中不使用碰撞信息,省略collisionInfo参数以避免不必要的运算.
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
    void OnCollisionEnter (Collision collisionInfo) {
        Debug.Log("进入碰撞体");
    }
    void OnCollisionStay (Collision collisionInfo) {
        Debug.Log("停留在碰撞体内");
    }
    void OnCollisionExit (Collision collisionInfo) {
        Debug.Log("离开碰撞体");
    }
}
碰撞休眠机制

当刚体空闲时,如一个掉到地板上的盒子,他们就会开始休眠。休眠是性能优化的一个策略,即物理引擎不会处理那些处于休眠中的刚体。这样一来,只要某刚体在正常情况下不移动,那么你可以在你的场景中添加大量的该刚体。
刚体休眠完全自动发生。只要刚体的速度低于sleepAngularVelocity和sleepVelocity,该刚体就会开始休眠。其空闲一些帧后,就会被设置成休眠状态。处于休眠状态中的物体,不会再对其进行碰撞检测和模拟。这会节约大量的CPU开销。
所以如果你想使某个刚体进入睡眠,那么在他们将要进入休眠模式时不要更改他们的属性或者添加任何外力。
你可以调节两个变量来确保刚体自动进入睡眠,
这两个变量是:Rigidbody.sleepVelocity和Rigidbody.sleepAngularVelocity。这两个变量的初始值即分别为物理管理器中的sleepVelocity和sleepAngularVelocity的值(编辑->项目设置->物理)。

8)void OnMouseXXX ()

1.void OnMouseUp ():当用户释放鼠标按钮时调用OnMouseUp。OnMouseUp只调用在按下的同一物体上。
2.void OnMouseDown ():当鼠标在GUIElement(GUI元素)或Collider(碰撞体)上点击时调OnMouseDown。
3.void OnMouseEnter ():当鼠标进入到GUIElement(GUI元素)或Collider(碰撞体)中时调用OnMouseEnter。
4.void OnMouseExit ():当鼠标移出GUIElement(GUI元素)或Collider(碰撞体)上时调用OnMouseExit。
5.void OnMouseOver ()当鼠标悬浮在GUIElement(GUI元素)或Collider(碰撞体)上时调用 OnMouseOver 。

9)void Update()
  1. 当MonoBehaviour启用时,其Update在每一帧被调用。
    Update是实现各种游戏行为最常用的函数。
using UnityEngine;
using System.Collections;
public class UpdateTest : MonoBehaviour 
{   
   void Update() {      
      transform.Translate(0, 0, Time.deltaTime * 1);
   }
}
10)void LateUpdate()
  1. 当Behaviour启用时,其LateUpdate在每一帧被调用。
  2. LateUpdate是在所有Update函数调用后被调用。
  3. 这可用于调整脚本执行顺序。
    ps:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。
using UnityEngine;
using System.Collections;
public class UpdateTest : MonoBehaviour 
{   
   void LateUpdate() {      
      Debug.Log("常用于跟随物体移动");
   }
}
11)void OnGUI ()
  1. 界面void OnGUI ()
    渲染和处理GUI事件时调用。
using UnityEngine;
using System.Collections;
void OnGUI(){ 
     Rect rect = new Rect(10,10,150,60);
     bool isClicked=GUI.Button(rect,"开始"); 
     if(isClicked){
           
     }  
  }
12)void OnGUI ()
  1. 当玩家暂停发送给所有游戏对象。
    OnApplicationPause 可以作为协同程序,在函数中简单使用yield状态。如果作为协同执行,它将在初始帧中再次被计算:首先作为一个早期的通知,第二次在正常协同更新步骤。
public class ExampleClass : MonoBehaviour {
    public bool paused;
    void OnGUI() {
        if (paused)
            GUI.Label(new Rect(100, 100, 50, 30), "Game paused");

    }
    void OnApplicationPause(bool pauseStatus) {
        paused = pauseStatus;
    }
}
13)void OnDisable ()
  1. 当对象变为不可用或非激活状态时此函数被调用。当物体被销毁时它将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable将被调用,OnEnable在脚本被载入后调用。
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void OnDisable() {
        print("script was removed");
    }
}
14)void OnDestroy()
  1. 当MonoBehaviour将被销毁时,这个函数被调用。OnDestroy只会在预先已经被激活的游戏物体上被调用
    OnDestroy不能用于协同程序。
using UnityEngine;
using System.Collections;
 
public class ExampleClass : MonoBehaviour {
    void OnDestroy() {
        print("Script was destroyed");
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容