PS:第二天,依舊在摸魚(yú)學(xué)unity
一、組件的概念
我本身是由Web后端轉(zhuǎn)到了游戲后端,最近因?yàn)楣ぷ髟蛟趯W(xué)ET框架。學(xué)到了 ECS 編程模式開(kāi)發(fā)(E —— Entity,C —— Component , S —— System)實(shí)體、組件、邏輯開(kāi)發(fā)。
我是這么理解的:組件是掛載到實(shí)體上的,組件中記錄了實(shí)體所需要的數(shù)據(jù),然后實(shí)體的業(yè)務(wù)和行為在邏輯里編寫(xiě)。
舉個(gè)例子:關(guān)羽拿青龍偃月刀斬了顏良,這里關(guān)羽看做實(shí)體,青龍偃月刀作為組件掛載在關(guān)羽身上,斬顏良是實(shí)體關(guān)羽所做出來(lái)的行為動(dòng)作。
偷的表情包(手動(dòng)狗頭)
?那么問(wèn)題來(lái)了:關(guān)羽可以拿刀砍人;我可以拿刀砍人;在看博客的你也可以拿刀砍人,難不成每次寫(xiě)程序都要新寫(xiě)一個(gè)刀組件?
寫(xiě)程序就要學(xué)會(huì)偷懶,游戲引擎的開(kāi)發(fā)者們就把一些可以共用的組件抽出來(lái),比如Unity里的Box Collider? ——? 碰撞組件、Rigidbody? ——? 重力組件(剛學(xué)Unity第二天一共就知道這倆 —— doge.jpg)
二、創(chuàng)建新組件并掛載
說(shuō)到這里大家大概明白什么是組件了吧,這里我們創(chuàng)建一個(gè)新組件。在項(xiàng)目一欄的空白處點(diǎn)擊鼠標(biāo)右鍵創(chuàng)建一個(gè)C#腳本,我這里給它命名為Move。
如果我們想把組件添加到實(shí)體上,我目前知道的有三種方式
?或者點(diǎn)擊添加組件按鈕進(jìn)行搜索
?這樣我們就把組件掛到實(shí)體上了。
三、組件的生命周期函數(shù)
說(shuō)完了怎么掛載組件我們正式進(jìn)入正題,來(lái)談?wù)劷M件的生命周期。所謂生命周期就是一個(gè)事物由創(chuàng)建到銷毀的全過(guò)程。
我們雙擊打開(kāi)創(chuàng)建好的C#腳本,它會(huì)打開(kāi)編輯器,我這里用的是visual studio,打開(kāi)后會(huì)看到下邊這段代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move: MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
?這里的? Start() 和 Update() 是生命周期中的兩種函數(shù),此外還有?Awake()?、OnEnable()?、LateUpdate()?、FixedUpdate()?、OnDisable()?、OnDestroy()???,一共八種,我們來(lái)看一下這些生命周期函數(shù)。
3.1? Awake()
Awake? ——? 喚醒,這是當(dāng)組件掛載在實(shí)體上第一個(gè)要執(zhí)行的函數(shù),慶祝誕生。我們來(lái)把 Debug.Log("awake");?? 的注釋解開(kāi)在控制臺(tái)打印輸出一下看看。
很簡(jiǎn)單接著往下看?
3.2 OnEnable()
OnEnable()??函數(shù)在Awake執(zhí)行之后執(zhí)行,每次激活組件都會(huì)調(diào)用一次,打印一下Log日志
看起來(lái)不難,但是這里的每次激活組件都會(huì)調(diào)用一次
每次激活??都會(huì)調(diào)用一次?? 來(lái)詳細(xì)看,這個(gè)Move腳本旁邊的? ?“√”? ?勾上就是激活,不勾就是不激活,我們反復(fù)勾一下可以看到下邊控制臺(tái)? awake? 只執(zhí)行了一次,而??OnEnable? 執(zhí)行了多次,這就是所謂的??每次激活組件都會(huì)調(diào)用一次。
3.3??Start()
?調(diào)用時(shí)機(jī)是第一次 OnEnable() 調(diào)用之后,只調(diào)用一次
我們來(lái)打印輸出一下:
反復(fù)激活后可以看到 Start()只執(zhí)行了一次。
3.4? Update()
Update() 每幀都會(huì)調(diào)用一次,幀數(shù)就是在1秒鐘時(shí)間里傳輸?shù)膱D片的數(shù)量 和電腦的性能有關(guān)
可以看到我剛運(yùn)行一會(huì)就打印了一千多次了
3.5?LateUpdate()
LateUpdate(),看函數(shù)名就能猜出大概的作用,在 Update() 函數(shù)執(zhí)行之后執(zhí)行
3.6?FixedUpdate()
FixedUpdate()? 每隔固定的時(shí)間間隔都會(huì)運(yùn)行一次,和幀無(wú)關(guān)。
我第一次學(xué)這個(gè)函數(shù)的時(shí)候差點(diǎn)和? Update()? 混了。
舉個(gè)例子: 當(dāng)用?Update() 函數(shù)的時(shí)候,關(guān)羽每秒可以砍 60 個(gè)人,而我每秒只能砍一個(gè)人還差點(diǎn)被反殺。
而當(dāng)用? FixedUpdate()? 函數(shù)的話我和關(guān)羽每秒砍的人數(shù)就一樣了? ?約等于? ?我和關(guān)羽一樣強(qiáng)(doge.jpg)
FixedUpdate() 函數(shù)默認(rèn)每隔0.02秒執(zhí)行一次。這里我們可以修改執(zhí)行的時(shí)間間隔? ——??在unity界面上邊菜單欄里 ?編輯——》 項(xiàng)目設(shè)置 ——》 時(shí)間 ——》 固定時(shí)間步進(jìn)
3.7?OnDisable()
非激活狀態(tài)下調(diào)用一次,和OnEnable是相對(duì)的關(guān)系。OnEnable()??函數(shù)懂了大家這個(gè)也就懂了吧??,我們反復(fù)激活,來(lái)打印輸出一下看看
沒(méi)錯(cuò),就是大家想的那樣,激活 OnEnable()就會(huì)執(zhí)行一次,不激活OnDisable() 就會(huì)執(zhí)行一次。
3.8?OnDestroy()
終于最后一個(gè)函數(shù)了,當(dāng)組件銷毀的時(shí)候被調(diào)用,比如進(jìn)行移除組件操作,要死了寫(xiě)遺書(shū)。
我們來(lái)移除組件:
移除后 OnDestory? 就會(huì)打印出來(lái)了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
//組件掛載在實(shí)體上第一個(gè)執(zhí)行的函數(shù),慶祝誕生
private void Awake()
{
Debug.Log("awake");
}
//在Awake執(zhí)行之后執(zhí)行,每次激活組件都會(huì)調(diào)用一次
private void OnEnable()
{
Debug.Log("OnEnable");
}
//唯一調(diào)用的,調(diào)用時(shí)機(jī)是第一次 OnEnable 調(diào)用之后
// Start is called before the first frame update
void Start()
{
Debug.Log("Start");
//Debug.Log("我是move腳本");
}
//每一幀都會(huì)調(diào)用一次,幀和電腦性能有關(guān)
// Update is called once per frame
void Update()
{
//Debug.Log("Update");
}
//Update每次執(zhí)行完都會(huì)跟著執(zhí)行一次
private void LateUpdate()
{
//Debug.Log("LateUpdate");
}
//和幀無(wú)關(guān),每隔固定的時(shí)間間隔都會(huì)運(yùn)行一次,默認(rèn)每隔0.02秒執(zhí)行一次
//在unity界面上邊菜單欄里 編輯——》 項(xiàng)目設(shè)置 ——》 時(shí)間 ——》 固定時(shí)間步進(jìn)
private void FixedUpdate()
{
//Debug.Log("FixedUpdate");
}
//非激活狀態(tài)下調(diào)用一次,和OnEnable是相對(duì)的關(guān)系
private void OnDisable()
{
Debug.Log("OnDisable");
}
//當(dāng)組件銷毀的時(shí)候被調(diào)用,比如進(jìn)行移除組件操作,要死了寫(xiě)遺書(shū)
private void OnDestroy()
{
Debug.Log("OnDestroy");
}
}
四、組件的執(zhí)行順序問(wèn)題
通過(guò)組件的生命周期函數(shù)我們知道了8個(gè)方法在什么情況下會(huì)執(zhí)行以及執(zhí)行的順序,那么組件與組件之間的執(zhí)行順序呢?? ?這是我們通過(guò)設(shè)置腳本執(zhí)行順序來(lái)控制的
我們?cè)賮?lái)創(chuàng)建一個(gè)腳本組件test,分別在Start方法里L(fēng)og輸出一下我是test腳本? 和? 我是Move腳本
然后把這兩個(gè)組件掛載在同一個(gè)實(shí)體上,然后對(duì)執(zhí)行順序進(jìn)行設(shè)置。
?我們打印輸出一下:設(shè)置的數(shù)值越小就越先執(zhí)行
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-781559.html
好了,到此本篇博客知識(shí)點(diǎn)全部講完了,拜拜┏(^0^)┛?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-781559.html
到了這里,關(guān)于Unity之組件的生命周期的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!