[原]Unity3D深入淺出 - 腳本開發基礎(Scripts)


常用腳本事件:

Update:每幀調用一次

Start:在第一次Update執行前調用

Awake:腳本實例在創建時調用

FixedUpdate:每個固定物理時間間隔調用一次

LateUpdate:每幀調用一次,在Update之后

 

MonoBehaviour類:

MonoBehaviour類是uniyt中非常重要的類,定義了基本的腳本行為,所有腳本類均需要從它直接或間接繼承。MonoBehaviour還定義了對各種特定事件的響應函數,這些函數名均以On作為開頭,下面是一些常用的事件響應函數。

OnMouseEnter:鼠標移入GUI控件或碰撞體時調用

OnMouseOver:鼠標停留~~~

OnMouseExit:鼠標移除~~~

OnMouseDown:鼠標按下~~~~

OnMouseUp:鼠標釋放~~~

OnTriggerEnter:當其他碰撞體進入觸發器時調用

OnTriggerExit:~~~~~~~~離開~~~~~~~~

OnTriggerStay:~~~~~~~停留~~~~~~~~~

OnCollisionEnter:當碰撞體或者剛體與其他碰撞體或者剛體接觸時調用

OnCollisionExit:~~~~~~~~~~~~~~~~~~~~~~~~離開時~~~

OnCollisionStay:~~~~~~~~~~~~~~~~~~~~~~~~保持接觸時~~~

OnControllerColliderHit:當控制器移動時與碰撞體發生碰撞時調用

OnBecameVisible:對於任意一個相機可見時調用

OnBecameInvisible:對於任意一個相機不可見時調用

OnEnable:對象啟用或者激活時調用

OnDisable:對象禁用或者取消激活時調用

OnDestory:腳本銷毀時調用

OnGUI:渲染GUI和處理GUI消息時調用

 

腳本和組件交互:

一個對象由若干個組件組成,通常需要利用腳本來訪問對象的各種組件並設置組件的參數。對於系統內置的常用組建,Unity提供了非常便利的訪問方式,只需要在腳本里訪問組件對應的成員變量即可,這些成員變量定義在MonoBehaviour中並被腳本繼承了下來。

常用組件以及對應的變量如下。

組件名稱 變量名 組件作用
Tranform tranform 設置對象的位置,旋轉,縮放
Rigidbody rigidbody 設置物理引擎的剛體屬性
Renderer renderer 渲染物體模型
Light light 設置燈光屬性
Camera camera 設置相機屬性
Collider collider 設置碰撞體屬性
Animation animation 設置動畫屬性
Audio audio 設置聲音屬性

 

 

 

 

 

 

 

注意:如果對象上不存在某組件,則返回null。

訪問不屬於商標中列出的組件,或者是訪問對象上的腳本(腳本屬於自定義組件),通過如下方式訪問來得到組件的引用:

GetComponent :得到組件

GetComponents:得到組件列表

GetComponentlnChildren:得到對象或對象子物體上的組件

GetComponentsInChildren:得到對象或對象子物體上的組件列表

注意:這幾個函數都比較耗時,因此一般不要在Update函數中使用,應該在外部定一個接受組件引用的對象,在Start函數中使用GetComponent函數來獲取組件引用。

示例:在一個cube里有一個move.cs腳本,在move.cs腳本中獲cube的Tranform組件

Tranform c_tranform;
Move move;
void Start(){   //第一種方式   c_tranform = tranform;   //第二種方式   c_tranform = GetComponent<Transform>();

move = GetComponent<Move>(); }
void Update{ }

 

訪問場景中的對象:

在unity3d開發中,腳本不但需要訪問腳本所在對象的組件,還經常需要訪問其他的對象:

1.通過名稱來查找:使用函數GameObject.Find,如果場景中存在指定名稱的對象,則返回該對象的引用,否則返回null,如果存在多個同名的對象,則返回第一個對象的引用。

GameObject cube = GameObject.Find("MyCube");

2.通過標簽來查找:GameObject.FindWithTag,如果場景中存在指定標簽的對象,則返回該對象的引用,否則返回null,如果多個對象使用同一個標簽,則返回第一個對象的引用。

注意:與GetComponent一樣,GameObject.Find和GameObject.FindWithTag也是比較耗時的參數,因此不建議在update函數中調用它們,而是在初始化中查找一次后保存在變量中。

 

協同程序(Coroutine):

Coroutine也成為協同程序協程,可以和主程並行運行,和多線程類似,但是在任一制定時刻只會有一個協同程序在運行,別的協同程序則會掛起。可以用來實現讓一段程序等待一段時間后繼續運行的效果。

協同程序(Coroutine)的相關函數如下:

  • StartCoroutine:啟動一個協同程序
  • StopCoroutine:停止一個協同程序
  • StopAllCoroutine:終止所有協同程序
  • WaitForSeconds:等待若干秒。
  • WaitForFixedUpdate:等待知道下一次FiexdUpdate調用。

javascript示例:

function Start()
{
    print("starting "+Time.time);
    yield WaitAndPrint();//啟用一個協同程序
    print("done "+Time.time)  
}

function WaitAndPrint()
{
    yield WitForSeconds(5);//等待5s
    print("waitandprint "+Time.time)

}

C#示例:

IEnumerator Start () {
        Debug.Log("等待5s "+Time.time);
        yield return StartCoroutine(WaitMethod());
}

IEnumerator WaitMethod()
{
        yield return new WaitForSeconds(5f);
        Debug.Log("已經等待5s "+Time.time);
}

這里注意,C#中的協同函數的返回類型必須為IEnumerator,yield要用yield return來替代,並且啟動協程用StartCoroutine()函數。


免責聲明!

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



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