Unity腳本開發(fā)基礎(chǔ)(摘要)

創(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ù)窟坐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哲鸳,更是在濱河造成了極大的恐慌臣疑,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徙菠,死亡現(xiàn)場離奇詭異讯沈,居然都是意外死亡,警方通過查閱死者的電腦和手機婿奔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門缺狠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萍摊,你說我怎么就攤上這事挤茄。” “怎么了冰木?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵穷劈,是天一觀的道長。 經(jīng)常有香客問我片酝,道長囚衔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任雕沿,我火速辦了婚禮练湿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘审轮。我一直安慰自己肥哎,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布疾渣。 她就那樣靜靜地躺著篡诽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榴捡。 梳的紋絲不亂的頭發(fā)上杈女,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音吊圾,去河邊找鬼达椰。 笑死,一個胖子當著我的面吹牛项乒,可吹牛的內(nèi)容都是我干的啰劲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼檀何,長吁一口氣:“原來是場噩夢啊……” “哼蝇裤!你這毒婦竟也來了廷支?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤栓辜,失蹤者是張志新(化名)和其女友劉穎恋拍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啃憎,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡芝囤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年似炎,在試婚紗的時候發(fā)現(xiàn)自己被綠了辛萍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡羡藐,死狀恐怖贩毕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仆嗦,我是刑警寧澤辉阶,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站瘩扼,受9級特大地震影響谆甜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜集绰,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一规辱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栽燕,春花似錦罕袋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蔼啦,卻和暖如春榆纽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捏肢。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工奈籽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猛计。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓唠摹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奉瘤。 傳聞我的和親對象是個殘疾皇子勾拉,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容