Unity3D 之 C# 腳本


引用類型 :class ,interface, 數組 , delegate , object ,string (object 是C#中所有類型,包括所有的值類型和引用類型的根類,string 類型是一個從object類直接繼承的密封類型(不能再被繼承),其實例表示Unicode字符串)

try后面一個finally,try中有一個return,那么finally中的代碼會不會運行?如果運行,是在return后還是return前答:會運行,並且在return 后運行。

public static const int A=1;這段代碼有錯誤么?是什么? —— const成員都是static所以應該去掉static


談談final,finally,finalize的區別
   防止重寫,
   try{}catch{}
   在垃圾回收之前,嘗試釋放資源並執行其他清理操作

const和static readonly 區別是什么?
   編譯時常量
   運行時常量


net中什么類不能被繼承?答:如果在類前加上sealed關鍵字,則表示該類為密封類,密封類不能被繼承。sealed 除了可以應用於類外,還可以應用於實例方法和屬性。密封方法會重寫基類中的方法,但其本身不能在任何派生類中進一步重寫。當應用於方法或屬性時,sealed 修飾符必須始終與override一起使用

C#支持多重繼承么?—— 不支持。可以用接口來實現。

私有成員會被繼承么?—— 會,但是不能被訪問。所以看上去他們似乎是不能被繼承的,但實際上確實被繼承了。

被virtual修飾的方法可以被子類覆寫。

能夠實現允許某個類被繼承,但不允許其中的某個方法被覆寫么?—— 可以,標記這個類為public,並標記這個方法為sealed。

為什么不能指定接口中方法的修飾符?—— 接口中的方法用來定義對象之間通信的契約,指定接口中的方法為私有或保護沒有意義。他們默認為公有方法。接口中所有方法必須是抽象的,並且不能指定方法的訪問修飾符。抽象類中可以有方法的實現,也可以指定方法的訪問修飾符。

 


 

String/StringBuilder的異同

string是一個不可變的數據類型,一旦對字符串對象進行了初始化,該字符串對象就不能改變了。修改字符串內容的方法

和運算符實際上是創建一個新的字符串.

stringbuilder分配好內存,對字符串的修改就在賦予stringbuilder實例的存儲單元中進行.str=null,聲明而不分內存空間,str=""聲明而分內存空間

String s = new String("xyz");創建了幾個String Object? —— 兩個對象,一個是“xyx”,一個是指向“xyx”的引用對像s


協同程序,即在主程序運行時同時開啟另一段邏輯處理,來協同當前程序的執行。換句話說,開啟協同程序就是開啟一個線程。

在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可開啟一個協同程序,也就是說該方法必須在MonoBehaviour或繼承於MonoBehaviour的類中調用。

       在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以開啟一個線程。區別在於使用字符串作為參數可以開啟線程並在線程結束前終止線程,相反使用IEnumerator 作為參數只能等待線程的結束而不能隨時終止(除非使用StopAllCoroutines()方法);另外使用字符串作為參數時,開啟線程時最多只能傳遞一個參數,並且性能消耗會更大一點,而使用IEnumerator 作為參數則沒有這個限制。

        在Unity3D中,使用StopCoroutine(string methodName)來終止一個協同程序,使用StopAllCoroutines()來終止所有可以終止的協同程序,但這兩個方法都只能終止該MonoBehaviour中的協同程序。協同程序的返回類型為Coroutine類型。在Unity3D中,Coroutine類繼承於YieldInstruction,所以,協同程序的返回類型只能為null、等待的幀數(frame)以及等待的時間。


Unity是不支持多線程的,也就是說我們必須要在主線程中操作它,可是Unity可以同時創建很多腳本,並且可以分別綁定在不同的游戲對象身上

每個腳本的Awake、Update、LateUpdate、FixedUpdate等等,方法在后台都有一個總匯。

后台的Awake()

{

       腳本0中的Awake();

       腳本1中的Awake();

       腳本2中的Awake();

}

       后台的方法 Awake、Update、LateUpdate、FixedUpdate等等都是按照順序,等所有子腳本中的Awake執行完畢后在去執行 Start 、Update、LateUpdate等等。所以這里也就解釋了Unity沒有多線程的概念。

在腳本2的Awake方法中創建一個立方體對象。在腳本0的Awake方法中去獲取這個立方體對象。如果腳本的執行順序是 先執行Script2 然后在執行Script0那么Script0中的Awake就可以獲取到該立方體對象,可是如果腳本的執行順序是先Script0然后在Script2,那么Script0肯定會報空指針錯誤的。

          那么實際項目中的腳本會非常非常多,他們的先后順序我們誰也不知道。所以我的建議一般在Awake方法中創建游戲對象或在Resources.Load(Prefab) 對象。在Start方法中去獲取游戲對象,或者游戲組件,這樣就可以確保萬無一失了。

     如果說你非要控制腳本的執行先后順序,也不是完全不行!Unity可以設置腳本執行的順序。如下圖所示,選擇任意腳本在Inspector視圖中點擊Execution Order..按鈕。點擊右下角的“+”將彈出下拉窗口,包括游戲中的所有腳本。添加腳本完畢后,Default Time下方數值越小的排在越前面腳本將率先執行,如果沒有設置的腳本將按默認的順序執行。


Unity 腳本的生命周期

Update —— 正常更新,用於更新邏輯,此方法每幀都會由系統自動調用一次

LateUpdate —— 推遲更新,此方法在Update方法執行完后調用,同樣每一幀都調用

Awake —— 腳本喚醒,為系統執行的第一個方法,用於腳本的初始化,在腳本的生命周期中只執行一次

FixedUpdate —— 固定更新,設置更新頻率

Start —— 在Awake方法之后,Update方法執行之前執行,並且只執行一次

OnDestroy —— 當前腳本銷毀時使用

使用腳本調用游戲對象 —— 將腳本綁定在一個游戲對象身上,也可以在代碼中動態綁定腳本和刪除腳本。任何一個游戲對象都可以同時綁定多條游戲腳本,並且這些腳本互不干涉,各自完成自己的生命周期

GameObject.CreatePrimitive —— 用於創建一個原始游戲對象,其參數可設置為立方體,球體,圓柱體等系統默認提供的游戲對象

AddComponet —— 用於給游戲對象添加組件

renderer.material.color —— 設置渲染材質的顏色或者貼圖

transform.position —— 設置該游戲對象的位置

 


 

獲取游戲對象:

通過對象名稱獲取對象 —— 使用Find 方法傳入對象的完整路徑名稱即可在代碼中獲取游戲對象

通過標簽獲取單個游戲對象 —— “Add Tag ”中 Element 0 選項右側直接輸入標簽名稱即可添加新標簽 FindWithTag() —— FindWithTag 方法只能獲取一個游戲對象,如果程序中多個對象都添加了同樣的標簽,那么這個方法只能獲取第一個添加此標簽的對象

通過標簽獲取多個游戲對象 —— FindGameObjectsWithTag() 方法並將相應的標簽名稱作為參數傳入,即可返回一個游戲對象數組

添加組件與修改組件

添加游戲組件時,可以使用AddComponent()方法,由於組件自身沒有對應的刪除方法,需要使用父類執行Object.Destroy()

render.material 引用當前腳本綁定對象的材質,直接為其賦值即可修改對象材質

一個游戲對象可以綁定多條腳本,實現這些腳本之間的交互就可以使用廣播機制

     游戲對象之間發送的廣播與消息大致分為:

1,向子對象發送,將發送至該對象的同輩對象或者子孫對象中;

        gameObject.BroadcastMessage("ReceiveBroadcastMessage","A0---BroadcastMessage()");

         接受父類發送的消息:

         function ReceiveBroadcastMessage(str: String)

         { Debug.Log(); }

2,給自己發送,發送至自身對象;

         gameObect.SendMessage();

3,向父對象發送,發送至該對象的同輩或者父輩對象中

         gameObject.SendMessageUpwards();

克隆游戲對象        Instantiate()

動態地為某個游戲對象添加腳本組件 ——  AddComponent(),將腳本的名稱作為參數傳入即可完成腳本組件的添加

obj.transform.position 引用得到obj游戲對象在三維坐標系中的位置,存儲在Vector3容器中(保存着xyz軸的坐標)

         transform.Rotate() —— 用於設置模型繞自身旋轉,參數為旋轉的速度與旋轉的方向

         transform.RotateAround() —— 用於設置模型圍繞某一個點旋轉

         Time.deltaTime —— 用於記錄上一幀所消耗的時間,用作模型旋轉的速度系數

         Vector3.right —— x軸方向

         Vector3.up —— y軸方向

         Vector3.forward —— z軸方向

transform.Translate() 唯一參數為平移模型的方向    obj.transform.Translate(Vector3.forward * Time.deltaTime)


命名規則 —— 必須與項目資源視圖中該腳本的名稱對應,否則無法成功綁定至游戲對象

Unity3D     工具類

Time —— 獲取當前的系統時間

     Time.time —— 從游戲開始后計時開始,表示截至目前共運行的游戲時間

     Time.deltaTime —— 獲取Update() 方法中完成上一幀所消耗的時間

     Time.fixedTime —— FixedUpdate() 方法中固定消耗的時間總和

使用 WaitForSeconds() 方法可以以秒為單位讓程序等待一段時間,此方法可直接使游戲主線程進入等待狀態。該方法的返回值為IEnumerator類型,在需要等待的地方 調用 yield return new WaitForSeconds(2)

Unity中所有用到的模型旋轉的,底層都是由四元數實現,可以精確計算模型的旋轉的角度


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM