Unity常用API

轉(zhuǎn)自Unity常用API— 奔跑的蝸牛兒

1、Event Function:事件函數(shù)

  1. Reset() :被附加腳本時、在游戲物體的組件上按Reset時會觸發(fā)該事件函數(shù)
  2. Start() :在游戲初始化時會執(zhí)行一次
  3. Update() :每一幀都會運(yùn)行這個方法
  4. FixedUpdate(): 會在指定幀調(diào)用該方法多少次
  5. LateUpdate(): 晚于Update的運(yùn)行順序,但是FPS和Update是一樣的
  6. Awake() Start() : 都是在游戲物體初始化運(yùn)行一次,但是Awake的運(yùn)行順序高于Start的,并且只要腳本中存在Awake方法,則無論是否掛載了該腳本都會執(zhí)行該方法
  7. OnEnable(): 當(dāng)將物體的SetActive設(shè)置為true時就會自動調(diào)用調(diào)用該方法
  8. OnDestory(): 當(dāng)關(guān)閉游戲則會調(diào)用該方法

2、Time時間類函數(shù):

  1. Time.time 表示從游戲開發(fā)到現(xiàn)在的時間,會隨著游戲的暫停而停止計(jì)算。
  2. Time.timeSinceLevelLoad 表示從當(dāng)前Scene開始到目前為止的時間,也會隨著暫停操作而停止。
  3. Time.deltaTime 表示從上一幀到當(dāng)前幀時間,以秒為單位?!疽话阌脕砜刂平巧赢嫷倪\(yùn)動】
  4. Time.fixedTime 表示以秒計(jì)游戲開始的時間,固定時間以定期間隔更新(相當(dāng)于fixedDeltaTime)直到達(dá)到time屬性。
  5. Time.fixedDeltaTime 表示以秒計(jì)間隔,在物理和其他固定幀率進(jìn)行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行設(shè)置。
  6. Time.SmoothDeltaTime 表示一個平穩(wěn)的deltaTime,根據(jù)前 N幀的時間加權(quán)平均的值。
  7. Time.timeScale 時間縮放,默認(rèn)值為1,若設(shè)置<1,表示時間減慢,若設(shè)置>1,表示時間加快,可以用來加速和減速游戲,回放等、非常有用。如果游戲中控制運(yùn)動的都是使用了Time.deltatime的話,則可以通過設(shè)置Time.timeScale=0來暫停其運(yùn)動等。
  8. Time.frameCount 總幀數(shù)
  9. Time.realtimeSinceStartup 表示自游戲開始后的總時間,即使暫停也會不斷的增加?!疽话阌米餍阅軠y試】
  10. Time.captureFramerate 表示設(shè)置每秒的幀率,然后不考慮真實(shí)時間。
  11. Time.unscaledDeltaTime 以秒計(jì)算,完成最后一幀的時間 不考慮timescale時候與deltaTime相同,若timescale被設(shè)置,則無效。
  12. Time.unscaledTime 從游戲開始到現(xiàn)在所用的時間 不考慮timescale時候與time相同,若timescale被設(shè)置,則無效。

3、GameObject類:

【1】、創(chuàng)建游戲物體的三種方法:

  1. 通過其構(gòu)造器來創(chuàng)建 GameObject go=new GameObejct("游戲物體名"); //一般是用來創(chuàng)建空的游戲來存放其他東西的。
  2. Instantiate GameObject.Instantiate(prefab) //根據(jù)Prefab或者是另外一個游戲物體來創(chuàng)建(克隆Colon),可以實(shí)例粒子、等其他的游戲物體,很是常用的
  3. CreattePrimitive GameObject.CreatePrimitive(PrimitiveType.**) //創(chuàng)建原始的游戲物體,基本的幾何體

【2】、 為游戲物體添加組件, 其中組件可以是我們自己自定義的腳本GameObject.AddComponent<組件名>

