筆記12 Unity常用的API
- 組件
- 生命週期裏的方法
- Vector3結構體
- Mathf(結構體)與數學相關。它的常用api
- Time(類)。它的常用屬性
- GameObject(類)
- transform
組件
生命週期裏的方法
構造
//構造
private void Awake()
{
Debug.Log("Awake");
}
// Use this for initialization
void Start () {
Debug.Log("Start");
}
刷新
GPU控制的每幀調用一次的刷新
// Update is called once per frame每幀調用一次
void Update () {
Debug.Log("Update");
}
//Update調用之後,調用一次。
private void LateUpdate()
{
//攝像機跟隨
Debug.Log("LaUpdate");
}
CPU控制的固定時間刷新
/*固定時間刷新,一秒調用60次。1秒除以60,約每隔0.02f。
比如可使得下落的物體,在各臺電腦上下落的位移一樣。*/
private void FixedUpdate()
{
//物理事件。
}
激活
//激活調用
private void OnEnable()
{
Debug.Log("Enable");
}
//非激活調用
private void OnDisable()
{
Debug.Log("Disable");
}
一箇舊方法
爲了把GUI很平滑的渲染出來
//舊方法。每兩幀調用一次。
private void OnGUI()
{
}
銷燬
//銷燬的時候調用
private void OnDestroy()
{
//釋放或者關閉一些變量的
Debug.Log("OnDestroy"); //Debug調試
}
Vector3結構體
創建,得到單位向量、模、模的平方,常用向量簡寫
void Start () {
Vector3 v = new Vector3(1, 1, 1);
//可以new一個空的,在下面v.x,x.y,v.z賦值
//得到v的單位向量
Debug.Log(v.normalized); //結果:(0.6,0.6,0.6)
//得到v的模
Debug.Log(v.magnitude); //結果:1.73
//得到v的模的平方。可用於比較向量大小
Debug.Log(v.sqrMagnitude);
//常用向量簡寫
Debug.Log(Vector3.zero); //等於new Vector3(0, 0, 0)
Debug.Log(Vector3.forward); //001 反方向Debug.Log(-Vector3.forward);
Debug.Log(Vector3.up); //010
Debug.Log(Vector3.right); //100 Debug.Log輸出
}
向量的點乘Vector3.Angle。公式:a.b = |a||b|cosθ
計算兩個向量的夾角
//兩個向量的夾角
Debug.Log(Vector3.Angle(Vector3.up, Vector3.forward));
計算兩點的距離Vector3.Distance
//計算兩點的距離。
//向量是可以乘以變量(數值)的,就是XYZ都乘以標量。計算000與0,0,10的距離。結果:10
Debug.Log(Vector3.Distance(Vector3.zero, Vector3.forward * 10));
插值Vector3.Lerp(做移動)
插值,一個百分比
比如0至10,插值爲0.1f,那麼插值的結果:0+(10-0)*0.1是1
比如10至20,插值爲0.1f,那麼插值的結果:10+(10-0)*0.1是11
位移(位移到第一次插值結果的位置)
transform.position = Vector3.Lerp(transform.position, Vector3.forward * 10, 0.1f);
//transform組件的位置position = 起始值(從他自身的位置),終點,插值(0.1)
/*結果:
位移到transform.position +(Vector3.forward * 10 —transform.position)*0.1的位置。
此處,由於其實位置是000,所以位移到了0,0,1*/
減速移動(位移到第二個參數的位置。沒必要用)
void Update ()
{
//因爲讓它動起來,所以寫在Update裏面。
transform.position = Vector3.Lerp(transform.position, Vector3.forward * 10, 0.1f);
//從transform.position移動到Vector3.forward * 10,減速。
}
勻速運動(沒必要用)
transform.position = Vector3.Lerp(transform.position, transform.position+Vector3.forward * 10, 0.01f);
/*因爲參數二里麪包含了變化的參數一,所以二者的差永遠是相同的,
那麼每次插值結果便是相同的,所以形成勻速運動,且不會停止。
因爲是運動,需要多次執行代碼,所以是寫在Update裏的。*/
調試方法
輸出:Debug.Log和 print
print是MonoBehaviour的成員方法,所以只有當類繼承於 MonoBehaviour時,纔可以用。
而Debug.Log是使用的Debug的靜態方法,所以沒有上面那樣的限制。
print其實是Debug的封裝,一種簡單寫法。
位置:Start
print(111); //輸出。隨便什麼類型。
畫線Debug.DrawLine(特點:移動物體,終點固定,線的長度變化)
位置:Update
//畫線。例:往天上10米的位置畫線。(起始位置(自身位置),終點(0,10,0),標記(紅色))
//不標記的話,可以不寫標記那個參數。特點:移動物體,終點固定,線的長度變化
Debug.DrawLine(transform.position, Vector3.up * 10, Color.red);
畫射線Debug.DrawRay(特點:移動物體,線的長度不變,終點不固定。)
位置:Update
//畫射線(起始位置(自身位置),終點(自身位置基礎上的0,10,0),標記(藍色))。
//特點:移動物體,線的長度不變,終點不固定。
Debug.DrawRay(transform.position, Vector3.up * 10, Color.blue);
四元數(結構體)
旋轉Euler
位置:Update
//它有個類方法叫Euler歐拉,歐拉轉成了四元數。
//括號裏可以填Vector3的結構體,代表一個角度。也可以直接寫xyz。
Quaternion q = Quaternion.Euler(0, 0, 90); //讓z軸旋轉90度。
空旋轉identity(000的意思)
位置:Update
//空旋轉(000的意思)。
//因爲我們可萌不知道給多少度是空旋轉,所以給了一個變量identity,代表這是一個空旋轉。
q = Quaternion.identity;
朝向一個向量(不管怎麼移動,依舊朝向那個向量)
//首先拿到Transform組件(要面向的圓柱),此處是Cylinider的Transform。
public Transform Cylinider;
void Update ()
{
//朝向一個向量 (不管怎麼移動,依舊朝向那個向量)
//拿到面向Cylinider的一個向量。要面向的圓柱的位置-我的位置
Vector3 dir = Cylinider.position - transform.position;
//朝向dir向量
q = Quaternion.LookRotation(dir);
//賦值回去。rotation旋轉
transform.rotation = q;
}
四元數也可以有插值
transform.retation在unity裏是歐拉角,在代碼裏就是四元數。
eulerAngles歐拉角,transform.eulerAngles就是它真實的歐拉角度了。
transform.rotation用四元數表示角度,transform.eulerAngles用歐拉角表示角度,二者都代表了角度。
從當前的角度,到這樣的角度(Y軸轉90度),插值是0.1。
返回值(插值後的四元數)賦給自己。結果:一直轉。
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, transform.eulerAngles.y + 90, 0),0.1f);
Mathf(結構體)與數學相關。它的常用api
絕對值Mathf.Abs(簡單又常用)
//絕對值
int n = Mathf.Abs(-1);
插值Mathf.Lerp
//插值。對一個軸進行插值,Vactor3是對三個軸進行插值
Mathf.Lerp(0, 10, 0.1f);
限制數
法一Mathf.Clamp:三個參數
此處,如果n是0到5之間的數,那麼就是本值。如果n大於5,則n會變成5。如果n小於0,則會變成0。
可用於限定年齡。
//限制數。參數1:要限制的數(輸入值)。參數2:最小值。參數3:最大值。
n = Mathf.Clamp(n, 0, 5);
法二Mathf.Clamp01:一個參數
//限制數。返回值必須是float。就相當於上面n = Mathf.Clamp(n, 0, 1);所以一般用上面的方法
float f = Mathf.Clamp01(n);
計算三角函數
Mathf.Sin();
Time(類)。它的常用屬性
遊戲從開始到現在所運行的總時間Time.time
位置:start
可用於提醒,保存進度
//遊戲從開始到現在所運行的總時間。time是靜態的,因爲直接用類名Time調用的。
float t = Time.time;
從上一幀到這一幀所用的時間Time.deltaTime,及移動
void Update () {
//從上一幀到這一幀所用的時間。
float t = Time.deltaTime;
/*用於單位的轉化。
例如:移動。從當前位置往前移動10米。
由於它默認的是米/幀,不是米/秒。爲了每臺設備運行一致,所以將單位統一成秒。
所有的數值都*Time.deltaTime*/
Vector3 move = transform.position + Vector3.forward * 10;
}
固定時間調用一次FixedUpdate,可修改
//固定時間調用一次,默認0.02秒調用一次。可以修改,但一般不要修改
private void FixedUpdate()
{
}
它是可以修改的,但一般不要修改。例如2d遊戲,要求不高時,可用。
void Start ()
{
/*修改FixedUpdate調用時間。
FixedUpdate默認也是0.02秒。此時改成了1,則上面的方法是1秒調用一次。*/
Time.fixedDeltaTime = 1f;
}
時間縮放Time.timeScale
//timeScale是時間縮放,默認值是1。它影響的只是Update和LateUpdate。一般不會修改
Time.timeScale = 1;
GameObject(類)
unity裏的物體,在c#裏,都叫GameObject類。
我們寫的代碼是在test這個組件裏面寫的,Transform也是一個腳本,只不過它是系統寫好的,掛在那的。對於test這個腳本來說,我們如何拿到它所掛載的物體?直接調用GameObject即可。
拿到當前腳本所掛載的物體
//拿到當前腳本所掛載的物體。直接調用GameObject即可。go就是當前空的遊戲物體。
GameObject go = gameObject;
便捷的拿到Transform組件
每個物體都有Transform組件
//便捷的拿到Transform組件
Transform trans = go.transform;
它倆之間的關係:通過物體拿到組件,有了組件可以得到它所掛載的物體,有了物體,又可以得到它的組件……
可以寫一溜,然後調用裏面的方法。gameObject.transform.gameObject.transform.方法
很好用,所以給了上面的transform屬性,直接go.transform即可。其他屬性就不能這樣拿了,比如test也是一個組件,但不能go.test。
獲取物體的激活狀態
//獲取物體的激活狀態
Debug.Log(go.activeSelf); //true激活
更改物體的激活狀態
//更改物體的激活狀態。用方法
go.SetActive(false); //改成false非激活狀態
更改組件的激活狀態
//更改組件的激活狀態。但是transform不行。用屬性
//enabled = false;
更改遊戲物體的名稱
//更改遊戲物體的名稱
Debug.Log(go.name);
輸出標籤
//輸出標籤
Debug.Log(go.tag);
打印層
//打印層。layer是int類型,結果就是名稱前面的數。
Debug.Log(go.layer);
拿到組件(利用泛型)
//拿到組件。利用泛型
//比如拿到AudoSource組件
AudioSource plear = go.GetComponent<AudioSource>();
//比如拿到teste組件
test test = go.GetComponent<test>();
拿到Cube物體
方法一:寫一個變量GameObject,並把它設置爲public
//拿到Cube物體
public GameObject cube ;
方法二:通過大名去找Find
//拿到Cube物體,通過大名去找,效率低,少用。
GameObject cube = GameObject.Find("Cube");
方法三:通過tag值(標籤)去找
拿到一個物體
//拿到一個物體。比如上面的Cube的標籤是Player,通過標籤,拿到Cube。
cube = GameObject.FindWithTag("Player");
拿到同標籤的一組物體
/*它的返回值是一個數組。它會將所有標籤爲Player的物體拿到,並放到這個數組裏。
然後就可以對他們進行統一的操作了。*/
GameObject[] cubes = GameObject.FindGameObjectsWithTag("Player");
transform
功能一:位置、旋轉、縮放
拿到它的位置
當前物體的世界座標點
//拿到當前物體的世界座標點
Debug.Log(transform.position);
當前物體的本地座標點(相對於父物體的座標)
//當前物體的本地座標點。相對於父物體的座標
Debug.Log(transform.localPosition);
歐拉角
世界歐拉角
//世界歐拉角。旋轉父物體,子物體會以父物體爲中心點一起旋轉。
Debug.Log(transform.eulerAngles);
本地歐拉角
//本地歐拉角。相對於父物體的角度
Debug.Log(transform.localEulerAngles);
本地縮放(縮放僅此一種)
//本地縮放。即縮放父物體,子物體一起縮放。所以相對於父物體來說是沒縮放的。
Debug.Log(transform.localScale);
四元數
世界四元數
//世界四元數。unity裏的rotation是指歐拉角,此處是指四元數。
Debug.Log(transform.rotation);
本地四元數
//本地四元數
Debug.Log(transform.localRotation);
獲取當前物體的前方(z軸)、上方、右方的單位向量
//當前物體的前方向量(z軸)
Debug.Log(transform.forward);
//當前物體的上方向量
Debug.Log(transform.up);
//當前物體的右方向量
Debug.Log(transform.right);
移動transform.Translate
位置:Update
//移動。方向*速度*Time.deltaTime
//方向常用單位向量,例如此處爲transform.up
//*Time.deltaTime是爲了將速度的單位由幀轉化成秒。此處表示向上,10米/秒。
transform.Translate(transform.up * 10 * Time.deltaTime);
旋轉
自轉transform.Rotate
//旋轉。transform.up表示繞着Y軸。此處表示繞着Y軸旋轉,20度/秒。
transform.Rotate(transform.up * 20 * Time.deltaTime);
公轉transform.RotateAround
//繞着某個點或物體旋轉。此時表示繞着世界座標的000點的Y軸旋轉,30度/秒。
transform.RotateAround(Vector3.zero, Vector3.up, 30 * Time.deltaTime);
看向某點transform.LookAt
//看向某點。之前學的是朝向某個向量。
transform.LookAt(Vector3.zero);
功能二:保存父子物體的功能
拿到父物體parent
parent代表我的父物體的transform組件。因爲他們真正有聯繫的是transform組件。
爲了方便,有幾個屬性,只要拿到組件,就可以拿到遊戲物體的屬性。主要就是name和tag值。
//打印出了父物體的名稱。
//Debug.Log(transform.parent.name);
設置父子物體transform.SetParent
可用於做物品欄。當把物品放在物品欄時,物品欄就變成了物品的父物體。
//設置父子物體。運行的時候是父子關係,不運行的話,還是原樣。
transform.SetParent(GameObject.Find("Sphere").transform);
通過索引,得到子物體transform.GetChild
//通過索引,得到子物體。索引0,表示第1個子物體。
Debug.Log(transform.GetChild(1));
查看子物體個數transform.childCount
//查看子物體個數
Debug.Log(transform.childCount);
找到根部的父物體transform.root
//找到根部的父物體
Debug.Log(transform.root);
尋找子物體transform.Find
//尋找子物體。和gameObject.Find很像,都是用名稱查找。gameObject.Find返回GameObject
//此處的返回值是Transform,找到子物體名字叫Cylinder的輸出出來。
//transform.Find效率高,因爲它只在它的子物體裏查找。能找到非激活的子物體。
Transform trans = transform.Find("Cylinder");
Debug.Log(trans.name);