腳本用于響應(yīng)玩家輸入捡鱼、事件響應(yīng)拐叉、生成生動(dòng)的效果、甚至是構(gòu)建自定義AI萄焦。
腳本綜述
介紹Object怎樣受到腳本的控制控轿,以及Unity特征和Mono runtime的關(guān)系。
創(chuàng)建和應(yīng)用腳本
GameObject是被Components控制的拂封,雖然Unity內(nèi)置的Components已經(jīng)很好了茬射,但你會(huì)發(fā)現(xiàn)我們還是需要用腳本創(chuàng)建自己的Components。
有2種語言冒签,C#和UntiyScript在抛。
怎么創(chuàng)建腳本呢?
Assets > Create > C# Script
創(chuàng)建好的腳本是什么樣的呢萧恕?
默認(rèn)有2個(gè)函數(shù)刚梭,Start()和Update()。
怎么用這個(gè)腳本呢廊鸥?
把它拖到Object上望浩,作為一個(gè)Components。
變量和檢視面板
你可以定義一個(gè)public變量惰说,并在檢視面板上看到它,還可以給它賦值缘回。
用Components控制Object
一般我們可以通過編輯器控制Object的屬性吆视,但這是靜態(tài)的,用腳本的不同在于可以動(dòng)態(tài)的控制Object的屬性酥宴。
怎么訪問Component呢啦吧?
用函數(shù)GetComponent。
怎么訪問其他Object呢拙寡?
創(chuàng)建一個(gè)public的GameObject變量授滓,把其他的Object拖動(dòng)到檢視面板的public變量處。(Transform同理)
怎么找到Child Objects肆糕?
怎么通過Name或者Tag找到Object?
GameObject.Find诚啃,GameObject.FindWithTag淮摔,GameObject.FindGameObjectsWithTag。
事件函數(shù)
Unity通過事件函數(shù)來進(jìn)行控制始赎,比如Start和Update和橙,還有更多的函數(shù)可供應(yīng)用仔燕。
有哪些一般的更新事件?
Update()魔招,F(xiàn)ixedUpdate()晰搀,LateUpdate()。
有哪些初始化事件办斑?
Start厕隧,Awake。
有哪些GUI事件俄周?
OnGUI吁讨,OnMouseOver,OnMouseDown峦朗。
有哪些物理事件建丧?
OnCollisionEnter,OnCollisionStay波势,OnCollisionExit翎朱,OnTriggerEnter,OnTriggerStay尺铣,OnTriggerExit拴曲。
時(shí)間和幀速率的管理
兩次Update調(diào)用之間的時(shí)間長度不是恒定的。
所以如果幀率是10毫秒凛忿,那么每秒U(xiǎn)pdate100次澈灼,如果幀率是25毫秒,那么每秒U(xiǎn)pdate40次店溢,就會(huì)有問題叁熔。
這時(shí),我們就要用到Time.deltaTime床牧。(distancePerSecond * Time.deltaTime)
什么是Fixed Timestep荣回?
Unity的物理系統(tǒng)需要固定的時(shí)間步來進(jìn)行精準(zhǔn)的模擬。(Time Manager戈咳,Time.fixedDeltaTime)
什么是Maximum Allowed Timestep心软?
簡單來說,當(dāng)Fixed Timestep引起物理系統(tǒng)運(yùn)算變慢時(shí)著蛙,要用到這個(gè)東西删铃,它在Time Manager里可以設(shè)置。
什么是Time Scale册踩?
就是速率泳姐,1表示正常,0.5表示半速暂吉。
什么是Capture Framerate胖秒?
有時(shí)候我們會(huì)把游戲錄成視頻缎患,錄制過程會(huì)耗費(fèi)大量時(shí)間,就會(huì)用到這個(gè)東西阎肝,設(shè)置它保證游戲的流暢挤渔。
創(chuàng)建和銷毀GameObjects
Instantiate,Destroy
協(xié)同程序
舉個(gè)例子风题,當(dāng)你想把一個(gè)物體慢慢變透明時(shí)判导,不可能在一幀內(nèi)完成它,因?yàn)槟菢泳涂床坏竭^程了沛硅,此時(shí)眼刃,你可以用到協(xié)同程序。
IEnumerator摇肌,yield return擂红,StartCoroutine
它會(huì)單獨(dú)形成一個(gè)函數(shù),返回一次值后围小,把處理權(quán)交還給Unity昵骤,在下次Update時(shí),再把處理權(quán)要過來進(jìn)行下一次處理肯适。
命名空間
防止函數(shù)名稱沖突变秦。
namespace XXX,using XXX框舔。
屬性
放在類蹦玫、函數(shù)等上的,用[ ]括起來的雨饺,表明作用的東西钳垮。
事件函數(shù)的執(zhí)行次序
理解自動(dòng)內(nèi)存管理
我們調(diào)用函數(shù)中的參數(shù),會(huì)把參數(shù)拷貝一份放在存儲(chǔ)器中额港,如果參數(shù)是一些數(shù)字,那么它很小歧焦,沒問題移斩,但如果參數(shù)是Object、array呢绢馍?太大了向瓷,會(huì)很費(fèi)存儲(chǔ)空間,效率也低舰涌,因此猖任,就要用到pointer,它只是記錄了存儲(chǔ)地址瓷耙,只要改變他就好了朱躺。
內(nèi)存管理者會(huì)搜索所有屬于激活狀態(tài)的引用值刁赖,并標(biāo)記它們?yōu)椤盎钪保?dāng)搜索完成時(shí)长搀,把剩余的存儲(chǔ)空間用于隨后的再分配宇弛。這就叫“垃圾回收”。
雖然自動(dòng)處理機(jī)制比手動(dòng)處理機(jī)制強(qiáng)源请,但也需要程序員避免一些錯(cuò)誤做法枪芒。
有2種策略,小內(nèi)存就快速頻繁的回收(每隔多久就回收一次)谁尸,大內(nèi)存就緩慢不頻繁的回收(游戲暫停時(shí)才回收)舅踪。
還有,復(fù)用Objects也是一個(gè)方法良蛮。
平臺(tái)依賴編譯
暫不關(guān)注抽碌。
專用文件夾和腳本編譯命令
Assets
Editor
Editor default resources
Gizmos
Plugins
Resources
Standard Assets
StreamingAssets
腳本的編譯有4個(gè)階段。
編譯中有個(gè)基本原則背镇,在當(dāng)前編譯階段之后才編譯的任何腳本都不能被涉及咬展,在當(dāng)前或早先階段被編譯的腳本都要確保能用。
4個(gè)階段如下:
(表示沒看懂瞒斩,以后補(bǔ)吧)
類函數(shù)
尖括號(hào)破婆,void FuncName(),var obj = GetComponent()胸囱。
腳本限制
主要針對(duì)不同平臺(tái)說的祷舀。
腳本序列化
在Unity引擎中,序列化被用于加載場(chǎng)景烹笔、資源等裳扯。
(現(xiàn)階段看不懂,以后再說吧)
Unity事件
感覺是Unity有一套自己的事件系統(tǒng)谤职,不需要我們自己額外寫什么了饰豺。
UnityEngine.Events
什么是空引用異常?
當(dāng)你想引用一個(gè)不存在的東西時(shí)允蜈,就會(huì)出現(xiàn)空引用異常冤吨。
重要的類
矢量食譜
雖然矢量描述起來很簡單,但它在編程過程中很細(xì)微且有巨大的作用饶套。
理解矢量運(yùn)算
加漩蟆、減、乘妓蛮、除怠李。