【Unity3D】 Mathy(常用數學運算,C#)
阿新 • • 發佈:2019-02-13
在unity遊戲開發中,我們常常需要用到一些數學運算,比如攝像機的移動,人物移動,怪物ai的巡邏,技能特效的角度等等,下面是整理出一些常用(也可以說是比較簡單的)的數學運算公式。
Mathf.Lerp 插值 Mathf.Abs 絕對值 Mathf.Max 最大值 Mathf.Min 最小值 Mathf.Clamp 限制 Mathf.Clamp01 限制0~1 Mathf.MoveTowards 移向 Mathf.PI 圓周率 Mathf.Round 四捨五入 Mathf.RoundToInt 四捨五入到整數 Mathf.Sign 符號(-1or1) Mathf.Sqrt 平方根 Mathf.Tan正切 / Mathf.Sin正弦 / Mathf.Cos餘弦
再來整理一些用法吧。
Mathf.Lerp插值
static float Lerp(float a, float b, float t);
插值是根據Lerp(a,b,t)中的第三個引數t來返回a和b之間的值,如果t是變化的,比如Time.time,則在一秒之內從a變化到b.
下面是一個攝像機跟隨人物(character)的方法,注意避免抖動跟隨函式放在FixedUpdate()裡面。
void FixedUpdate()
{
//character.position為人物座標,Man_smooth為設定的平滑度
transform.position = Vector3.Lerp(transform.position, character.position, Time.deltaTime * Man_smooth);
}
Mathf.Sign 符號
static float Sign(float f);
返回 f 的數字符號。
當 f 為正或為0返回1,為負返回-1。
//獲得方向盤橫軸(A/D,left/right)
float h = Input.GetAxis("Horizontal");
if (h != 0)
{
//物體按時間增量(Time.deltaTime)*速度(speed)*
//方向(Mathf.Sign(h))在X軸移動
//按下A鍵,則h<0,Mathf.Sign(h)返回-1,則物體方向向左,反之向右。
transform.position +=
new Vector3(Time.deltaTime * speed * Mathf.Sign(h), 0, 0);
}
Mathf.Min 最小值
static float Min(float a, float b);
返回兩個或更多值中最小的值。
下面是一個增加生命值的方法。
float Health=10; //當前生命值
float MaxHealth=100; //最大生命值
public void GiveHealth(int health, GameObject instigator)
{
// 增加生命值,但最多不超過最大生命值
//“Mathf.Min()返回兩個或多個值中的最小值。”
Health = Mathf.Min(Health + health, MaxHealth);
}
Mathf.Abs 絕對值
static float Abs(float f);
返回f的絕對值。
下面是一個怪物攻擊附近人物的方法(並不嚴謹)
float Distance=5;
void Attack()
{
//當“我”與目標的X軸絕對值小於Distance(距離時)
if (Mathf.Abs(transform.position.x - character.position.x) < Distance)
{
//敵羞我去脫它衣(攻擊)
}
}
Mathf.Clamp 限制
static float Clamp(float value, float min, float max);
限制value的值在min和max之間, 如果value小於min,返回min。 如果value大於max,返回max,否則返回value
下面是一個我在2D人物骨骼動畫需要用到的方法,人物頭部隨著滑鼠在一定角度限制內擡頭和低頭(比如頭部不能向後翻到後背上-。-!)
float min = 60f; //最小擡頭角度
float max = 120f; //最大擡頭角度
float rotationZ = 90f; //因為這裡是2d人物,頭部旋轉Z軸
void Update()
{
//當檢測到按住滑鼠左鍵時執行
if(Input.GetMouseButton(0))
{
//需要旋轉的角度的值來自於當我們上下移動滑鼠(也就是滑鼠在螢幕座標系Y上的移動情況)再乘上10f個單位。
rotationZ += Input.GetAxis("Mouse Y") * 10f;
//數學限制值方法,第一個引數是需要限制的值,第二個是最小值,第三個是最大值
rotationZ = Mathf.Clamp(rotationY,min,max);
//利用自身尤拉角,來控制頭部的旋轉角度。
transform.localEulerAngles = new Vector3(0,0,rotationZ);
}
}
…….