unity基礎

推薦閱讀:

      

Transform 類

Transform.Translate 移動:
例1:

transform.Translate(Vector3.forward * moveSpeed);

例2:

transform.Translate(Vector3.up * moveSpeed, Space.World);

例3:

transform.Translate(0, 0, moveSpeed);

例4:

 transform.Translate(Vector3.right * moveSpeed, Camera.main.transform);

Transform.Rotate 繞着通過物體中心點的某個軸旋轉:
例1:

transform.Rotate(Vector3.right * rotSpeed);

例2:

 transform.Rotate(Vector3.up * rotSpeed, Space.World);

例3:

transform.Rotate(rotSpeed, 0, 0);

Transform.RotateAround 繞着任意軸旋轉

Transform 與 transform 區別

就是類(Transform)與對象(transform)的區別
Transform 組件 :每個遊戲物體默認帶有的組件,有且只有一個,不能手動添加。
transform :當前遊戲物體的 Transform 組件對象。

Time

Time.deltaTime 增量時間,以計算,完成一幀的時間(只讀。 當你乘以Time.deltaTime實際表示:每秒移動物體10米,而不是每幀10米。
注意:在OnGUI裏不應該依賴於Time.deltaTime,因爲OnGUI可以在每幀被多次調用並且每次調用deltaTime將持有相同的值,直到下一幀再次更新。

Input

鍵盤:
GetKey :當用戶按下由name名稱確定的按鍵時,返回 true。
GetKeyDown :當用戶按下指定名稱的按鍵時的那一幀返回 true。
GetKeyUp :在用戶釋放給定名字的按鍵的那一幀返回 true。
鼠標:
GetMouseButton :當指定的鼠標按鈕被按下時返回 true。
GetMouseButtonDown :在用戶按下指定鼠標按鍵的那一幀返回 true。
GetMouseButtonUp :在用戶釋放指定鼠標按鍵的那一幀返回 true。
數字鍵 0 表示鼠標左鍵;數字鍵 1 表示鼠標右鍵;數字鍵 2 表示鼠標中鍵。
GetAxis 根據 axisName 名稱返回虛擬輸入軸中的值。例如:

float v = Input.GetAxis("Vertical") ;
float h = Input.GetAxis("Horizontal");

Object

Object.Destroy:會在 Update 之後,渲染之前執行銷燬操作。
使用方法:

    // 刪除當前遊戲對象
    Destroy (gameObject);

    // 刪除當前這個腳本
    Destroy (this);

    // 刪除當前遊戲對象上的剛體組件
    Destroy (rigidbody);

    // 5秒後刪除這個遊戲對象
    Destroy (gameObject, 5);

Object.Instance:實例化對象。
使用方法:

    public static Object Instantiate(Object original);
    public static Object Instantiate(Object original, Transform parent);
    public static Object Instantiate(Object original, Transform parent, bool worldPositionStays);
    public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);
    public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent);

參數:

original:需要被克隆的原始物體
position:新物體的位置
rotation:新物體的旋轉
parent:指定新物體的父物體
worldPositionStays:當指定父物體以後仍保持原始的世界座標

Resources 資源

Resources類允許你從指定的路徑查找或訪問資源,但是在Unity中通常不需要使用路徑名來訪問資源,相反你可以通過聲明一個成員變量來暴露一個資源的引用,然後在檢視面板中指定它。使用這個技巧的時候Unity可以在構建的時候自動計算哪個資源被使用。這從根本上最大限度地減少了實際用於遊戲的資源的尺寸。
Resources.Load 加載:路徑名使用正斜槓“/”,如果使用反斜槓“\”會不正常運行。
當資源不再需要時,可以使用Resources.UnloadUnusedAssets回收內存。

Quaternion

四元數表示旋轉

優點:
可以避免萬向節鎖現象
只需要一個4維的四元數就可以繞任意過原點的向量的旋轉,方便快捷,在某些實現下比旋轉矩陣效率更高;
可以提供平滑插值
缺點:
比歐拉旋轉稍微複雜了一點點,因爲多了一個緯度
理解更困難,不直觀

燈光和攝像機

光源類型

1、 Directional light: 方向光源
類似於自然界的太陽光,該類型光源可以影響場景中的一切遊戲對象,與光源所在位置無關,只與光源的角度有關。是最不耗費圖形處理器資源的光源類型。

2、Point Light: 點光源
點光源從一個位置發出光線,影響其範圍內的所有對象,類似於燈泡的照明效果。點光源的陰影時較耗費圖像處理器資源的光源類型。

3、Spltlight: 聚光燈
燈光從一點發出,在一個方向按照一個錐形的範圍照射,處於錐形區域內的對象會受到光照照射,類似於射燈的照明效果。聚光燈是較耗費圖形處理器資源的燈光類型。

4、Area Light: 區域光/面光源
該類型光源無法應用於實時光照,僅適用於光照貼圖烘焙。

參數介紹
Cookie: 該項用於爲光源指定擁有 alpha 通道的紋理,使光線在不同的地方有不同的亮度。如果光源是聚光燈或方向光,可以指定一個2D 紋理。如果光源是一個點光源,必須指定一個 Cubemap(立方體紋理)。

Cookie Size: 該項用於控制縮放 Cookie 投影。只有方向光有該參數。

注意:
Forward 渲染模式下,只有 Directional light 光源可以表現陰影。
Deferred Lighting 渲染模式下, Point light、Spot light 類型光源可以表現陰影(只有發佈成 Web 版或單機版才支持)。

