[Unity3D] 03 - Component of UI

還需進一步整理!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); } }

 

  • 登錄界面設計的重要事項
  1. 密碼
  2. 字符規則斷定(正則表達式)

 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 () { } }

 

 

 

Canvas

  • 大小,inspector
  • 加圖片:Canvas 自己是個框架,沒有背景圖案也就沒有Texture。--> 內部添加panel

 

Panel

加圖片:編輯器

 

 

 

 

//用戶名
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

  1. BroadcastMessage 廣播消息
  2. SendMessage 發送消息
  3. SendMessageUpwards 向上發送消息

 

MonoBehaviour 是 Unity 中全部腳本的基類

  • 若是你使用JS的話,腳本會自動繼承MonoBehaviour。
  • 若是使用C#的話,你須要顯式繼承MonoBehaviour。

 

  • 發送消息
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)

遊戲對象 (GameObject) 自身不會向遊戲添加任何特性。而是容納實現實際功能的組件 (Component) 的容器。

例如,光 (Light) 是一個附加到遊戲對象 (GameObject) 的組件 (Component)。

附加遊戲對象 (GameObject)組件 (Component)

# 注意前後順序

若是要從腳本建立組件 (Component),則應

  1. 建立空遊戲對象 (GameObject),
  2. 而後使用 gameObject.AddComponent(ClassName) 函數添加所需組件 (Component)。  

 

在腳本中,組件 (Component) 能夠方便地經過消息發送或 GetComponent(TypeName) 函數相互通訊。這使您能夠編寫可重複使用的小腳本,這些腳本能夠附加到多個遊戲對象 (GameObject) 並重複用於不一樣用途

除了做爲組件 (Component) 的容器以外,遊戲對象 (GameObject) 還具備標記 (Tag)、層 (Layer) 和名稱 (Name)。

  • 標記 (Tag) 用於經過標記 (Tag) 名稱來快速查找對象。
  • 層 (Layer) 可用於僅對某些特定的對象組投射光線、渲染或應用光照。
  • 名稱 (Name)

標記 (Tag) 和層 (Layer) 可使用標記管理器 (Tag Manager)(在編輯 (Edit) ->項目設置 (Project Settings) -> 標記 (Tags) 中)進行設置。

 
 

實例 ( GameObject and GetComponent )

-- Object --

套路:得到object,頂層結構,而後再按照它原本的面貌GetComponent出來。  
//獲取按鈕遊戲對象
GameObject btnObj = GameObject.Find ("Canvas/Button");
//獲取按鈕腳本組件 Button btn = (Button) btnObj.GetComponent<Button>();

 

--  MonoBehaviour --

using UnityEngine;
using UnityEngine.UI;
  
public class Button_event_test : MonoBehaviour {

    public void Button_Click()
    {
        ...
    }
}

 

 

MonoBehaviour 與 GameObject 的關係

Ref: Unity 腳本基類 MonoBehaviour 與 GameObject 的關係

 

1、MonoBehaviour 生命週期

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 將被銷燬時,這個函數被調用。
View Code

詳見圖:生命週期示意圖

 

接下來,作出一下講解:

最早執行的方法是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,

  • 第一種:使用官方提供的免費版本,可是這個版本中有NGUI的水印,沒法正式發佈不過徹底能夠做爲學習使用。
  • 第二種:使用別人購買過的正版插件,在互聯網中有朋友放出NGUI的插件。

 

再向後,就是卸載模塊(TearDown),這裏主要有兩個方法OnDisableOnDestroy。當被禁用(enable=false)時,會執行OnDisable方法,可是這個時候,腳本並不會被銷燬,在這個狀態下,能夠從新回到OnEnable狀態(enable=true)。

當手動銷燬或附屬的遊戲對象被銷燬時,OnDestroy纔會被執行,當前腳本的生命週期結束。

特別要強調的是:這裏雖然可使用C#來寫代碼,可是這個類構造對象的生命週期,與MonoBehaviour的生命週期,是徹底不一樣的。

 

2、MonoBehaviour 的那些坑

  • 私有(private)和保護(protected)變量只能在專家模式中顯示。屬性不被序列化或顯示在檢視面板。 
  • 不要使用命名空間(namespace) 
  • 記得使用 緩存組件查找, 即在MonoBehaviour的長遠方法中常常被訪問的組件最好在把它看成一個私有成員變量存儲起來
  • 在遊戲裏常常出現須要檢測敵人和我方距離的問題,這時若是要尋找全部的敵人,顯然要消耗的運算量太大了,
    • 因此最好的辦法是將攻擊範圍使用Collider表示,而後將Collider的isTrigger設置爲True。
    • 最後使用OnTriggerEnter來作攻擊範圍內的距離檢測,這樣會極大提高程序性能。

 

3、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
不可重寫函數

 

4、腳本與GameObject的關係

* 實例化

被顯式添加到 Hierarchy 中的 GameObject 會被最早實例化,GameObject 被實例化的順序是從下往上。

GameObject 被實例化的同時,加載其組件 component 並實例化,

若是掛載了腳本組件,則實例化腳本組件時,將調用腳本的 Awake 方法,組件的實例化順序是也是從下往上。

在全部顯式的 GameObject 及其組件被實例化完成以前,遊戲不會開始播放幀

 

* 實例化後

當 GameObject 實例化工做完成以後,將開始播放遊戲幀。每一個腳本的第一幀都是調用 Start 方法,其後每一幀調用 Update,並且每一個腳本在每一幀中的調用順序是從下往上。

 

* 總結

被掛載到 GameObject 下面的腳本會被實例化成 GameObject 的一個成員

 

* 腳本與GameObject的關係

詳見連接內容

NB: Unity 編輯器裏面的拖拽綁定方式是 GameObject 級別的。

相關文章
相關標籤/搜索