1. 程式人生 > >【Unity3D】 Mathy(常用數學運算,C#)

【Unity3D】 Mathy(常用數學運算,C#)

在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);

    }

}

…….