Unity常用API(感覺挺實用的)

1、Event Function:事件函數

 

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

 

2、Time時間類函數:

 

  1. Time.time 表示從遊戲開發到現在的時間,會隨着遊戲的暫停而停止計算。
  2. Time.timeSinceLevelLoad 表示從當前Scene開始到目前爲止的時間,也會隨着暫停操作而停止。
  3. Time.deltaTime 表示從上一幀到當前幀時間,以秒爲單位。【一般用來控制角色、動畫的運動】
  4. Time.fixedTime 表示以秒計遊戲開始的時間,固定時間以定期間隔更新(相當於fixedDeltaTime)直到達到time屬性。
  5. Time.fixedDeltaTime 表示以秒計間隔,在物理和其他固定幀率進行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行設置。
  6. Time.SmoothDeltaTime 表示一個平穩的deltaTime,根據前 N幀的時間加權平均的值。
  7. Time.timeScale 時間縮放,默認值爲1,若設置<1,表示時間減慢,若設置>1,表示時間加快,可以用來加速和減速遊戲,回放等、非常有用。如果遊戲中控制運動的都是使用了Time.deltatime的話,則可以通過設置Time.timeScale=0來暫停其運動等。
  8. Time.frameCount 總幀數
  9. Time.realtimeSinceStartup 表示自遊戲開始後的總時間,即使暫停也會不斷的增加。【一般用作性能測試】
  10. Time.captureFramerate 表示設置每秒的幀率,然後不考慮真實時間。
  11. Time.unscaledDeltaTime 以秒計算,完成最後一幀的時間 不考慮timescale時候與deltaTime相同,若timescale被設置,則無效。
  12. Time.unscaledTime 從遊戲開始到現在所用的時間 不考慮timescale時候與time相同,若timescale被設置,則無效。

 

3、GameObject類:

 

【1】、創建遊戲物體的三種方法:

 

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

 

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

 

【3】、屬性、變量:

 

  1. GameObject.activeInHierarchy 遊戲物體是否處於激活狀態,與父類有關,父類被取消激活,則子類也是取消激活的
  2. GameObject.activeSelf 自身的激活狀態,與父類無關,只與自身有關。【控制組件的激活與取消激活則使用.enable=false/true】
  3. GameObject.tag 遊戲物體的tag標籤,具體的由程序員自定義設置
  4. GameObject.SetActive(false/true) 通過參數的控制來設置其遊戲物體的激活狀態,true爲激活狀態,反之爲取消激活狀態。

 

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

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

 

【5】、消息的發送

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

 

【6】、遊戲組件的查找

 

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

 

4、MonoBehaviours的類:

 

【1】、繼承的變量成員

 

  1. enabled: 返回該組件是否被激活或者是被禁用,可以通過該變量來進行設置
  2. isActiveAndEnabled: 只能返回該組件是否激活的標誌位,不能設置該變量,爲只讀的
  3. tag :該組件所對應的遊戲物體的標籤
  4. name :該組件所對應的遊戲物體的名字
  5.  

【2】、Invoke等方法、變量:將添加要調用的方法添加到等待隊列中,然後等待用戶設定的時間後,進行隊列中的方法調用。

 

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

 

 

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

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

 

5、Coroutines:協程:

 

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

{

yield return 0/null ;

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

}

2、開啓協程:StartCoroutines(方法名());

說明:協程開啓會繼續執行下面代碼,不會等協程方法運行完再執行接下來的方法

 

3、開啓與關閉協程時,StartCoriutine(參數)、StopCoroutine(參數) 其中的參數要互相對應,如果傳遞的是方法名,則兩個方法中的參數就要是方法名,如果是IEnumerator的返回值,則其中兩個方法發的參數就要是IEnumerator的返回值

1、 private IEnumerator coroutine;

coroutine = WaitAndPrint();

StartCoroutine(coroutine);

StopCoroutine(coroutine);

 

2、StartCoroutine("WaitAndPrint");

StopCoroutine("WaitAndPrint");

4、StopAllCoroutines() 停止所有的協程,不管你是怎麼調用的

 

6、OnMousexx鼠標觸發事件: 如果是通過Collider進行觸發檢測的話,則要在設置中打開允許進行射線檢測。

 

  1. OnMouseDown(): 當鼠標按下的時候觸發,按一次觸發一次
  2. OnMouseDrag(): 當鼠標按住不放的時候一直觸發,是每一幀進行觸發
  3. OnMouseUp(): 當鼠標擡起的時候觸發,只執行一次
  4. OnMouseEnter(): 當鼠標進入的時候觸發,進入一次觸發一次
  5. OnMousetOver(): 當鼠標在觸發物體的上面時,則一直觸發
  6. OnMouseExit(): 當鼠標移出的時候觸發
  7. OnMouseUpAsButton() 相當於是按鈕的功能,當鼠標在同一個遊戲物體上按下擡起的時候纔會觸發,按下與擡起不在同一個遊戲上的話則不會進行觸發。

 

