unity 小功能、知識點二
協同程序的開啟與終止:
在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可開啟一個協同程序,也就是說該方法必須在MonoBehaviour或繼承於MonoBehaviour的類中調用。
在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以開啟一個線程。區別在於使用字符串作為參數可以開啟線程並在線程結束前終止線程,相反使用IEnumerator 作為參數只能等待線程的結束而不能隨時終止(除非使用StopAllCoroutines()方法);另外使用字符串作為參數時,開啟線程時最多只能傳遞一個參數,並且性能消耗會更大一點,而使用IEnumerator 作為參數則沒有這個限制。
在Unity3D中,使用StopCoroutine(string methodName)來終止一個協同程序,使用StopAllCoroutines()來終止所有可以終止的協同程序,但這兩個方法都只能終止該MonoBehaviour中的協同程序。
還有一種方法可以終止協同程序,即將協同程序所在gameobject的active屬性設置為false,當再次設置active為ture時,協同程序並不會再開啟;如是將協同程序所在腳本的enabled設置為false則不會生效。這是因為協同程序被開啟後作為一個線程在運行,而MonoBehaviour也是一個線程,他們成為互不幹擾的模塊,除非代碼中用調用,他們共同作用於同一個對象,只有當對象不可見才能同時終止這兩個線程。然而,為了管理我們額外開啟的線程,Unity3D將協同程序的調用放在了MonoBehaviour中,這樣我們在編程時就可以方便的調用指定腳本中的協同程序,而不是無法去管理,特別是對於只根據方法名來判斷線程的方式在多人開發中很容易出錯,這樣的設計保證了對象、腳本的條理化管理,並防止了重名。
計算一段字體的寬度(如 我是程序員 是程 需要插入一個箭頭,箭頭長度可知,需要計算是程 間的空格數)
private float GetTextWhide(int fontsize, Font font, string str) { font.RequestCharactersInTexture(str, fontsize, FontStyle.Normal); CharacterInfo characterInfo; float width = 0f; for (int i = 0; i < str.Length; i++) { font.GetCharacterInfo(str[i],out characterInfo, fontsize); width += characterInfo.advance; } return width; }
其中fontsize為這個Text的字體大小,font為這個使用的字體,str是你要計算長度的字符串,該函數會返回一個表示這個字符串在指定Text上渲染時的寬度。
UGUI空格導致換行:將空格轉換為全角空格,半角空格會使Text自動換行。
實現text顯示不同顏色的字,如我是程序員小白,其中程序員為紅色,其余自為黑色。使用透明顏色標簽<color=#0000ff00>111</color>,其中的111不會顯示在Text上但會占據格子,作用類似於空格,通過這個標簽的顏色值可以改變相應的字體顏色。
顏色標簽鏈接:http://blog.csdn.net/ynn0705/article/details/7012516
unity 編輯狀態下暫停:
1.Debug.Break();或者UnityEditor.EditorApplication.isPaused = false;
2.使用編輯器類:EditorApplication.ExecuteMenuItem("Edit/Play");
3.UnityEditor.EditorApplication.isPlaying = false;
問題:
unity中通過Application.dataPath + "/Resources/Config/xxx")作為將要讀取文件的路徑時,在編輯器上正常運行,但在打包後卻無法正確讀取文件
解決:
這是因為不同平臺Application.dataPath所指定的路徑不一樣,editor模式下代表的是Asset,打包後對應的路徑是打包時生成的文件夾“xxx_data”,這是需要把對應的文件拷貝到“xxx_data”文件夾下,例如打包後文件路徑“E:\Unity\TowerDefense\Build\塔防_Data\Resources\Config”對應編輯器下的“E:\Unity\TowerDefense\Assets\Resources\Config”。
問題:
UNITY 無法導入視頻解決方法
解決
1.unity 導入視頻時無法轉換成movieTexture, 這時候unity會提示影片導入失敗,這時候需要安轉QuickTime Player,這個軟件可以把unity的影片轉換成unity能用的材質。
2.QuickTime 無法正常運行時並且提示 “please install apple application support”時,打開下載的QuickTime安裝包,選擇安裝“apple application support.msi”,安裝選擇“修復”。
3.unity支持的影片格式有.mov .mpg .mpeg .mp4 .avi .asf。
4.成功導入的影片會生成一個對應的Movie Audio,這個文件是該影片的聲音文件。
問題:Scroll Rect中滑動事件是通過EventTrigger響應,所以當item也是通過EventTrigger響應點擊事件時,就會遮擋住後面的Scroll Rect的滑動事件。
UGUI的ScrollRect組件會和放在它上面的button或者toggle等組件有事件響應的沖突,具體體現為上面的組件會遮擋下面的響應,在button或者toggle等組件上出現只能點擊不能滑動的效果,要想滑動必須點旁邊才行。
解決:
(1).Button: Button.onClick.AddListener(delegate () {ButtonOnClick(Button.gameObject); }); onClick回調函數 是繼承自UnityEngine.Events.UnityAction.委托。由於同一個點擊事件通過不同的事件模塊去響應,很好的處理了item擋住Scroll Rect 事件的問題。委托格式為不帶任何參數和返回的函數。
這裏的Button是指你要按下的那個按鈕,ButtonOnClick是該按鈕按下時要觸發的事件。
第二種解決方案是:不用按鈕,1.新建一個繼承MonoBehaviour和IPointerClickHandler接口的腳本(例如ClickObject),2.這個腳本實現public void OnPointerClick(PointerEventData eventData)方法:3.創建一個名為Panel_IPointer的空對象,這個空對象就是你的按鈕。並且將ClickObject腳本附加到對象上。這時候點擊這個對象就會調用OnPointerClick方法。
第三種:創建一個Image(例如名為Btn),Btn對象添加EventTrigger組件," Add New" -> 選擇" PointerClick"。將Btn對象拖拽到觸發者位置。然後點擊"No Function"選擇我們要觸發的OnTestClick事件。
(2)toggle:使用isOn的方法,例如if(toggle.ison){debug.log("click")};
unity 小功能、知識點二