寫在前面
寫本系列的目的(自用)是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解,方便自己以后快速復習,減少遺忘。這里只有部分語法知識。
五、Time時間相關
1、時間縮放比例
概念:可以通過UnityEngine.Time類的timeScale屬性控制游戲時間流速
用法:暫停時間: 設置Time.timeScale = 0
? ? ? ? ? ?正常速度: 設置Time.timeScale = 1(默認值)
? ? ? ? ? ?倍速播放: 設置Time.timeScale = n(n>1時為n倍速,如2表示兩倍速)
應用場景:游戲暫停功能實現、???????過場動畫的慢動作/快進效果???????、技能冷卻時間加速/減速。
2、幀間隔時間
概念:幀間隔時間指最近?幀完成?次游戲循環所?的時間,單位是秒。游戲本質是死循環,?幀即?次循環執?。
用法:???????通過Time.deltaTime獲取受時間縮放影響的幀間隔時間,Time.unscaledDeltaTime獲取不受影響的幀間隔時間。
其中,受影響的幀間隔時間 = 不受影響的幀間隔時間*縮放比例timeScale。不受scale影響的幀間隔時間始終返回實際幀間隔時間。如下例:
public class time : MonoBehaviour
{void Update(){//Time.timeScale = 0;//Time.timeScale = 1;Time.timeScale = 2;print("幀間隔:"+Time.deltaTime);print("不受影響幀間隔:"+Time.unscaledDeltaTime);}
}
輸出:?
作用:?
(1)實現位移計算:???????基于物理公式路程 = 時間 × 速度,在Update()中每幀?Time.deltaTime參與計算實現平滑移動。
(2)選擇是否跟隨游戲靜止:???????需要隨游戲暫停停?移動:使?Time.deltaTime、???????需要?視游戲暫停繼續移動:使?Time.unscaledDeltaTime
(3)加速原理:timeScale=2時,受影響的幀間隔時間值變為實際值×2,導致位移計算量倍增,表現為2倍速效果。
3、游戲開始到現在的時間
Time.time:???????受timeScale影響的游戲運?時間
Time.unscaledtime:不受timeScale???????影響的真實運?時間
print("游戲時間" + Time.time);
應用:主要用于單機游戲計時,網絡游戲一般使用服務器時間。
4、 物理幀間隔時間
(1)物理幀間隔時間和幀間隔時間的區別
物理幀間隔時間:指 Unity物理引擎(如剛體運動、碰撞檢測、關節模擬)的更新間隔時間,用于保證物理模擬的一致性和穩定性。
幀間隔時間:指渲染幀(游戲畫面更新)之間的時間差,即一幀渲染完成到下一幀開始渲染的間隔。
(2)物理幀間隔時間
物理幀間隔時間是固定的,可以通過???????Edit→Project Settings→Time設置Fixed Timestep值。默認值為0.02秒(50Hz)
獲取方法:
void Update(){Time.timeScale = 2;}private void FixedUpdate(){print("物理幀間隔" + Time.fixedDeltaTime);print("不受scale影響" + Time.fixedUnscaledDeltaTime);}
?5、幀數
???????概念:幀數表示從游戲開始到現在運?的循環次數,?幀即?次游戲循環。Unity底層只有?個主循環,不同腳本中的Update?法都在同?幀中按順序執?。
獲取方法:???????通過Time.frameCount靜態屬性獲取,該屬性返回int類型值,記錄當前累計幀數。
print(Time.frameCount);
六、 Vector3基礎、位置位移
transform:???????游戲對象的位移、旋轉、縮放等操作都由Transform組件處理,是Unity中極其重要的類
vector3主要用于表示三維坐標系中的點和向量
1、Vector3
(1)Vector3的聲明
vector3的聲明可以采用無參構造、有參構造。vector3可以不new直接賦值。
void Start(){Vector3 v = new Vector3();v.x = 10;v.y = 10;v.z = 10;//當參數不滿3個時,沒有傳入的參數默認為0Vector3 v1 = new Vector3(10, 10);Vector3 v2 = new Vector3(10, 10, 10);Vector3 v3;v3.x = 10;v3.y = 10;v3.z = 10;}
需要注意的是,當使用有參構造時,若傳入的參數不足三個,沒傳入的參數默認為0。
(2)Vector3的運算
+ - * / 都有
void Start()
{Vector3 v4 = new Vector3(1, 1, 1);Vector3 v5 = new Vector3(2, 2, 2);print(v4 * 10);print(v5 / 2);print(v4 + v5);
}
輸出如下:
(3)常用靜態屬性與方法
Vector3有一些常用靜態屬性,可以生成特殊的向量
void Start()
{print(Vector3.zero);//000print(Vector3.right);//100print(Vector3.left);//-100print(Vector3.forward);//001print(Vector3.back);//00-1print(Vector3.up);//010print(Vector3.down);//0-10
}
結果是:
?Vecotr3的常用方法可以直接計算兩個點之間的距離:
void Start()
{Vector3 v4 = new Vector3(1, 1, 1);Vector3 v5 = new Vector3(2, 2, 2);print(Vector3.Distance(v4, v5));
}
?2、位置
(1)相對于世界坐標系的位置
位置獲取:通過this.transform.position獲取當前腳本掛載的對象相對于世界坐標系原點的位置
由于面板里顯示的對象位置與父對象有關,所以如果當前對象有父對象且???????父對象位置不在原點,?板顯示的位置與transform.position獲取的值會不同。當父對象的位置在原點000時,相同。
此時沒有父對象:
void Start(){this.transform.position = new Vector3(10, 10, 10);print(this.transform.position);}
運行前后的面板及控制臺輸出:
當有父對象時,由于面板顯示的是子對象相對父對象的位置坐標,就會與輸出結果(世界坐標產生差異),所以也可以直接輸出相對父對象的位置坐標。?
(2)相對父對象的位置
位置獲取:使?this.transform.localPosition獲取相對于?對象的位置
這樣,localPosition始終與Inspector面板顯示的位置一致。
void Start(){print(this.transform.position);print(this.transform.localPosition);}
(3)對象的位置修改、朝向獲取
對象的朝向獲取可以采用之前提到的Vector3.up、Vector3.forward等。例如:
print(this.transform.forward);
print(this.transform.up);
這里分別打印的是對象的面朝向和頭頂朝向。?
若是要對對象的x、y、z軸進行修改,需要統一修改,不能單獨修改其中一個坐標的值,除非采用整體賦值。
void Start(){this.transform.localPosition = Vector3.up * 10;print(this.transform.localPosition);//若是想改變單一坐標軸this.transform.localPosition = new Vector3(10, this.transform.localPosition.y, this.transform.localPosition.z);print(this.transform.localPosition);//還可以整體修改Vector3 vt = this.transform.localPosition;vt.x = 0;this.transform.localPosition = vt;print(this.transform.localPosition);}
結果為:
3、位移
在坐標系下,位移的核心公式為:路程=方向 × 速度 × 時間,適?于所有維度坐標系。類似于數學里的,向量以及向量在每個坐標軸上的分量。
位移可以自己計算以及利用API計算。
(1)自己計算位移
自己計算位移嚴格遵循核心方式:路程=方向×速度×時間即可。由于運動與幀相關,因此寫在upDate函數中。
其中,方向傳入的是Vector3向量。位移方向有兩種:相對于自身的坐標系、相對于世界的坐標系。如果要相對于自身,就可以使用this.transform.方向。需要相對于世界就直接傳入對應的Vector3向量,例如Vector3.right。
速度寫入一個數字即可,時間可以使用Time.deltaTime保證幀率無關的平滑運動。如下:
void Update(){//相對于對象自身的坐標系的x軸正方向移動this.transform.position += this.transform.right * 1 * Time.deltaTime;//相對于世界坐標系的x軸正方向移動this.transform.position += Vector3.right * 1 * Time.deltaTime;}
(2)使用API位移
使用transform.Translate方法。常用的重載方法是:???????
Translate(Vector3 translation)、???????Translate(Vector3 translation, Space relativeTo)
其中第一個參數是位移向量,計算公式為路程 = 方向 × 速度 × 時間;第二個參數是相對坐標系(默認Space.Self)。
其中,參數為Space.Self時表示相對于物體自身坐標系,為Space.World表示相對于世界坐標系。
void Update(){//1、相對于世界坐標系,朝向z軸世界坐標系的正方向this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.World);//2、相對于世界坐標系,自己的面朝向去動this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.World);//3、相對于自己坐標系的自己的面的z方向動 (基本不使用)this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.Self);//4、相對于自己的坐標系下 z軸正方向移動this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.Self);}
七、角度和旋轉
1、角度
角度同樣有兩種,相對世界坐標系的角度和相對父對象的角度。角度采用的方法是transform.eulerAngles。
void Start(){//打印相對世界坐標的角度print(this.transform.eulerAngles);//打印父對象的角度print(this.transform.localEulerAngles);}
打印結果:
?修改角度的方式與修改位置的方式一樣,必須同時設置x,y,z三個方向,不能單獨修改某一方向。
this.transform.localEulerAngles = Vector3.zero;
2、旋轉
旋轉分為自傳和公轉(繞某個點或某個對象旋轉)
(1)自轉
自轉使用Unity自帶的API,transform.Rotate,這個方法常用的有兩種形式:兩參數形式和三參數形式。
以下例子的第一句就是兩參數形式,兩個參數分別為:指定每個軸具體轉多少度、坐標系選擇(世界or自己,默認為自己)
第二句是三個參數,三個參數分別為:旋轉軸方向(常用Vector3.up/right/forward)、旋轉角度、坐標系選擇(世界or自己,默認為自己)
void Update(){this.transform.Rotate(new Vector3(0, 10, 0) * Time.deltaTime,Space.World);this.transform.Rotate(Vector3.right, 10 * Time.deltaTime);}
(2)繞著點轉
繞著點轉使用的是函數transform.RotateAround(),會傳入三個參數:旋轉中心點、旋轉軸方向、旋轉角度
void Update()
{transform.RotateAround(Vector3.zero,Vector3.up,10*Time.deltaTime);
}
運行時,當前對象會繞著000點公轉:
八、縮放和看向?
1、縮放
(1)兩種縮放
縮放同樣有兩種,相對世界坐標系進行縮放和相對父對象進行縮放,其中
使?this.transform.lossyScale獲取相對于世界坐標系的縮放值;
使?this.transform.localScale獲取相對于?對象的縮放值。
例子中,父對象的縮放值為2,2,2;當前對象(子對象)的縮放值為1,1,1。由于inspector面板顯示的是相對于父對象的縮放值,因此此時子對象相對世界坐標的縮放值也應該是2,2,2。
void Start(){print(this.transform.lossyScale);print(this.transform.localScale);}
結果是:?
(2)縮放的修改?
關于縮放的修改。對于相對于世界坐標系的縮放值只能獲取不能修改,而相對于父對象的可以修改,也只能同時修改x、y、z,不能單獨修改。
this.transform.localScale = new Vector3(3, 3, 3);
可以在UpDate函數中實現隨時間漸變縮放:
void Update(){this.transform.localScale += Vector3.one * Time.deltaTime;}
2、看向
看向是指定當前對象看向一個點或者一個對象,使用this.transform.LookAt(),里面傳入該點的位置信息。
(1)看向一個點
void Update(){this.transform.LookAt(Vector3.zero);}
結果:
(2)看向一個對象
需要在this.transform.LookAt()中傳入對應向量的transform信息。
public class Scale_cube : MonoBehaviour
{public GameObject lookAtObj;void Update(){this.transform.LookAt(lookAtObj.transform);}
}