7、Mathf類:所有的成員均爲靜態的

Mathf.Abs() 返回絕對值的

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

Mathf.Clamp(value,min,max) 如果value的值在min--max之間的話就返回value,但是如果value的值小於min,則返回min,如果value的值大於max,則返回max,一般是用在控制角色血量,當玩家的血量減少的時候,不會出現出現低於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() 按鍵一直按着時觸發

GetKeyDown 按鍵被按下那一刻進行觸發

GetKeyUp 按鍵被按下後擡起時觸發

 

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

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

GetMouseButtonUp() 鼠標擡起的那一刻時觸發

 

GetButtonDown()

GetButton()

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

 

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

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

 

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

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

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

 

9、Vector2;二維向量

 

magnitude: 返回向量的長度

normalized; 返回這個向量長度爲1的矢量,不管這個向量多長,也是返回1的矢量,只是返回值,不對原向量的值產生影響

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

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

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

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

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

擴充:向量是結構體,爲值類型,修改其中的變量的時候要整體進行修改,不能單獨的進行單個變量的賦值修改

 

10、Vector3:三維變量

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

 

Project() 投影運算

 

Reflect() 反射運算

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

 

11、Random隨機數類:

 

InitState(): 通過參數指定的種子,然後再調用Range()產生隨機數的時候會依據種子來進行生成,則每一次運行所生成的隨機數都是一樣的,是僞隨機數。一般要生成的隨機數不同,可以設置參數爲System.DataTime.Now.Ticks:通過時間戳來完成

 

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

insideUnitSphere: 在單位爲1的球內隨機生成一個位置信息,如果要在更大的球中生成,則可以在後面*圓的半徑信息。

 

 

12、四元數 Quaternion:

 

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

 

.eulerAngles 將四元數轉變爲歐拉角

Euler() 將歐拉角轉變爲四元數

 

.LookRotation() 讓玩家通過設置四元數來進行望向敵人的旋轉,將向量方向轉變爲四元數

 

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

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

player.rotation= Quaternion.LookRotation(temp);

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

Quaternion target= Quaternion.LookRotation(temp);

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

 

 

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

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

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

,rotation:

MoveRotation 用來控制剛體的旋轉的,一般不建議使用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("") 打開指定的網址

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

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

 

 

Application.identifier 標識名

.companyName 公司名

productName 產品名

instalMode 安裝包名

isEditor 是否在編輯器模式

isFocused 是否在焦點

isMoliePlatform 是否是移動平臺

isPlaying

isWebPlayer

platform 編輯器的平臺

unityVersion unity版本號

version 項目文件版本號

runInBackground 是否可以在後臺運行

 

 

UnityEditor.EditorApplication.isPlaying=false; //在編輯器模式下推出編輯狀態

 

 

 

16、SceneManager場景類

 

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

SceneManager.LoadSceneAsync() 異步加載下一個場景,返回AsyncOperation類型,裏面包含了加載的信息,加載的進度條等等。可以讓用戶緩解等待加載場景的時間

sceneCount 獲得當前加載的場景個數

sceneCountInBuildSettings 在Build面板中加載的場景個數

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

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

 

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

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

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

 

 

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

SceneManger.activeSceneChanged+=OnAcitiveScenenChanged;

 

17、射線檢測:一般射線檢測要在射線檢測的範圍內,並且被檢測物體要有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); //創建射線

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

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

{

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

}

擴充:

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

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

 

18、代碼監聽觸發事件:

 

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

 

通過實現接口來註冊監聽事件: using UnityEgine.EventSystems; 導入命名空間

 

 

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

Raycast Target: 如果取消勾選則不做事件監聽了,則無法實現檢測了

 

19、www類,下載 是用來在網絡中下載資源的,

 

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: 返回放在屏幕上的手指信息,返回數組

Touch touch1=Input.touches[0];

touch1.position;

TouchPhase pahse=touch1.phase phase 是用來返回手指的狀態的

 

21、Debug.DrawRay(ray.oridin,ray.direction) 繪製射線,第一個參數是原點,第二個是方向

 

22、CharacterController角色控制器

 

.SimpleMove(【vector3】) 簡單移動

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

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

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

 

23、Mesh的設置:

 

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

 

24、API變更:

 

棄用:Application.LoadLevel();

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

棄用

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

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

 

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

改成事件了:sceenLoaded

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章