Unity脚本基础
Awake, Start, Update, FixedUpdate,還有一個LateUpdate
Awake在游戲啟動時運行一次,并且是在腳本組件未初始化完成時工作,可以用來做一些預設置;而Start是與組件相關的,當組件的腳本完成初始化且啟用了腳本組件時,工作一次,并且是在第一次執行Update之前執行。
Update是幀之間的更新,時間是不固定的,一般與物理引擎無關的更新都可以在Update里進行;
FixedUpdate是固定周期的更新,與時間管理里的FixedTime設置有關,通常與物理引擎相關的更新都在FixedUpdate里完成,而且每次FixedUpdate執行完成后會立即執行必要的物理計算。
LateUpdate應該是在一幀最后執行,也就是所有的update執行完成后執行。
Translate和Rotate
Translate是用來增量修改物體位置的,可以直接指定位移向量,也可以指定單個方向,比如transform.Translate(Vector3.forward, 10)表示向前移動10;位置除了用增量修改,也可以直接指定,如transform.localPosition = new Vector3(1,1,1);
Rotrate是用來增量修改物理朝向的,也可以使用單向,如transform.Rotate(Vector3.up, 30). 其中的數字是歐拉角,90表示直角90度。但是不能像position那樣直接指定rotation,比如transform.rotation = new Vector3(1,1,1);是不可以的。
LookAt
這個方法可以實現“注視”功能,也就是朝向跟隨(但是如何定義face,比如一個立方體,是它的哪個面進行朝向?這個不知道怎么設置),只需要選擇一個對象,然后使用transform.LookAt(tartget),就可以實現對target的注視功能。這個可以用來設置鏡頭跟隨或者瞄準。
Mathf.Lerp
線性插值。有時候需要在兩個位置之間按一定比例選擇一個點,這就叫線性插值。比如起點是1,終點是5,按0.5的比例線性插值,就會得到3,正好在1和5之間。如果每次手動計算很麻煩,尤其是涉及三維坐標點的時候。使用
Vector3 mid = Mathf.Lerp(new Vector3(1,2,3), new Vector(4,5,6), 0.5)
就可以很方便地計算中間的某個點。在計算距離光源的某個點的光線強度的時候很有用。
另外,還有一個叫SmoothDamp的方法也是類似的功能,還不清楚具體區別,有待進一步研究。
Destroy, SetActive, enabled
Destroy用來刪除一個對象或者組件。如果刪除的是對象,其相關的組件也會被刪除。如果對象的組件是公用的,這會影響其它引用組件的對象。
SetActive用來控制一個對象是否生效。如果設置為false,對象將不活動且不可見。
enabled用來設置一個組件Component是否生效,組件是對象的子對象。
GetKey和GetButton
這兩個都是用來獲取按鍵狀態的,區別在于GetKey使用的是預定義的按鍵名稱,GetKey可以自定義按鍵名字。比如Input.GetKey(KeyCode.Space)表示獲取空格鍵的狀態。而GetButton可以通過在系統Edit->Project Settings->Input菜單里指定某個鍵特殊的名字,比如給空格鍵指定名字“Jump”,這樣就可以通過Input.GetButton("Jump")獲取狀態。
兩種方法都有三個狀態:默認,Down, Up。教程里建議使用GetButton方法。
第一幀,當一個鍵被按下時,GetButton, GetButtonDown會返回true, GetButtonUp返回的則是false;
第二幀,當這個鍵被長按時,GetButton返回true, GetButtonDown, GetButtonUp返回false;
第三幀,當這個鍵抬起時,GetButton, GetButtonDown返回false, GetButtonUp返回true。
GetAxis和GetAxisRaw
這個方法應該主要用在手柄操作控制里,通過Input.GetAxis("Horizontal")和Input.GetAxis("Vertical")來獲取手柄在兩個方向上的位置,返回值是float型,范圍從-1到1.
這個時候,在項目設置里的input設置里,會有幾個屬性:Gravity, Sensitivity,Dead, Snap。Gravity控制返回值在指定方向上的歸位重量,值越大,回歸越快,比如將搖桿移動到最大,返回值為1時,Gavity的值越大,其返回值平滑減少到0的速度就越快;Sensitivity與Gravity剛好相反,它控制的是返回值從0增大到1或減少到-1的快慢,值越大,增加得越快;Dead用來設置一片鎖定區,用來防止誤觸,比如搖桿搖動幅度必須超過0.1才生效,就需要把“原來的”-0.1~0.1之間設置為Dead區,這時實際上位移超過0.1時,才會返回非0值,比如無死區時返回0.05時,有死區時實際上返回0;無死區返回大于0.1時,有死區返回的才是非零值 ,但邊界仍然是-1和1。 Snap的作用是如果同時按下了正負按鈕時歸零,比如用a和d分別表示向左移動和向右移動,但如果同時按下,保持0位不變。
GetAxisRaw與GetAxis的區別就是它的返回值并不是連續的,而是要么返回0,要么返回-1或1,即有段落,適合控制有基準方格的操作。
OnMouseDown
這個是事件函數,類似于OnMove()這種,用于鼠標與環境的交互,當對象被左鍵點擊時,執行方法里的代碼。比如可以用來開門,等。
但是關于鼠標其它按鈕的定義,教程里沒有介紹。
GetComponent
用于獲取腳本所在對象的其它組件,比如一個UI對象,可以獲得其輸入框組件,從而控制文本內容。用法:
GetComponent<ComponentType>()。如果要通過一個腳本組件獲取其它腳本組件,ComponentType就是其它腳本的類名稱。
Time.deltaTime
這是一個很有用的數字,通常用在Update方法中。由于Update函數是按幀更新的,但是幀的時間間隔并不固定,這樣就會影響對速率的計算,比如要讓一個物體運動,要實現每秒前進1單位,在Update方法里只需要 + 1 * Time.deltaTime就可以了。
Instantiate
實例化一個預制件到游戲世界中。這也是一個很有用的方法,比如要扔一個手雷,就需要動態用這個方法實例化一個手雷對象,并且可以在后續代碼中操縱它。使用方法示例:
GameObject obj = Instantiate(PrefabName, position, rotation)
obj.AddForce()
如果實例化的物品是一個消耗品,還需要再次使用Desctroy方法讓它在效果結束后消失。
Instantiate方法經常需要設置一個public的游戲對象或者對象數組,用來告訴腳本生成什么東西。但是要注意一點,通過Inspector設置這些對象或者對象數組時,要注意設置來源是Hierarchy還是Project。如果是Hierarchy,那個這個對象會受舞臺限制,如果被引用的對象本身在舞臺里被Destroy了,那么將無法Instantiate,會報錯,說引用對象為空。如果是從Project里引用,才可以無限Instantiate.
Invoke
這是一個延時調用,可以在引擎內置的更新幀流水里完成一些自定義的執行。
Invoke包含兩個參數,第一個是必須返回void且沒有參數的方法名,字符串類型,第二個參數是以秒計的延時;
InvokeRepeating與Invoke類似,但是它有三個參數,第三個參數表示在第一次引用后,每多少秒重復進行引用。
CancelInvoke用于在需要的時候,將InovkeRepeating指定的重復引用取消。
總結
- 上一篇: Unity基础知识学习四,UI框架设计
- 下一篇: Unity基础组件及介绍