【3】、屬性、變量:

  1. GameObject.activeInHierarchy 游戲物體是否處于激活狀態(tài),與父類有關(guān),父類被取消激活,則子類也是取消激活的
  2. GameObject.activeSelf 自身的激活狀態(tài),與父類無關(guān),只與自身有關(guān)?!究刂平M件的激活與取消激活則使用.enable=false/true】
  3. GameObject.tag 游戲物體的tag標(biāo)簽,具體的由程序員自定義設(shè)置
  4. GameObject.SetActive(false/true) 通過參數(shù)的控制來設(shè)置其游戲物體的激活狀態(tài),true為激活狀態(tài),反之為取消激活狀態(tài)。

【4】、UnityEngine.Object中的共有方法與變量

  1. name: 名字,調(diào)用該變量,則無論是通過GameObject還是Component都是返回游戲物體的名字
  2. Destroy() :刪除游戲物體,但是不會立馬在unity中刪除,而是會先進(jìn)行回收,等確定沒對象使用的時候,在進(jìn)行刪除
  3. DontDestroyOnLoad() : 當(dāng)加載新的場景的時候,不刪除這個場景中的某個游戲物體
  4. FindObjectType<>
  5. FindObjectsType<> : t通過類型來進(jìn)行查找,是進(jìn)行全局的查找,則就是在整個場景中進(jìn)行查找
  6. FindGameObjectWithTag :如果查到的是多個,則只返回查找到的第一個
  7. FindGameObejctsWithTag 返回查找到的游戲物體集合

【5】、消息的發(fā)送

  1. BroadcastMessage() 廣播發(fā)送消息,則該物體上對應(yīng)的方法會被調(diào)用,同時這個游戲物體上的子物體上對應(yīng)的方法也會被調(diào)用的
  2. SendMessage() 發(fā)送消息,只會對這個游戲物體中腳本上的方法發(fā)送消息
  3. SendMessageUpwards() 廣播發(fā)送消息,但是和BroadcastMessage()是相反的,在調(diào)用自身的方法時也會向上傳遞,調(diào)用其父類的方法

【6】、游戲組件的查找

  1. Cube cube = target.GetComponent<Cube>(); 返回一個對應(yīng)的組件,如果有多個,則只返回第一個
  2. Cube[]cc= target.GetComponents<Cube>(); 返回該游戲物體上所有符合條件的組件,返回一個組件數(shù)組
  3. Cube[] xx = target.GetComponentsInChildren<Cube>(); 返回該游戲物體上的對應(yīng)組件,同時返回該游戲物體的子類上對應(yīng)的組件
  4. Cube[] yy = target.GetComponentsInParent<Cube>(); 返回該游戲物體上的對應(yīng)組件,同時返回該游戲物體的父類上對應(yīng)的組件

4、MonoBehaviours的類:

【1】、繼承的變量成員

  1. enabled: 返回該組件是否被激活或者是被禁用,可以通過該變量來進(jìn)行設(shè)置
  2. isActiveAndEnabled: 只能返回該組件是否激活的標(biāo)志位,不能設(shè)置該變量,為只讀的
  3. tag :該組件所對應(yīng)的游戲物體的標(biāo)簽
  4. name :該組件所對應(yīng)的游戲物體的名字

【2】、Invoke等方法、變量:將添加要調(diào)用的方法添加到等待隊(duì)列中,然后等待用戶設(shè)定的時間后,進(jìn)行隊(duì)列中的方法調(diào)用。

  1. Invoke("方法1",float time): 在等待time的時間后調(diào)用方法1
  2. bool i= IsInvoking("方法1") 返回bool值,如果方法被添加到隊(duì)列中,但沒有被運(yùn)行則返回true,如果經(jīng)過一段時間后該方法被調(diào)用了則會返回false;
  3. InvokeRepeating("方法1",time,number): 等待time時間后,會重復(fù)開始運(yùn)行方法1,每秒鐘運(yùn)行number次。
  4. CancelInvoke() 會暫停通過Involve/InvokeRepeating的運(yùn)行,但是一般來說CancelInvoke會和InvokeRepeating組合調(diào)用。參數(shù)由自己設(shè)定

擴(kuò)充: 在腳本的類前添加[ExecuteInEditMode]:則該腳本不用按游戲運(yùn)行按鈕就會開始編譯,只限在編輯模式里面

