還需進一步整理!html
ing...linux
Unity 相關博客:Unity遊戲開發愛好者正則表達式
按鈕:sql
Unity 5 UI Tutorial - Button and event handlers數據庫
輸入框:緩存
Unity 5 UI Tutorial - Input field and event handlers安全
using UnityEngine; using UnityEngine.UI; public class Button_event_test : MonoBehaviour { public void Button_Click() { string str_inputField1 = "Hello world - test123"; Debug.Log(str_inputField1); // 獲取這個對象 GameObject inputObj = GameObject.Find("Canvas/Panel/InputField1");
// 撥開這個對象的真正面目 InputField input = (InputField)inputObj.GetComponent<InputField>(); // 獲得這個對象的屬性 str_inputField1 = input.text.ToString(); Debug.Log(str_inputField1); } }
Ref:Unity-3D 簡單登錄界面,在此基礎上作修改。框架
using UnityEngine; using System.Collections; public class Label : MonoBehaviour { private string userName; private string passWord; private string username; private string password; private string message; private string info; public Texture img;
void OnGUI() { GUIStyle sty = new GUIStyle(); GUIStyle sty1 = new GUIStyle(); sty.fontSize = 20; sty1.fontSize = 40; GUI.Label(new Rect(120, 10, 100, 30), "登陸界面", sty1); GUI.Label(new Rect(30, 70, 100, 30), "用戶名:", sty); userName = GUI.TextField(new Rect(120, 70, 200, 30),userName,20); GUI.Label(new Rect(30, 110, 100, 30), "密碼:",sty); passWord = GUI.PasswordField(new Rect(120, 110, 200, 30), passWord, '*', 15); message = GUI.TextArea(new Rect(400, 30, 200, 200), message, sty);
if (GUI.Button(new Rect(220, 150, 110, 30), "login")) { if (username == userName && password == passWord) { info = "success!"; message = "牀前明月光,\n疑是地上霜。\n舉頭望明月,\n低頭思故鄉。\n"; } else info = "failed!"; } sty.fontSize = 40; GUI.Label(new Rect(150, 210, 512, 225), info,sty); }
// Use this for initialization void Start () { userName = ""; passWord = ""; message = ""; info = ""; username = "wonameshuai"; # default password = "nishuodedui"; # default } // Update is called once per frame void Update () { } }
加圖片:編輯器
//用戶名 private var editUsername : String; //密碼 private var editPassword : String; //提示信息 private var editShow : String; function Start() { editShow = "請您輸入正確的用戶名與密碼"; editUsername = "請輸入用戶名"; editPassword = "請輸入密碼"; } function OnGUI () { //顯示提示信息內容 GUI.Label(Rect(10, 10, Screen.width, 30), editShow); if (GUI.Button(Rect(10,120,100,50),"登陸")) { //點擊按鈕修改提示信息 editShow = "您輸入的用戶名爲 :" + editUsername + " 您輸入的密碼爲:"+ editPassword; }
//編輯框提示信息 GUI.Label(Rect(10, 40, 50, 30), "用戶名"); GUI.Label(Rect(10, 80, 50, 30), "密碼:"); //獲取輸入框輸入的內容 editUsername = GUI.TextField (Rect (60, 40, 200, 30), editUsername, 15); editPassword = GUI.PasswordField (Rect (60, 80, 200, 30), editPassword, "*"[0],15); }
代碼研究ide
Panel加載圖片:
那是由於你沒把圖片設置爲Sprite (小精靈),圖片只是Texture而已,只能做爲貼圖使用。
Goto: Unity3D在UI中加入Image圖片
點擊事件配置:
Goto: Unity 4.6 uGUI的點擊事件
發送消息,發送給誰? 如何控制?
using UnityEngine; using System.Collections; using UnityEngine.UI; public class testclick : MonoBehaviour { // Use this for initialization void Start () { Button btn = gameObject.GetComponent<Button>(); btn.onClick.AddListener(click); } void click() { Debug.Log ("Mouse Click"); } }
Unity 3種message消息管理使用
Ref: http://blog.csdn.net/u011484013/article/details/51487936
MonoBehaviour 是 Unity 中全部腳本的基類,
using UnityEngine; using System.Collections; public class xx1 : MonoBehaviour { void OnGUI() { if (GUI.Button(new Rect(10, 10, 100, 50), "發送1")) {//this gameobjec SendMessage("myTest"); # <-- button 1 向當前對象掛載的全部腳本上面發送消息
}
if (GUI.Button(new Rect(10, 150, 100, 50), "發送2")) {//this gameobjec and it's childs BroadcastMessage("myTest"); # <-- button 2 朝物體和全部子物體發送消息 } if (GUI.Button(new Rect(10, 200, 100, 50), "發送3")) {//this gameobjec‘parent SendMessageUpwards("myTest"); # <-- button 3 朝物體和上級父物體發送信息 } } }
using UnityEngine; using System.Collections; public class XXX : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnDrag(Vector2 delta) { Debug.Log("-------OnDrag--------"); } public void myTest() { Debug.Log("this is a methord:" + gameObject.name); } }
遊戲對象 (GameObject)是全部其餘組件 (Component) 的容器。遊戲中的全部對象本質上都是遊戲對象 (GameObject)。
Ref: http://blog.csdn.net/linuxheik/article/details/37956243
遊戲對象 (GameObject) 自身不會向遊戲添加任何特性。而是容納實現實際功能的組件 (Component) 的容器。
例如,光 (Light) 是一個附加到遊戲對象 (GameObject) 的組件 (Component)。
附加到遊戲對象 (GameObject) 的組件 (Component)
# 注意前後順序
若是要從腳本建立組件 (Component),則應
- 建立空遊戲對象 (GameObject),
- 而後使用 gameObject.AddComponent(ClassName) 函數添加所需組件 (Component)。
在腳本中,組件 (Component) 能夠方便地經過消息發送或 GetComponent(TypeName) 函數相互通訊。這使您能夠編寫可重複使用的小腳本,這些腳本能夠附加到多個遊戲對象 (GameObject) 並重複用於不一樣用途。
除了做爲組件 (Component) 的容器以外,遊戲對象 (GameObject) 還具備標記 (Tag)、層 (Layer) 和名稱 (Name)。
標記 (Tag) 和層 (Layer) 可使用標記管理器 (Tag Manager)(在編輯 (Edit) ->項目設置 (Project Settings) -> 標記 (Tags) 中)進行設置。
//獲取按鈕遊戲對象 GameObject btnObj = GameObject.Find ("Canvas/Button");
//獲取按鈕腳本組件 Button btn = (Button) btnObj.GetComponent<Button>();
using UnityEngine; using UnityEngine.UI;![]()
public class Button_event_test : MonoBehaviour { public void Button_Click() { ... } }
Ref: Unity 腳本基類 MonoBehaviour 與 GameObject 的關係
1.1. 內置函數列表
Awake:當一個腳本被實例化時,Awake 被調用。咱們大多在這個類中完成成員變量的初始化。
Start:僅在 Update 函數第一次被調用前調用。由於它是在 Awake 以後被調用的,咱們能夠把一些須要依賴 Awake 的變量放在Start裏面初始化。 同時咱們還大多在這個類中執行 StartCoroutine 進行一些協程的觸發。要注意在用C#寫腳本時,必須使用 StartCoroutine 開始一個協程,可是若是使用的是 JavaScript,則不須要這麼作。
Update:當開始播放遊戲幀時(此時,GameObject 已實例化完畢),其 Update 在 每一幀 被調用。
LateUpdate:LateUpdate 是在全部 Update 函數調用後被調用。
FixedUpdate:當 MonoBehaviour 啓用時,其 FixedUpdate 在每一固定幀被調用。
OnEnable:當對象變爲可用或激活狀態時此函數被調用。
OnDisable:當對象變爲不可用或非激活狀態時此函數被調用。
OnDestroy:當 MonoBehaviour 將被銷燬時,這個函數被調用。
詳見圖:生命週期示意圖
接下來,作出一下講解:
最早執行的方法是Awake,這是生命週期的開始,用於進行激活時的初始化代碼。
通常能夠在這個地方將當前腳本禁用:this.enable=false,若是這樣作了,則會直接跳轉到OnDisable方法執行一次,而後其它的任何方法,都將再也不被執行。
若是當前腳本處於可用狀態,則正常的執行順序是繼續向下執行OnEnable。
固然咱們能夠在另一個腳本中實現這個腳本組件的啓動:this.enable=true;
再向下執行,會進行一個判斷,若是Start方法尚未被執行,則會被執行一次,若是已經被執行了,則不會再被執行。
這是個什麼意思呢?咱們能夠在某個腳本中將組件禁用this.enable=false,再啓用時會轉到OnEnable處執行,這時繼續向下走,發現Start執行過了,將再也不被執行。
好比說:第一次啓用時,將怪物的初始位置定在了(0,0,0)點,而後怪物可能會發生了位置的變換,後來被禁用了,再次啓用時,不會讓怪物又回到初始的(0,0,0)位置。
繼續向後執行,就是Update了,而後是FixUpdate,再而後是LateUpdate,若是後面寫了Reset,則會又回到Update,在這4個事件間能夠進行循環流動。
再向後執行,就進入了渲染模塊(Rendering),很是重要的一個方法就是OnGUI,用於繪製圖形界面。【固然,若是你使用了NGUI,這個生命週期的事情你就不用考慮了】
首先咱們說說GUI與NGUI的區別,
GUI是Unity自帶的繪製界面工具,它的成像原理是基於表層的,因此執行效率很是的低,而且沒有提供複雜的UI的接口,就算開發者硬着頭皮寫上去只能讓UI的執行效率更低。
NGUI 徹底依賴於3D就比如在遊戲世界中的攝像機直直的照射在一個平面中,在平面之上再去繪製本身的UI,因此它的執行效率會很是高。
NGUI是一款收費的插件,在Asset Store中你們能夠看到價格。在未購買正版的前提下咱們能夠經過兩種方法來使用NGUI,
再向後,就是卸載模塊(TearDown),這裏主要有兩個方法OnDisable與OnDestroy。當被禁用(enable=false)時,會執行OnDisable方法,可是這個時候,腳本並不會被銷燬,在這個狀態下,能夠從新回到OnEnable狀態(enable=true)。
當手動銷燬或附屬的遊戲對象被銷燬時,OnDestroy纔會被執行,當前腳本的生命週期結束。
特別要強調的是:這裏雖然可使用C#來寫代碼,可是這個類構造對象的生命週期,與MonoBehaviour的生命週期,是徹底不一樣的。
Update
當 MonoBehaviour 實例化完成以後,Update 在每一幀被調用。
LateUpdate
LateUpdate 是在全部 Update 函數調用後被調用。這可用於調整腳本執行順序。例如:當物體在Update裏移動時,跟隨物體的相機能夠在LateUpdate裏實現。
FixedUpdate
處理 Rigidbody 時,須要用FixedUpdate代替Update。例如:給剛體加一個做用力時,你必須應用做用力在FixedUpdate裏的固定幀,而不是Update中的幀。(二者幀長不一樣)
Awake
Awake 用於在遊戲開始以前初始化變量或遊戲狀態。在腳本整個生命週期內它僅被調用一次。Awake 在全部對象被初始化以後調用,因此你能夠安全的與其餘對象對話或用諸如 GameObject.FindWithTag 這樣的函數搜索它們。每一個遊戲物體上的Awke以隨機的順序被調用。所以,你應該用Awake來設置腳本間的引用,並用Start來傳遞信息Awake老是在Start以前被調用。它不能用來執行協同程序。
C#和Boo用戶注意:Awake 不一樣於構造函數,物體被構造時並無定義組件的序列化狀態。Awake像構造函數同樣只被調用一次。
Start
Start在behaviour的生命週期中只被調用一次。它和 Awake 的不一樣是,Start 只在腳本實例被啓用時調用。你能夠按需調整延遲初始化代碼。Awake 老是在Start以前執行。
OnMouseEnter /OnMouseOver / OnMouseExit / OnMouseDown / OnMouseUp / OnMouseDrag
當鼠標進入 / 懸浮 / 移出 / 點擊 / 釋放 / 拖拽GUIElement(GUI元素)或Collider(碰撞體)中時調用OnMouseEnter。
OnTriggerEnter / OnTriggerExit / OnTriggerStay
當Collider(碰撞體)進入 / 退出 / 停留在 trigger(觸發器)時調用OnTriggerEnter。OnTriggerStay 將會在每一幀被調用。
OnCollisionEnter / OnCollisionExit / OnCollisionStay
當此collider/rigidbody觸發另外一個rigidbody/collider時,被調用。OnCollisionStay 將會在每一幀被調用。
Invoke function Invoke (methodName : string, time : float) : void 在 time 秒以後,調用 methodName 方法; InvokeRepeating function InvokeRepeating (methodName : string, time : float, repeatRate : float) : void 從第一次調用開始,每隔repeatRate時間調用一次. CancelInvoke function CancelInvoke () : void 取消這個MonoBehaviour上的全部調用Invoke。 IsInvoking function IsInvoking (methodName : string) : bool 某指定函數是否在等候調用。 StartCoroutine function StartCoroutine (routine : IEnumerator) : Coroutine 一個協同程序在執行過程當中,能夠在任意位置使用 yield 語句。yield 的返回值控制什麼時候恢復協同程序向下執行。協同程序在對象自有幀執行過程當中堪稱優秀。協同程序在性能上沒有更多的開銷。StartCoroutine函數是馬上返回的,可是yield能夠延遲結果。直到協同程序執行完畢。 StopCoroutine / StopAllCoroutines
* 實例化
被顯式添加到 Hierarchy 中的 GameObject 會被最早實例化,GameObject 被實例化的順序是從下往上。
GameObject 被實例化的同時,加載其組件 component 並實例化,
若是掛載了腳本組件,則實例化腳本組件時,將調用腳本的 Awake 方法,組件的實例化順序是也是從下往上。
在全部顯式的 GameObject 及其組件被實例化完成以前,遊戲不會開始播放幀。
* 實例化後
當 GameObject 實例化工做完成以後,將開始播放遊戲幀。每一個腳本的第一幀都是調用 Start 方法,其後每一幀調用 Update,並且每一個腳本在每一幀中的調用順序是從下往上。
* 總結
被掛載到 GameObject 下面的腳本會被實例化成 GameObject 的一個成員。
* 腳本與GameObject的關係
詳見連接內容
NB: Unity 編輯器裏面的拖拽綁定方式是 GameObject 級別的。