在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);
}
}
…….