Unity基礎-Mathf相關
一、Mathf數學工具
概述
Mathf是Unity中封裝好用于數學計算的工具結構體,提供了豐富的數學計算方法,特別適用于游戲開發場景。它是Unity開發中最常用的數學工具之一,能夠幫助我們處理各種數學計算和插值運算。
Mathf與Math的區別
- Math是C#中封裝好用于數學計算的工具類——位于System命名空間下
- Mathf是Unity中封裝好用于數學計算的工具結構體
- 二者相關方法幾乎一樣
- Math是C#自帶的工具類,主要提供有關數學的方法
- Mathf是Unity專門封裝的,包含Math的相關方法,還有適用游戲開發的相關方法
Mathf常用方法
1. 計算一次的方法
// 1. 圓周率PI
print(Mathf.PI); // 輸出3.141593// 2. 絕對值Abs
print(Mathf.Abs(-10)); // 輸出10// 3. 向上取整CeilToInt
print(Mathf.CeilToInt(1.1f)); // 輸出2// 4. 向下取整FloorToInt
print(Mathf.FloorToInt(1.9f)); // 輸出1// 5. 鉗制函數Clamp
print(Mathf.Clamp(10, 0, 5)); // 輸出5
print(Mathf.Clamp(20, 0, 25)); // 輸出25
print(Mathf.Clamp(-1, 0, 25)); // 輸出0// 6. 最大值Max
print(Mathf.Max(1, 2)); // 輸出2// 7. 最小值Min
print(Mathf.Min(1, 2)); // 輸出1// 8. 冪運算Pow
print(Mathf.Pow(2, 3)); // 輸出8// 9. 四舍五入RoundToInt
print(Mathf.RoundToInt(1.5f)); // 輸出2// 10. 平方根Sqrt
print(Mathf.Sqrt(4)); // 輸出2// 11. 是否為2的冪IsPowerOfTwo
print(Mathf.IsPowerOfTwo(4)); // 輸出true// 12. 判斷正負Sign
print(Mathf.Sign(1)); // 輸出1
總結:這些基礎數學方法在游戲開發中經常使用,特別是在處理數值計算、位置計算和游戲邏輯時。它們提供了精確的數學運算,幫助我們實現各種游戲功能。
2. 計算多次的方法
線性插值Lerp
線性插值是游戲開發中最常用的數學工具之一,它能夠實現平滑的過渡效果,使游戲畫面更加自然流暢。
// 用于兩個值之間的差值過渡Mathf.Lerp(初始值,目標值,插值系數)
// 差值系數取值范圍[0,1]
// 計算公式:result = start + (end - start) * t
print(Mathf.Lerp(1, 10, 0.5f)); // 輸出5.5// 差值運算用法一
// 每幀更新start的值 變化速度先快后慢,位置無限接近end,但是不會得到end
start = Mathf.Lerp(start, end, Time.deltaTime);// 差值運算用法二
// 每幀更新time的值,變化速度勻速,位置每幀接近,當time=1時,result=end
float time = 0;
time += Time.deltaTime;
result = Mathf.Lerp(start, end, time);
擴展知識:
- Lerp不僅可以用于位置插值,還可以用于:
- 顏色漸變
- 旋轉角度
- 縮放大小
- 透明度變化
- 除了線性插值,Unity還提供了其他插值方法:
- Vector3.Lerp:向量插值
- Quaternion.Lerp:四元數插值
- Color.Lerp:顏色插值
Lerp實際應用示例
下面通過一個具體的示例來展示Lerp在游戲開發中的實際應用,這個示例展示了兩種不同的移動實現方式。
public class MathfTest : MonoBehaviour
{public Transform cube;private Vector3 start;private float speed=1;private float time=0;private Vector3 startPos;private Vector3 bPos;// Start is called before the first frame updatevoid Start(){start=this.transform.position;}// Update is called once per framevoid Update(){// Move1();// Move2();}private void Move1(){//方法1 先快后慢start.x=Mathf.Lerp(start.x,cube.position.x,speed*Time.deltaTime);start.y=Mathf.Lerp(start.y,cube.position.y,speed*Time.deltaTime);start.z=Mathf.Lerp(start.z,cube.position.z,speed*Time.deltaTime);this.transform.position=start;//使用Vector3.Lerp方法// transform.position=Vector3.Lerp(transform.position,cube.position,speed*Time.deltaTime);}private void Move2(){//方法2 勻速time+=Time.deltaTime;if(bPos!=cube.position){time=0;bPos=cube.position;startPos=transform.position;}start.x=Mathf.Lerp(startPos.x,bPos.x,time);start.y=Mathf.Lerp(startPos.y,bPos.y,time);start.z=Mathf.Lerp(startPos.z,bPos.z,time);transform.position=start;}
}
兩種移動方式的區別:
-
方法1(先快后慢):
- 使用Time.deltaTime作為插值系數
- 移動速度隨著距離目標越近而越慢
- 永遠不會完全到達目標位置
- 適合相機跟隨等場景
-
方法2(勻速移動):
- 使用time變量作為插值系數
- 移動速度保持恒定
- 可以完全到達目標位置
- 適合需要精確控制的場景
使用建議:
- 選擇移動方式時需要考慮:
- 是否需要精確控制移動時間
- 是否需要完全到達目標位置
- 移動效果的自然程度要求
- 可以結合兩種方法的特點:
- 使用方法1實現平滑的相機跟隨
- 使用方法2實現精確的物體移動
應用場景
Mathf在游戲開發中的應用非常廣泛,主要包括:
-
游戲對象移動和旋轉
- 角色移動
- 相機跟隨
- 物體旋轉
-
平滑動畫過渡
- UI動畫
- 場景切換
- 特效漸變
-
物理計算和碰撞檢測
- 碰撞檢測
- 物理模擬
- 力的計算
-
游戲邏輯中的數學運算
- 傷害計算
- 屬性計算
- 隨機數生成
擴展應用:
-
游戲AI
- 尋路算法
- 行為決策
- 狀態轉換
-
特效系統
- 粒子效果
- 光照變化
- 材質過渡
-
UI系統
- 界面動畫
- 進度條
- 數值顯示