在腳本的共有變量前添加[HideInInspector]:則該共有變量不會在Inspector面板進(jìn)行顯示

5、Coroutines:協(xié)程:

1、定義協(xié)程:IEnumerator 方法名()

{

yield return 0/null ;

yield return new WaitForSeconds(1.0f); //等待一定時間在運(yùn)行下面的代碼

}

2、開啟協(xié)程:StartCoroutines(方法名());

說明:協(xié)程開啟會繼續(xù)執(zhí)行下面代碼,不會等協(xié)程方法運(yùn)行完再執(zhí)行接下來的方法

3、開啟與關(guān)閉協(xié)程時,StartCoriutine(參數(shù))、StopCoroutine(參數(shù)) 其中的參數(shù)要互相對應(yīng),如果傳遞的是方法名,則兩個方法中的參數(shù)就要是方法名,如果是IEnumerator的返回值,則其中兩個方法發(fā)的參數(shù)就要是IEnumerator的返回值

1、 private IEnumerator coroutine;

coroutine = WaitAndPrint();

StartCoroutine(coroutine);

StopCoroutine(coroutine);

2、StartCoroutine("WaitAndPrint");

StopCoroutine("WaitAndPrint");

4、StopAllCoroutines() 停止所有的協(xié)程,不管你是怎么調(diào)用的

6、OnMousexx鼠標(biāo)觸發(fā)事件: 如果是通過Collider進(jìn)行觸發(fā)檢測的話,則要在設(shè)置中打開允許進(jìn)行射線檢測。

  1. OnMouseDown(): 當(dāng)鼠標(biāo)按下的時候觸發(fā),按一次觸發(fā)一次
  2. OnMouseDrag(): 當(dāng)鼠標(biāo)按住不放的時候一直觸發(fā),是每一幀進(jìn)行觸發(fā)
  3. OnMouseUp(): 當(dāng)鼠標(biāo)抬起的時候觸發(fā),只執(zhí)行一次
  4. OnMouseEnter(): 當(dāng)鼠標(biāo)進(jìn)入的時候觸發(fā),進(jìn)入一次觸發(fā)一次
  5. OnMousetOver(): 當(dāng)鼠標(biāo)在觸發(fā)物體的上面時,則一直觸發(fā)
  6. OnMouseExit(): 當(dāng)鼠標(biāo)移出的時候觸發(fā)
  7. OnMouseUpAsButton() 相當(dāng)于是按鈕的功能,當(dāng)鼠標(biāo)在同一個游戲物體上按下抬起的時候才會觸發(fā),按下與抬起不在同一個游戲上的話則不會進(jìn)行觸發(fā)。

7、Mathf類:所有的成員均為靜態(tài)的

Mathf.Abs() 返回絕對值的

Mathf.Ceil() 向上取整的,10.1--->11

Mathf.Clamp(value,min,max) 如果value的值在min--max之間的話就返回value,但是如果value的值小于min,則返回min,如果value的值大于max,則返回max,一般是用在控制角色血量,當(dāng)玩家的血量減少的時候,不會出現(xiàn)出現(xiàn)低于0和大于100的情況 hp= Mathf.Clamp(hp,0,100);

Mathf.ClosePowerOfTwo(value): 取得離value的2次方最近的值

Mathg.DeltaAngke: 取得兩個角度之間的最小夾角

Mathf.Floor 向下取整

Mathf.Pow(i,j) 取得i的j次方

Mathf.MoveToWards() 一般用來做移動控制,是勻速的運(yùn)動,加速度固定的

Mathf.Lerp() 差值運(yùn)算,一般是用來控制動畫、運(yùn)動,越往后運(yùn)行的越慢的。

Mathf.PingPong(t,maxValue) 類似乒乓球的來回運(yùn)動,起始 值是0,通過t變量來控制值由0向maxValue移動,當(dāng)t大于maxValue的時候又向0進(jìn)行移動,然后就這樣的來回往復(fù)運(yùn)動,一般t變量用時間Time.deltatime來進(jìn)行控制的。

8、Input輸入類:

GetKey() 按鍵一直按著時觸發(fā)

GetKeyDown 按鍵被按下那一刻進(jìn)行觸發(fā)

