Unity常用API

來源:博客園
作者:Linke`
時間:2020-11-23
3465
本文匯總Unity常用API。

jc-gellidon-EH9f0TI5wco-unsplash.jpg

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

Reset():被附加腳本時、在游戲物體的組件上按Reset時會觸發(fā)該事件函數(shù)

Start():在游戲初始化時會執(zhí)行一次

Update():每一幀都會運行這個方法

FixedUpdate():會在指定幀調(diào)用該方法多少次

LateUpdate():晚于Update的運行順序,但是FPS和Update是一樣的

Awake()Start():都是在游戲物體初始化運行一次,但是Awake的運行順序高于Start的,并且只要腳本中存在Awake方法,則無論是否掛載了該腳本都會執(zhí)行該方法

OnEnable():當將物體的SetActive設(shè)置為true時就會自動調(diào)用調(diào)用該方法

OnDestory():當關(guān)閉游戲則會調(diào)用該方法

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

Time.time表示從游戲開發(fā)到現(xiàn)在的時間,會隨著游戲的暫停而停止計算。

Time.timeSinceLevelLoad表示從當前Scene開始到目前為止的時間,也會隨著暫停操作而停止。

Time.deltaTime表示從上一幀到當前幀時間,以秒為單位?!疽话阌脕砜刂平巧赢嫷倪\動】

Time.fixedTime表示以秒計游戲開始的時間,固定時間以定期間隔更新(相當于fixedDeltaTime)直到達到time屬性。

Time.fixedDeltaTime表示以秒計間隔,在物理和其他固定幀率進行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行設(shè)置。

Time.SmoothDeltaTime表示一個平穩(wěn)的deltaTime,根據(jù)前N幀的時間加權(quán)平均的值。

Time.timeScale時間縮放,默認值為1,若設(shè)置<1,表示時間減慢,若設(shè)置>1,表示時間加快,可以用來加速和減速游戲,回放等、非常有用。如果游戲中控制運動的都是使用了Time.deltatime的話,則可以通過設(shè)置Time.timeScale=0來暫停其運動等。

Time.frameCount總幀數(shù)

Time.realtimeSinceStartup表示自游戲開始后的總時間,即使暫停也會不斷的增加?!疽话阌米餍阅軠y試】

Time.captureFramerate表示設(shè)置每秒的幀率,然后不考慮真實時間。

Time.unscaledDeltaTime以秒計算,完成最后一幀的時間不考慮timescale時候與deltaTime相同,若timescale被設(shè)置,則無效。

Time.unscaledTime從游戲開始到現(xiàn)在所用的時間不考慮timescale時候與time相同,若timescale被設(shè)置,則無效。

3、GameObject類:

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

通過其構(gòu)造器來創(chuàng)建GameObject go=new GameObejct("游戲物體名");//一般是用來創(chuàng)建空的游戲來存放其他東西的。

Instantiate GameObject.Instantiate(prefab)//根據(jù)Prefab或者是另外一個游戲物體來創(chuàng)建(克隆Colon),可以實例粒子、等其他的游戲物體,很是常用的

CreattePrimitive GameObject.CreatePrimitive(PrimitiveType.**)//創(chuàng)建原始的游戲物體,基本的幾何體

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

【3】、屬性、變量:

GameObject.activeInHierarchy游戲物體是否處于激活狀態(tài),與父類有關(guān),父類被取消激活,則子類也是取消激活的

GameObject.activeSelf自身的激活狀態(tài),與父類無關(guān),只與自身有關(guān)。【控制組件的激活與取消激活則使用.enable=false/true】

GameObject.tag游戲物體的tag標簽,具體的由程序員自定義設(shè)置

GameObject.SetActive(false/true)通過參數(shù)的控制來設(shè)置其游戲物體的激活狀態(tài),true為激活狀態(tài),反之為取消激活狀態(tài)。

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

name:名字,調(diào)用該變量,則無論是通過GameObject還是Component都是返回游戲物體的名字

Destroy():刪除游戲物體,但是不會立馬在unity中刪除,而是會先進行回收,等確定沒對象使用的時候,在進行刪除

DontDestroyOnLoad():當加載新的場景的時候,不刪除這個場景中的某個游戲物體

FindObjectType<>

FindObjectsType<>:t通過類型來進行查找,是進行全局的查找,則就是在整個場景中進行查找

FindGameObjectWithTag:如果查到的是多個,則只返回查找到的第一個

FindGameObejctsWithTag返回查找到的游戲物體集合

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

BroadcastMessage()廣播發(fā)送消息,則該物體上對應的方法會被調(diào)用,同時這個游戲物體上的子物體上對應的方法也會被調(diào)用的

SendMessage()發(fā)送消息,只會對這個游戲物體中腳本上的方法發(fā)送消息

SendMessageUpwards()廣播發(fā)送消息,但是和BroadcastMessage()是相反的,在調(diào)用自身的方法時也會向上傳遞,調(diào)用其父類的方法

【6】、游戲組件的查找

Cube cube=target.GetComponent<Cube>();返回一個對應的組件,如果有多個,則只返回第一個

Cube[]cc=target.GetComponents<Cube>();返回該游戲物體上所有符合條件的組件,返回一個組件數(shù)組

Cube[]xx=target.GetComponentsInChildren<Cube>();返回該游戲物體上的對應組件,同時返回該游戲物體的子類上對應的組件

Cube[]yy=target.GetComponentsInParent<Cube>();返回該游戲物體上的對應組件,同時返回該游戲物體的父類上對應的組件

4、MonoBehaviours的類:

【1】、繼承的變量成員

enabled:返回該組件是否被激活或者是被禁用,可以通過該變量來進行設(shè)置

isActiveAndEnabled:只能返回該組件是否激活的標志位,不能設(shè)置該變量,為只讀的

tag:該組件所對應的游戲物體的標簽

name:該組件所對應的游戲物體的名字

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

Invoke("方法1",float time):在等待time的時間后調(diào)用方法1

bool i=IsInvoking("方法1")返回bool值,如果方法被添加到隊列中,但沒有被運行則返回true,如果經(jīng)過一段時間后該方法被調(diào)用了則會返回false;

InvokeRepeating("方法1",time,number):等待time時間后,會重復開始運行方法1,每秒鐘運行number次。

CancelInvoke()會暫停通過Involve/InvokeRepeating的運行,但是一般來說CancelInvoke會和InvokeRepeating組合調(diào)用。參數(shù)由自己設(shè)定

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

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

5、Coroutines:協(xié)程:

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

{

yield return 0/null;

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

}

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

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

3、開啟與關(guān)閉協(xié)程時,StartCoriutine(參數(shù))、StopCoroutine(參數(shù))其中的參數(shù)要互相對應,如果傳遞的是方法名,則兩個方法中的參數(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鼠標觸發(fā)事件:如果是通過Collider進行觸發(fā)檢測的話,則要在設(shè)置中打開允許進行射線檢測。

OnMouseDown():當鼠標按下的時候觸發(fā),按一次觸發(fā)一次

OnMouseDrag():當鼠標按住不放的時候一直觸發(fā),是每一幀進行觸發(fā)

OnMouseUp():當鼠標抬起的時候觸發(fā),只執(zhí)行一次

OnMouseEnter():當鼠標進入的時候觸發(fā),進入一次觸發(fā)一次

OnMousetOver():當鼠標在觸發(fā)物體的上面時,則一直觸發(fā)

OnMouseExit():當鼠標移出的時候觸發(fā)

OnMouseUpAsButton()相當于是按鈕的功能,當鼠標在同一個游戲物體上按下抬起的時候才會觸發(fā),按下與抬起不在同一個游戲上的話則不會進行觸發(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,一般是用在控制角色血量,當玩家的血量減少的時候,不會出現(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()一般用來做移動控制,是勻速的運動,加速度固定的

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

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

8、Input輸入類:

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

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

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

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

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

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

GetButtonDown()

GetButton()

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

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

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

anyKeyDown當任何按鍵被按下(包括鼠標按鍵)時返回true

anyKey當任何按鍵被按著(包括鼠標)時返回true

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

9、Vector2;二維向量

magnitude:返回向量的長度

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

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

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

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

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

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

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

10、Vector3:三維變量

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

Project()投影運算

Reflect()反射運算

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

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

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

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

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

12、四元數(shù)Quaternion:

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

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

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

.LookRotation()讓玩家通過設(shè)置四元數(shù)來進行望向敵人的旋轉(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:可以通過剛體來控制運動,在控制運動方面,使用rigibody.positon比transform.porition計算要快的多,相關(guān)的物理計算也是在剛體中計算好了,但是不建議使用這個方法來持續(xù)的控制物體的運動,不平滑,控制一兩次的時候還可以使用

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

,rotation:

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

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

14、Camera;相機組件:

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

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

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

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

15、Application

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

dataPath:工程文件路徑

streamingAssetsPath:可以通過文件流來進行讀取的文件路徑

persistenDataPath:可以實例的文件路徑

tempporaryCachePath:臨時的文件路徑

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

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

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

Application.identifier標識名

.companyName公司名

productName產(chǎn)品名

instalMode安裝包名

isEditor是否在編輯器模式

isFocused是否在焦點

isMoliePlatform是否是移動平臺

isPlaying

isWebPlayer

platform編輯器的平臺

unityVersion unity版本號

version項目文件版本號

runInBackground是否可以在后臺運行

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

16、SceneManager場景類

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

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

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

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

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

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

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

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

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

擴充:事件的注冊時通過加方法來進行注冊的:

SceneManger.activeSceneChanged+=OnAcitiveScenenChanged;

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

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

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);

}

擴充:

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

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

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

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

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

IPointerDownHandler鼠標按下的事件,具體的接口參考手冊

Raycast Target:如果取消勾選則不做事件監(jiān)聽了,則無法實現(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ù)是原點,第二個是方向

22、CharacterController角色控制器

.SimpleMove(【vector3】)簡單移動

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

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

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

23、Mesh的設(shè)置:

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

24、API變更:

棄用:Application.LoadLevel();

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

棄用

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

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

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

改成事件了:sceenLoaded

原文鏈接:點擊前往 >
版權(quán)說明:本文內(nèi)容來自于博客園,本站不擁有所有權(quán),不承擔相關(guān)法律責任。文章內(nèi)容系作者個人觀點,不代表快出海對觀點贊同或支持。如有侵權(quán),請聯(lián)系管理員(zzx@kchuhai.com)刪除!
掃碼關(guān)注
獲取更多出海資訊的相關(guān)信息
個人VIP
小程序
快出海小程序
公眾號
快出海公眾號
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家