Unity學(xué)習(xí)筆記04腳本編程
1.腳本使用代碼來實現(xiàn)具體功能
2.腳本作為組件掛接到游戲物體上
3.腳本中的某些參數(shù)可以通過組件來便于修改
繼承于 MonoBehaviour 類的腳本可以掛接給unity中的游戲物體,成為一個組件。
public class first : MonoBehaviour
重要函數(shù)或類
Transform類
1.物體的位置,旋轉(zhuǎn)和縮放控制。
2.場景中的每個物體都會包含這個組件。
3.可以構(gòu)造層次化(有父物體或者子物體)。
更新函數(shù)
Update
刷新每一幀的時候都會執(zhí)行,在渲染和計算動畫之前,(比如GameObject和transform相關(guān)的改變都可以寫在這里)
FixedUpdate
物理引擎更新時候執(zhí)行,執(zhí)行頻率是固定的,不同于渲染更新,給予物理體的操作寫在這個函數(shù)里,一般用來完成跟物理更新有關(guān)的操作。
LateUpdate
執(zhí)行是在Update和FixedUpdate之后,應(yīng)用于要確保需要最后更新的場景(如攝像機(jī)要一直面朝某一個場景中的游戲物體,需要等場景物體運動計算完成后再改變攝像機(jī)的朝向)
初始化函數(shù)
Awake
相當(dāng)于構(gòu)造函數(shù)
加:
在腳本實例剛剛被加載時,觸發(fā)Awake。
Start
在物體執(zhí)行第一幀時被調(diào)用
物理相關(guān)函數(shù)
碰撞觸發(fā)響應(yīng)函數(shù),實現(xiàn)多種游戲性。
時間類
1.按照物理公式來進(jìn)行計算,如計算位移要使用速度乘以時間,不應(yīng)該直接使用基于幀的計算。
2.可以縮放時間遲,得到暫停(如慢鏡頭之類的效果)或者“子彈時間”效果。
射線投射
1.用于查詢場景信息(如場景中有哪些物體,用來導(dǎo)航等。發(fā)射的光線擊中的場景物體)
2.實現(xiàn)游戲功能(向著鼠標(biāo)點擊方向發(fā)射物體)
有兩種類型,一是圖形式,用于UI功能實現(xiàn)中。而是物理式,可以用于二維或者三維物理體查詢中
函數(shù)執(zhí)行順序
1.游戲物體之間可能存在依賴關(guān)系。
2.程序操作可能依賴于執(zhí)行前后關(guān)系,比如Awake和Start都可以初始化,但是Awake在Start之前調(diào)用。
Awake-->OnEnable-->Reset-->Start-->FixedUpdate-->,,,,,,,,
//部分記錄
void Start()
? ?{
? ? ? ?Debug.Log("Called Start");
? ?}
? ?private void Awake()
? ?{
? ? ? ?Debug.Log("Called Awake");
? ?}
? ?private void OnEnable()
? ?{
? ? ? ?Debug.Log("Called OnEnable");
? ?}
? ?private void OnLevelWasLoaded(int level)
? ?{
? ? ? ?Debug.Log("Called OnlevelWasLoaded"); ?
? ? ? ?//有新關(guān)卡被載入的時候才會被調(diào)用
? ?}
? ?private void OnApplicationPause(bool pause)
? ?{
? ? ? ?Debug.Log("called pause");
? ? ? ?//當(dāng)游戲被暫停的時候調(diào)用
? ?}
? ?private void OnPreCull()
? ?{
? ? ? ?Debug.Log("called OnPreCul");
? ? ? ?//當(dāng)攝像機(jī)剔除發(fā)送之前被執(zhí)行
? ?}
? ?private void OnWillRenderObject()
? ?{
? ? ? ?Debug.Log("called OnWillRenderObjec");
? ? ? ?//被渲染物體馬上要被渲染的時候執(zhí)行
? ?}
? ?private void OnPreRender()
? ?{
? ? ? ?Debug.Log("called OnPreRender");
? ? ? ?//攝像機(jī)渲染完成前被調(diào)用
? ?}
? ?private void OnPostRender()
? ?{
? ? ? ?Debug.Log("called OnPostRender");
? ? ? ?//攝像機(jī)渲染完成后被調(diào)用
? ?}
? ?//下面三個是關(guān)于物體或者程序的退出的函數(shù)
? ?private void OnDestroy()
? ?{
? ? ? ?
? ?}
? ?private void OnApplicationQuit()
? ?{
? ? ? ?
? ?}
? ?private void OnDisable()
? ?{
? ? ? ?
? ?}
序列化
指的是在游戲保存或者載入過程當(dāng)中,如何對數(shù)據(jù)進(jìn)行操作。
概念
將數(shù)據(jù)結(jié)構(gòu)或?qū)ο鬆顟B(tài)轉(zhuǎn)換為可以存儲和重建的格式的自動過程。
很多引擎功能使用了序列化,保存和載入、屬性面板、實例化和預(yù)制件。
Unity用序列化過程去保存和加載場景,Asset等。
基本中的元素可以序列化規(guī)則
是公有的或者有SerializeField屬性(不能是靜態(tài)的,不能是常量,不能是只讀)
復(fù)合數(shù)據(jù)結(jié)構(gòu)也可能被自動序列化(簡單數(shù)據(jù)類型數(shù)組容器可以被序列化,List<T>中元素是簡單字段類型是可以被序列化的)
可以被序列化的類
1.含有Serializable屬性
2.不能是虛類
3.不能是靜態(tài)類
4.不能是泛型類,但是可以繼承自泛型類
協(xié)程
一個程序循環(huán)是在一段時間內(nèi)逐步完成的,而不是在一個更新幀內(nèi)完成,這時就需要用到協(xié)程函數(shù)。
協(xié)程Coroutine和普通函數(shù)的區(qū)別
普通函數(shù)會在返回前執(zhí)行完所有的指令(意味著函數(shù)內(nèi)的指令都會在一幀之內(nèi)完成)
協(xié)程可以在運行到特定指令后返回,等下一幀或者特定時間后繼續(xù)運行。
使用協(xié)程
1.IEnumerator作為協(xié)程函數(shù)返回值
2.使用StartCoroutine來啟用(調(diào)用)協(xié)程
3.可以通過返回等到時間來延遲下次調(diào)用(WaitForseconds)
4.使用StopCoroutine或者StopAllCoroutines來停止協(xié)程
預(yù)制件(Prefab)
類似于一個模板,但使用該模板的結(jié)果也不完全相同。
作用
1.可重用的有特定組件、屬性和子物體的游戲?qū)ο蟆?/p>
2.類似于模板,將物體按照模板在場景中實例化。
3.對預(yù)制件的修改會影響到所有實例化的物體。
適合預(yù)制件的場合
1.場景資源(比如多次使用的一種樹)
2.NPC(一個角色出現(xiàn)在多個關(guān)卡中,只是某些屬性有區(qū)別)
3.子彈(需要在運行時動態(tài)添加到場景中)
4.玩家角色(每關(guān)都需要擺到特定出生點)
Radius:半徑 ? ? Collider:碰撞
將層級窗口中的對象拖拽到project窗口后,字體變藍(lán)色,說明該對象已經(jīng)變成預(yù)制件。