GetKeyUp 按鍵被按下后抬起時觸發(fā)

GetMouseButton(0/1/2) 1:左鍵 2:右鍵 3:中鍵 鼠標(biāo)一直按著時觸發(fā)

GetMouseButtonDown() 鼠標(biāo)按下那一刻觸發(fā)、

GetMouseButtonUp() 鼠標(biāo)抬起的那一刻時觸發(fā)

GetButtonDown()

GetButton()

GetButtonUp() 這三個的參數(shù)是用戶自定義的虛擬按鍵進(jìn)行觸發(fā),其他的和上面的一樣

GetAxis("虛擬軸名") 通過按下的虛擬軸來返回-1~1之間的值,開始值是0,然后向-1/1進(jìn)行漸漸的變化,有一定的加速度。一般用來控制運(yùn)動的,比如是賽車的加速運(yùn)動等

GetAxisRaw() 其他的和GetAxis差不多,就是少了漸變效果,返回值只有 0 1 -1三個

anyKeyDown 當(dāng)任何按鍵被按下(包括鼠標(biāo)按鍵)時返回true

anyKey 當(dāng)任何按鍵被按著(包括鼠標(biāo))時返回true

mousePosition 返回鼠標(biāo)在屏幕上的像素坐標(biāo),【屏幕坐標(biāo)】z軸衡為0的

9、Vector2;二維向量

magnitude: 返回向量的長度

normalized; 返回這個向量長度為1的矢量,不管這個向量多長,也是返回1的矢量,只是返回值,不對原向量的值產(chǎn)生影響

Normalize() 無參數(shù)的,也是向量化,但是調(diào)用該方法會改變原向量值,使其的值被向量化 了

ClampMagnitude() ;將一個向量限制在參數(shù)中指定的長度之間

MoveToWards() 用來做勻速的運(yùn)動,由一個位置向另一個位置進(jìn)行移動

sqrMagnitude 對求向量的的長度時不進(jìn)行開平方根運(yùn)算了,減少性能的損耗,一般是用來比較兩個向量的長度大小的。

其他的參考API文檔即可,較為簡單。

擴(kuò)充:向量是結(jié)構(gòu)體,為值類型,修改其中的變量的時候要整體進(jìn)行修改,不能單獨(dú)的進(jìn)行單個變量的賦值修改

10、Vector3:三維變量

Cross() 插乘運(yùn)算【左手法則】,通過兩個向量來獲得另一個向量的方向,然后進(jìn)行相關(guān)的判斷

Project() 投影運(yùn)算

Reflect() 反射運(yùn)算

Slerp() 按照角度進(jìn)行插值,與lerp的按照位置信息進(jìn)行插值的,一般用在炮臺的旋轉(zhuǎn),使旋轉(zhuǎn)的更加平滑

11、Random隨機(jī)數(shù)類:

InitState(): 通過參數(shù)指定的種子,然后再調(diào)用Range()產(chǎn)生隨機(jī)數(shù)的時候會依據(jù)種子來進(jìn)行生成,則每一次運(yùn)行所生成的隨機(jī)數(shù)都是一樣的,是偽隨機(jī)數(shù)。一般要生成的隨機(jī)數(shù)不同,可以設(shè)置參數(shù)為System.DataTime.Now.Ticks:通過時間戳來完成

insideUnitFCircle :在單位為1的園內(nèi)隨機(jī)生成一個位置信息,如果要在更大的圓中生成,則可以在后面*圓的半徑信息。一般用來控制隨機(jī)生成敵人的位置信息

insideUnitSphere: 在單位為1的球內(nèi)隨機(jī)生成一個位置信息,如果要在更大的球中生成,則可以在后面*圓的半徑信息。

12、四元數(shù) Quaternion:

歐拉角【eylarAngles】與面板中的值對應(yīng)和四元數(shù)【rotation】之間是可以進(jìn)行轉(zhuǎn)換的,一般歐拉角是用來讓用戶可以直觀的看到的,而四元數(shù)是用來控制內(nèi)部的運(yùn)算 的。

.eulerAngles 將四元數(shù)轉(zhuǎn)變?yōu)闅W拉角

