創(chuàng)建并運行腳本:
unity 使用 C# 和 JavaScript 作為腳本語言,在創(chuàng)建一個腳本時會自動創(chuàng)建 Start 和 Update 兩個常用函數(shù)葡盗。Unity 中會有些特定的函數(shù)觅够,這些特定的函數(shù)在一定條件下會被調(diào)用喘先,稱為必然事件(Certain Events)
名稱 | 觸發(fā)條件 | 用途 |
---|---|---|
Awake | 腳本實例被創(chuàng)建時調(diào)用 | 用于游戲?qū)ο蟮某跏蓟⒘#⒁釧wake的執(zhí)行早于所有的 Start 腳本 |
Start | Update函數(shù)第一次運行之前調(diào)用 | 用于游戲?qū)ο蟮某跏蓟?/td> |
Update | 每幀調(diào)用一次 | 用于更新游戲場景和狀態(tài)(和物理狀態(tài)有關(guān)的更新應(yīng)該放在FixedUpdate里) |
FixedUpdate | 每個固定物理時間間隔(Physics Time Step)調(diào)用一次 | 用于物理狀態(tài)的更新 |
LateUpdate | 每幀調(diào)用一次(在Update調(diào)用之后) | 用于更新游戲場景和狀態(tài)涤姊,和相機有關(guān)的更新一般放在這里FixedUpdate里) |
Awake 早于 Start 調(diào)用嗤放,Awake在MonoBehavior創(chuàng)建后就立刻調(diào)用次酌,Start將在MonoBehavior創(chuàng)建后在該幀Update之前岳服,在該Monobehavior.enabled == true的情況下執(zhí)行吊宋。
在Update 中盡量不要使用耗時過高的函數(shù)(例如 GetComponent),因為這樣會大大減少程序的運行效率拖吼。如果要使用 GetComponent绿贞,應(yīng)該在初始化的時候把組件的引用保存在變量中籍铁。
在Unity中,開發(fā)者編寫的每一個腳本都被視為一個自定義組件(Component),游戲?qū)ο罂梢岳斫鉃槿菁{各個組件的容器吩愧,所以可以通過 Add Component 來將腳本添加到對象中雁佳。
首先創(chuàng)建一個腳本糖权,Assets -> Create -> C# Script 命令星澳,命名為 HelloWorld旱易,在Start 函數(shù)中填加以下語句
Debug.Log("Hello World!");//輸出Hello World 到 Console 視圖
腳本本身只是一個組件阀坏,是無法脫離游戲?qū)ο螵毩⑦\行的忌堂,它必須添加到游戲?qū)ο笊喜艜А?br>
依次選擇菜單欄中的 GameObject ->Create Empty 命令即可創(chuàng)建一個空游戲?qū)ο蠼T?Inspector 視圖中單擊對象屬性下方的 Add Component 按鈕寝蹈,在彈出的菜單中依次打開 Scripts -> HelloWorld箫老。這樣就將HelloWorld腳本綁定到新建的游戲?qū)ο笾兴w蕖R部梢栽?Project 視圖中將 HelloWorld 腳本直接拖動到 Inspector 視圖中的 GameObject 對象上來完成綁定操作牲蜀。
按下播放按鈕涣达,會在 Console 視圖中輸出 “Hello World证薇!”浑度,如果用戶當前編輯器頁面沒有 Console 視圖箩张,可以通過 【Ctrl+Alt+C】組合鍵的方式把該視圖顯示出來先慷。
在 Start 函數(shù)中輸出只會輸出一句 “Hello World咨察!”扎拣,而如果將上述語句加入到 Update 中二蓝,將會每幀輸出一次刊愚。
訪問游戲?qū)ο蠛徒M件:
MonoBehaviour 類
Unity中的腳本都是繼承自MonoBehaviour,它定義了基本的腳本行為商玫,必然事件也是從 MonoBehaviour 繼承而來拳昌。除了必然事件炬藤, MonoBehaviour還定義了對各種特定事件(例如模型碰撞沈矿、鼠標移動)的響應(yīng)函數(shù)湃缎,這些函數(shù)均以 On 作為開頭蹂季。
常用事件響應(yīng)函數(shù):
名稱 | 用途 |
---|---|
OnMouseEnter | 鼠標移入GUI控件或者碰撞體時調(diào)用 |
OnMouseOver | 鼠標停留在GUI控件或者碰撞體時調(diào)用 |
OnMouseExit | 鼠標移出GUI控件或者碰撞體時調(diào)用 |
OnMouseDown | 鼠標在GUI控件或者碰撞體上按下時調(diào)用 |
OnMouseUp | 鼠標按鍵釋放時調(diào)用 |
OnTriggerEnter | 當其他碰撞體進入觸發(fā)器時調(diào)用 |
OnTriggerExit | 當其他碰撞體離開觸發(fā)器時調(diào)用 |
OnTriggerStay | 當其他碰撞體停留在觸發(fā)器時調(diào)用 |
OnCollisionEnter | 當碰撞體或者剛體與其他碰撞體或者剛體接觸時調(diào)用 |
OnCollisionExit | 當碰撞體或者剛體與其他碰撞體或者剛體停止接觸時調(diào)用 |
OnCollisionStay | 當碰撞體或者剛體與其他碰撞體或者剛體保持接觸時調(diào)用 |
OnControllerColliderHit | 當控制器移動時與碰撞體發(fā)生碰撞時調(diào)用 |
OnBecameVisible | 對于任意一個相機可見時調(diào)用 |
OnBecameInvisible | 對于任意一個相機不可見時調(diào)用 |
OnEnable | 對象啟用或者激活時調(diào)用 |
OnDisable | 對象禁用或者取消激活時調(diào)用 |
OnDestroy | 腳本銷毀時調(diào)用 |
OnGUI | 渲染GUI和處理GUI消息時調(diào)用 |
訪問游戲?qū)ο螅?/h6>
1.通過名稱查找:
GameObject.Find() 如果場景中存在指定名稱的游戲?qū)ο螅敲捶祷卦搶ο蟮?strong>引用,否則返回 null码泛。如果存在多個游戲?qū)ο笫褂猛幻Q瑟押,那么返回第一個對象的引用椎工。第一個的含義是在 Hierarchy 中排列順序第一個菱属,而不是創(chuàng)建順序伙菊。
GameObject player;
palyer = GameObject.Find("player");
2.通過標簽查找 :
GameObject.FindWithTag() 如果場景中存在指定標簽的游戲?qū)ο笱剩敲捶祷卦搶ο蟮囊?br>
如果想要獲取全部相同標簽的對象,可以通過 FindGameObjectsWithTag() 方法
GameObject player;
GameObject[] enemies;
palyer = GameObject.FindWithTag("player");
enemies = GameObject.FindGameObjectsWithTag("Enemy");
訪問組件:
在Unity中腳本可以被認為是用戶自定義的組件,并且可以添加到游戲?qū)ο笊蟻砜刂朴螒驅(qū)ο蟮男袨槿樾睿?strong>游戲?qū)ο髣t可視為容納各種組件的容器夕膀。
對于系統(tǒng)內(nèi)置的常用組件掠哥,Unity 提供了非常便捷的訪問方式庞瘸,只需要在腳本里直接訪問組件對應(yīng)的成員變量即可擦囊,這些成員變量定義在 MonoBehaviour 中并被腳本繼承了下來瞬场。
常用組件及其變量:
組件名稱 | 變量名 | 組件作用 |
---|---|---|
Transform | transform | 設(shè)置對象位置贯被、旋轉(zhuǎn)、縮放 |
Rigibody | rigibody | 設(shè)置物理引擎的剛體屬性 |
Renderer | renderer | 渲染物體模型 |
Light | light | 設(shè)置燈光屬性 |
Camera | camera | 設(shè)置相機屬性 |
Collider | collider | 設(shè)置碰撞體屬性 |
Animation | animation | 設(shè)置動畫屬性 |
Audio | audio | 設(shè)置聲音屬性 |
如果游戲?qū)ο笊喜淮嬖谀辰M件,則該組件對應(yīng)變量的值將為空值(null)
如果要訪問的組件不屬于上表中的常用組件幌陕,或者訪問的是游戲?qū)ο笊系哪_本诵姜,可以通過一下函數(shù)得到組件的引用
函數(shù)名 | 作用 |
---|---|
GetComponent | 得到組件 |
GetComponents | 得到組件列表(用于有多個同類型組件的時候) |
GetComponentlnChildren | 得到對象或?qū)ο笞游矬w上的組件 |
GetComponentslnChildren | 得到對象或?qū)ο笞游矬w上的組件列表 |
再次強調(diào),GetComponent 比較耗時搏熄,因此盡量避免在 Update 中調(diào)用這些獲取組件的函數(shù)棚唆,而是應(yīng)該在初始化時把組件的引用保存在變量中。
簡單示例:
Example script = GetComponent<Example>();//得到游戲?qū)ο笊系?Example 腳本組件
Transform t = GetComponent<Transform>(); //得到游戲?qū)ο笊系?Transform 組件
**除了用函數(shù)獲取外心例, Unity還有一種非常便捷訪問組件或游戲?qū)ο蟮姆椒ㄏ瑁ㄟ^聲明訪問權(quán)限為 Public 的變量然后將要訪問的組件或者對象賦值給該變量契邀,就可以在腳本中通過變量訪問組件或?qū)ο罅恕?br> (1)在腳本中添加類型分別為 GameObject 和 Transform 的兩個成員變量摆寄,訪問權(quán)限設(shè)置為 Public,示例代碼如下:
using UnityEngine;
using System.Collections;
public class Hello : MonoBehaviour {
public GameObject cube;
public Transform sphereTransform;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
(2)保存腳本坯门,查看 Player 游戲?qū)ο蟮腎nspector視圖微饥,可以看到Hello腳本的視圖參數(shù)添加了兩項,正是剛才添加的兩個成員變量古戴,目前沒有對其賦值欠橘,所以變量的值均顯示為 None。
(3)用鼠標左鍵在 Hierarchy 視圖中將Cube游戲?qū)ο笸系?Inspector 視圖 Cube參數(shù)上现恼,接著拖動sphere游戲?qū)ο蟮?Inspector視圖的 Sphere Transform 參數(shù)上肃续,完成對兩個成員變量的賦值。
此時Hello 腳本的兩個成員變量分別保存了 Cube 對象的引用和 Sphere 對象的 Transform 組件引用叉袍,這樣在腳本中訪問兩個成員變量即可始锚。
常用腳本API
Transform 組件:
transform組件控制游戲?qū)ο笤赨nity場景中的位置、旋轉(zhuǎn)和大小比例喳逛,每個游戲?qū)ο蠖及粋€ Transform 組件瞧捌。在游戲中如果想要更新玩家位置,設(shè)置相機觀察角度都免不了要和Transform組件打交道润文。
Transform 組件的成員變量:
成員變量 | 說明 |
---|---|
position | 世界坐標系中的位置 |
localPosition | 父對象局部坐標系中的位置 |
eulerAngles | 世界坐標系中以歐拉角表示的旋轉(zhuǎn) |
localEulerAngles | 父對象局部坐標系中的歐拉角 |
right | 對象在世界坐標系中的右方向 |
up | 對象在世界坐標系中的上方向 |
forward | 對象在世界坐標系中的前方向 |
rotation | 世界坐標系中以四元數(shù)表示的旋轉(zhuǎn) |
localRotation | 父對象局部坐標系中以四元數(shù)表示的旋轉(zhuǎn) |
localScale | 父對象局部坐標系中的縮放比例 |
parent | 父對象的Transform 組件 |
worldToLocalMatrix | 世界坐標系到局部坐標系的變換矩陣 (只讀) |
localToWorldMatrix | 局部坐標系到世界坐標系的變換矩陣(只讀) |
root | 對象層次關(guān)系中根對象的 Transform組件 |
childCount | 子孫對象的數(shù)量 |
lossyScale | 全局縮放比例(只讀) |
Transform組件的成員函數(shù):
成員函數(shù) | 說明 |
---|---|
Translate | 按指定的方向和距離移動 |
Rotate | 按指定的歐拉角旋轉(zhuǎn) |
RotateAround | 按給定旋轉(zhuǎn)軸和歐拉角進行旋轉(zhuǎn) |
LookAt | 旋轉(zhuǎn)是的自身的前方巷指向目標的位置 |
TransformDirection | 將一個方向從局部坐標系變換到世界坐標系 |
InverseTransformDirection | 講一個方向從世界坐標系變換到局部坐標系 |
TransformPoint | 將一個位置從局部坐標系變換到世界坐標系 |
InverseTransformPoint | 將一個位置從世界坐標系轉(zhuǎn)換到局部坐標系 |
DetachChildren | 與所有子物體解除父子關(guān)系 |
Find | 按名稱查找子對象 |
IsChildOf | 判斷是否是指定對象的子對象 |
Time 類
在 Unity 中可以通過 Time 類來獲取和時間有關(guān)的信息姐呐,可以用來計算幀速率,調(diào)整時間流逝速度等功能典蝌。Time 類包含了一個重要的類變量 deltaTime曙砂,他表示距上一次調(diào)用所用的時間。
Time類成員變量:
成員函數(shù) | 說明 |
---|---|
time | 游戲從開始到現(xiàn)在經(jīng)理的時間(秒)(只讀) |
timeSinceLevelLoad | 此幀的開始時間(秒)(只讀)骏掀,從辭官加載完成開始計算 |
deltaTime | 上一幀耗費的時間(秒)(只讀) |
fixedTime | 最近FixedUpdate的時間鸠澈。該時間從游戲開始計算 |
fixedDeltaTime | 物理引擎和FixedUpdate的更新時間間隔 |
maximumDeltaTime | 一幀的最大耗費時間 |
smoothDeltaTime | Time.deltaTime的平滑淡出 |
timeScale | 時間流逝速度的比例〗赝裕可用來制作慢動作特效 |
frameCount | 已渲染的幀的總數(shù)(只讀) |
realtimeSinceStartup | 游戲從開始到現(xiàn)在經(jīng)理的真實時間(秒)笑陈,改時間不會受timeScale影響 |
captureFramerate | 固定幀率設(shè)置 |
Random類:
Random類可以用來生成隨機數(shù)。
Random類的成員變量:
成員變量 | 說明 |
---|---|
seed | 隨機數(shù)生成器種子 |
value | 返回一個0~1之間的隨機浮點數(shù)侧纯,包含 0 和 1 |
insideUnitSphere | 返回位域半徑為1的求體內(nèi)的一個隨機點 |
insideUnitCircle | 返回位域半徑為1的圓內(nèi)的一個隨機點(只讀) |
onUnitSphere | 返回半徑為1的球面上的一個隨機點(只讀) |
rotation | 返回一個隨機旋轉(zhuǎn)(只讀) |
rotationUniform | 返回一個均勻分布的隨機旋轉(zhuǎn)(只讀) |
Random類的成員變量:
成員函數(shù) | 說明 |
---|---|
Range | 返回 min 和 max 之間的一個隨機浮點數(shù)新锈,包含 min 和 max |
Mathf類
Mathf類的變量:
變量 | 說明 |
---|---|
PI | 圓周率π,即3.14159265358979...(只讀) |
Infinity | 正無窮大 ∞(只讀) |
NegativeInfinity | 負無窮大 - ∞ (只讀) |
Deg2Rad | 度到弧度的轉(zhuǎn)換系數(shù)(只讀) |
Rad2Deg | 弧度到度的轉(zhuǎn)換系數(shù)(只讀) |
Epsilon | 一個很小的浮點數(shù)(只讀) |
Mathf類的常用方法:.
常用方法 | 說明 |
---|---|
Sin | 計算角度(單位為弧度)的正弦值 |
Cos | 計算角度(單位為弧度)的余弦值 |
Tan | 計算角度(單位為弧度)的正切值 |
Asin | 計算反正弦值(返回的角度值單位為弧度) |
Acos | 計算反余弦值(返回的角度值單位為弧度) |
Atan | 計算反正切值(返回的角度值單位為弧度) |
Sqrt | 計算平方根 |
Abs | 計算絕對值 |
Min | 返回若干數(shù)值中的最小值 |
Max | 返回若干數(shù)值中的最大值 |
Pow | Pow(f,p)返回 f 的 p 次方 |
Exp | Exp(p)返回 e 的 p 次方 |
Log | 計算對數(shù) |
Log10 | 計算基為10的對數(shù) |
Ceil | Ceil(f)返回大于或等于 f 的最小整數(shù) |
Floor | Floor(f)返回小于或等于f的最大整數(shù) |
Round | Round(f)返回浮點數(shù) f 進行四舍五入后得到的整數(shù) |
Clamp | 將數(shù)值限制在 min 和 max 之間 |
Clamp01 | 將數(shù)值限制在 0 和 1 之間 |
Coroutine協(xié)同程序
Coroutine也稱為協(xié)同程序或者協(xié)程眶熬,協(xié)同程序可以和主線程并行運行妹笆,和多線程有些類似。協(xié)同程序可以用來實現(xiàn)讓一段程序等待一段時間后繼續(xù)運行的效果娜氏。
與協(xié)同程序有關(guān)的函數(shù):
函數(shù) | 說明 |
---|---|
StartCoroutine | 啟動一個協(xié)同程序 |
StopCoroutine | 中指一個協(xié)同程序 |
StopAllCoroutines | 中指所有協(xié)同程序 |
WaitForSeconds | 等待若干秒 |
WaitForFixedUpdate | 等待直到下一次 FixedUpdate調(diào)用 |
C#協(xié)程例子:
using UnityEngine;
using System.Collections;
public class Hello : MonoBehaviour {
// Use this for initialization
IEnumerator Start () {
Debug.Log ("Starting " + Time.time);
yield return StartCoroutine(WaitAndPrint());//啟動協(xié)同程序 WaitAndPrint
print("Done " + Time.time);
}
IEnumerator WaitAndPrint(){
yield return new WaitForSeconds (5f);
print ("WaitAndPrint " + Time.time);
}
}
在C#中拳缠,協(xié)同程序的返回類型必須為 IEnumerator ,yield 要用 yield return 代替贸弥,并且啟動協(xié)同程序要用 StartCoroutine 函數(shù)窟坐。