聲音組件

AudioListener: 音頻監聽組件。該組件用於接收音頻,相當於人的耳朵。

注意:
爲場景添加攝像機時,Unity 會自動爲攝像機對象添加 AudioListener 組件,由於一個場景中只能有一個該組件,所以需要手動的刪除其他組件,使場景中只保留一個該組件。

unity支持的音頻格式: .mp3 .ogg .aiff .wav .mod .it .sm3

Random 隨機數

Range 在最大值(包括)和最小值(包括)範圍內返回一個隨機數(只讀)

物理系統

(一)碰撞檢測
條件
1.兩個及以上: 碰撞必須要兩個或兩個以上的物體相互作用
2.至少有一個運動的物體:碰撞必須是兩個動態或者一個動態一個靜態物體發生碰撞

以上說明看出碰撞必須有一個動態物體的存在
什麼是動態物體?會發生運動變化的物體,他必須擁有運動特性->可以受到力的影響
什麼是靜態物體?沒有運動特性的物體
如何讓物體產生動態特性? 在Unity引擎中我們可以使用“剛體”實現動態特性
(二) 剛體
具有運動特性,在收到外力作用下可以保持物體的形狀不發生改變,這樣的組件,我們稱爲“剛體組件”;
(三)碰撞幾何體
爲運動物體和靜態物體提供一個幾何圖形的包圍盒來保護我們的物體內部結構,同時提供檢測的特性,主要有以下幾種:
立方體 球體 膠囊體 網格面 輪距
(四)Rigidbody 剛體組件
物體發生碰撞的必要條件:兩者必須都有碰撞器且至少有一個具有剛體組件。

unity3d中的碰撞器和觸發器的區別?
碰撞器是觸發器的載體,而觸發器只是碰撞器身上的一個屬性
當Is Trigger=false時,碰撞器根據物理引擎引發碰撞,產生碰撞的效果,可以調用OnCollisionEnter/Stay/Exit函數;
當Is Trigger=true時,碰撞器被物理引擎所忽略,沒有碰撞效果,可以調用OnTriggerEnter/Stay/Exit函數。
如果既要檢測到物體的接觸又不想讓碰撞檢測影響物體移動或要檢測一個物件是否經過空間中的某個區域這時就可以用到觸發器。

對於Unity引擎來說,所有力學的處理都應該放在FixedUpdate進行。

注意:不要更改Time屬性中的固定時間,如果更改了可能會造成物理引擎不同步問題

協同

Unity引擎不支持C#多線程。
格式:

[修辭]  IEnumerator  協同函數名(行參列表)

注意:最多只能有一個參數
例如:

    IEnumerator Run()
    {
        語句;
        yield return new WaitForSeconds(等待時間);// 如果返回以後,下次進入協同方法會從返回的語句之後繼續執行,執行完上面的代碼後休息指定的秒數,它不會影響引擎更新函數
    }

調用協同函數:

StartCoroutine(協同函數帶實參列表);

例如:

StartCoroutine("Run");

停止協程:

StopCoroutine("Run");

異步加載:使用方法Resources.LoadAsync,結合協程實現異步加載。
例如:

    using UnityEngine;
    using System.Collections;

    public class ExampleClass : MonoBehaviour {
        void Start() {
            StartCoroutine(LoadTexture());
        }
        IEnumerator LoadTexture() {
            ResourceRequest request = Resources.LoadAsync("glass");
            yield return request;
        }
    }

協同
1、協同必須在 MonoBehaviour 繼承類中啓動

2、協同定義隨便,只要在 Unity 引擎內的什麼類中都可以定義

3、協同一旦啓動它會立即執行協同函數的第一段,所以你儘量不要把負荷很大的代碼寫在第一段裏

4、協同除了第一次啓動會立即執行外,其他時候都是在 Update 函數之後

5、協同是假的多線程,所以它可以無條件訪問成員級變量和函數,無需線程互斥

6、協同函數中定義變量是協同函數全局的

7、協同函數中的代碼都是過程化的,沒有面向對象的概念

8、不要在循環中調用協同方法

9、事件函數也可以改寫成協同方法

在協同中可以調用其他協同方法,例如:

StartCoroutine(Run());

yield return StartCoroutine(Run());

向量的點乘與叉乘

點乘
數學表示:a•b = |a| x |b| x cosƟ;
代碼表示:

float r = Vector3.Dot(a, b);

意義::如果 r 大於 0,則可以判斷目標在我的前方;r 小於 0,目標在我後方

a 可以用主角的 forward 方向

b 用目標的 position - 主角的 position

a 的模可以通過 a.magnitude 獲得

差乘
數學表示:a X b = |a|x|b|xsinƟ;
代碼表示:

Vector3 r = Vector3.Cross(a, b);

意義::所得的向量與這兩個向量垂直的;可以通過所得的向量來判斷,目標在我的左方還是右方

組件間的消息傳遞

作用於當前的遊戲物

SendMessage ("方法名", object類型的參數,SendMessageOptions.DontRequiredReceiver);

作用於當前遊戲物體以及所有的父物體

SendMessageUpwards("方法名", object類型的參數, SendMessageOptions.DontRequiredReceiver);

作用於當前遊戲物體以及所有的子物體

BroadcastMassage ("方法名", object類型的參數, SendMessageOptions.DontRequiredReceiver);

提示:
1.調用帶參數的方法,不要調用重載方法

2.效率非常低,一般不使用

3.最多隻有一個參數

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