Euler() 將歐拉角轉(zhuǎn)變?yōu)樗脑獢?shù)

.LookRotation() 讓玩家通過設(shè)置四元數(shù)來進(jìn)行望向敵人的旋轉(zhuǎn),將向量方向轉(zhuǎn)變?yōu)樗脑獢?shù)

Vector3 temp = enemy.position - player.position; //獲得兩個位置信息之間的變量,是主角望向敵人,所以要設(shè)置向量的方向是指向敵人的

enemp.y = 0; //如果不想主角在望向他的時候出現(xiàn)低頭的情況,也就是y軸的值出現(xiàn)了變化了。

player.rotation= Quaternion.LookRotation(temp);

slerp() 在做朝向的旋轉(zhuǎn)的時候,不建議使用lerp,而是建議使用slerp,使其的旋轉(zhuǎn)朝向更為平滑,更加的自然

Quaternion target= Quaternion.LookRotation(temp);

player.rotation = Quaternion.Slerp(player.rotation, target, Time.deltaTime); //插值的緩慢旋轉(zhuǎn)

13、Rigidbody:剛體組件,控制角色的移動

.position: 可以通過剛體來控制運(yùn)動,在控制運(yùn)動方面,使用rigibody.positon比transform.porition計(jì)算要快的多,相關(guān)的物理計(jì)算也是在剛體中計(jì)算好了,但是不建議使用這個方法來持續(xù)的控制物體的運(yùn)動,不平滑,控制一兩次的時候還可以使用

MovePosition() 對position的優(yōu)化,其中利用了插值運(yùn)算,一般持續(xù)運(yùn)動的則使用這個方法,不出現(xiàn)卡頓的現(xiàn)象

,rotation:

MoveRotation 用來控制剛體的旋轉(zhuǎn)的,一般不建議使用rotation,比較耗性能,建議使用MoveRotation(),然后配合Quaternion,slerp()進(jìn)行使用,使其更加的平滑

AddForce() 為剛體添加力,一般可以用在賽車游戲中,當(dāng)進(jìn)行短時的加速則可以給以限定時間的AddForce方法

14、Camera;相機(jī)組件:

當(dāng)相機(jī)的標(biāo)簽是main cream時,可以通過Camer.main來進(jìn)行主相機(jī)cream組件的查找射線,用來檢測鼠標(biāo)在屏幕上的位置信息,以及觸碰到什么

Ray ray = cameraMain.ScreenPointToRay(Input.mousePosition); //獲得相機(jī)到鼠標(biāo)之間的射線

RaycastHit hit; //用來存放射線檢測到的游戲物體的信息的

bool temp = Physics.Raycast(ray, out hit); //進(jìn)行射線檢測

15、Application

SreeamingAcsets: 該文件下的資源不會被壓縮,導(dǎo)入是什么類型還是什么類型,【主要是音頻、視頻資源】

dataPath: 工程文件路徑

streamingAssetsPath: 可以通過文件流來進(jìn)行讀取的文件路徑

persistenDataPath :可以實(shí)例的文件路徑

tempporaryCachePath :臨時的文件路徑

Application.OpenURL("") 打開指定的網(wǎng)址

Application.Quit() 退出游戲的運(yùn)行

.CapturScreenshot("游戲截圖") 用來截圖的,字符串為截圖fileName

Application.identifier 標(biāo)識名

.companyName 公司名

productName 產(chǎn)品名

instalMode 安裝包名

isEditor 是否在編輯器模式

isFocused 是否在焦點(diǎn)

isMoliePlatform 是否是移動平臺

isPlaying

isWebPlayer

platform 編輯器的平臺

unityVersion unity版本號

version 項(xiàng)目文件版本號

runInBackground 是否可以在后臺運(yùn)行

UnityEditor.EditorApplication.isPlaying=false; //在編輯器模式下推出編輯狀態(tài)

16、SceneManager場景類

SceneManager.LoadScene() 加載下一個場景,一般是用在另一個場景不是太大的情況下

SceneManager.LoadSceneAsync() 異步加載下一個場景,返回AsyncOperation類型,里面包含了加載的信息,加載的進(jìn)度條等等??梢宰層脩艟徑獾却虞d場景的時間

sceneCount 獲得當(dāng)前加載的場景個數(shù)

sceneCountInBuildSettings 在Build面板中加載的場景個數(shù)

GetActiveScene() 獲取已經(jīng)加載的當(dāng)前場景的信息

GetSceneAt(index) 加載index索引的場景

當(dāng)加載新的場景的時候會觸發(fā)下面的事件:

activeSceneChanged 當(dāng)有新場景被加載的時候就會調(diào)用這個事件

sceneLoaded 當(dāng)有新場景加載完成的時候就會觸發(fā)這個事件

擴(kuò)充:事件的注冊時通過加方法來進(jìn)行注冊的:

SceneManger.activeSceneChanged+=OnAcitiveScenenChanged;

17、射線檢測:一般射線檢測要在射線檢測的范圍內(nèi),并且被檢測物體要有Collider

Ray ray=new Ray(起點(diǎn),方向);

PaycastHit hit; //hit中存放的是射線檢測的碰撞信息

bool temp=Physics.Raycast(ray,out hit); //具體的重載方法邊用邊查

Ray ray = new Ray(this.transform.position + transform.forward, transform.forward); //創(chuàng)建射線

RaycastHit hit; //存儲射線檢測到的游戲物體信息

if(Physics.Raycast(ray,out hit)) //通過返回值來判斷射線是否檢測到相關(guān)的物體了

{

Debug.Log(hit.collider.gameObject.name);

}

擴(kuò)充:

Raycast;檢測的是射線碰撞到的第一個物體,不具有穿透性

RaycastAll:返回的是RaycastHit數(shù)組,具有穿透性,可以返回檢測到的多個游戲物體

18、代碼監(jiān)聽觸發(fā)事件:

<Button>().onClick.AddListener(方法名); //當(dāng)觸發(fā)button組件,則會觸發(fā)指定的方法名的方法

通過實(shí)現(xiàn)接口來注冊監(jiān)聽事件: using UnityEgine.EventSystems; 導(dǎo)入命名空間

IPointerDownHandler 鼠標(biāo)按下的事件,具體的接口參考手冊

Raycast Target: 如果取消勾選則不做事件監(jiān)聽了,則無法實(shí)現(xiàn)檢測了

19、www類,下載 是用來在網(wǎng)絡(luò)中下載資源的,

public string url = "http://img.taopic.com/uploads/allimg/120727/201995-120HG1030762.jpg";

IEnumerator Start()

{

WWW www = new WWW(url);

yield return www;

Renderer renderer = this.GetComponent<Renderer>();

renderer.material.mainTexture = www.texture;

}

20、Touches觸摸事件:

Input.touches: 返回放在屏幕上的手指信息,返回數(shù)組

Touch touch1=Input.touches[0];

touch1.position;

TouchPhase pahse=touch1.phase phase 是用來返回手指的狀態(tài)的

21、Debug.DrawRay(ray.oridin,ray.direction) 繪制射線,第一個參數(shù)是原點(diǎn),第二個是方向

22、CharacterController角色控制器

.SimpleMove(【vector3】) 簡單移動

.isGrounded 判斷是否到地面上,bool值

.Move() 與simpleMove的區(qū)別是要*Time.deltatime、而且simpleMove會使用自帶的重力

OnCOntrollerColliderHit(ControllerCollidrHit hit) 當(dāng)有碰撞到其他的碰撞器的時候會觸發(fā)這個事件函數(shù)【hit保存碰撞到的物體信息】

23、Mesh的設(shè)置:

material mesh指定人是什么樣子的,material指定人的膚色是什么樣子的

24、API變更:

棄用:Application.LoadLevel();

新的:SceneManager.LoadScene(); 加載新的場景

棄用

新的:Scene scene=SceneManager.GetActiveScene(); //獲得當(dāng)前活動場景的信息

SceneManger.LoadScene(scene.buildIndex) //重新加載當(dāng)前場景

OnLevelWasLoaded() 當(dāng)場景被加載的時候調(diào)用,被棄用了

改成事件了:sceenLoaded

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容