本次主要总结了unity中常用的Mathf类和Input类常用的方法和属性,还有协程方法的使用。
Mathf中的静态属性(static)
- Deg2Rad :(只读)将角度转换成弧度。
例:
private float degree = 60;
private void Start()
{
float radian = degree * Mathf.Deg2Rad;
print("radian:" + radian);
}
结果:
- Epsilon :非常小的数。(注意:比0大)
例:
private void Start()
{
print(Mathf.Epsilon);
}
结果:
- Infinity :无穷大的数。
- NegativeInfinity :无穷小的数。
负的无穷大,相当于无穷小。
- PI :数学中的π。
- Rad2Deg :将弧度转换成角度。
Mathf类中的静态方法
- float Abs(float f) :返回f的绝对值。
- float Acos(float f) :返回f(f是弧度)的反余弦值。
- bool Approximately(float a, float b) :比较a和b,如果相同则返回true,否则返回false。
- float Asin(float f) :返回f(f是弧度)的反正弦值。
- float Atan(float f) :返回f(f是弧度)的反正切值。
- float Atan2(float y, float x) :返回以Tan为y / x的弧度表示的角度。(注:x可以为0)
例:
private void Start()
{
Debug.Log(Mathf.Atan2(0.5f, 0));
}
- float Ceil(float f) :向上取整。对于正数,比如10.1,向上取整后为11。对于负数,比如-10.1,向上取整后为-10。
- int CeilToInt(float f) :与ceil作用相同,只是返回一个int值。
- float Clamp(float value, float min, float max) :将value限定在min和max之间,也就是当value小于min值时,返回min值。当value大于max值时,返回max值。其他情况返回value。
例:
private void Start()
{
Debug.Log(Mathf.Clamp(2,1,3)); //应该输出2
Debug.Log(Mathf.Clamp(0, 1, 3)); //应该输出1
Debug.Log(Mathf.Clamp(5, 1, 3)); //应该输出3
}
结果:
- float Clamp01(float value) :将value限定在0~1之间。
- float Cos(float f) :计算f的余弦值,f为弧度。
- float Sin(float f) :计算f的正弦值,f为弧度。
- float Tan(float f) :计算f的正切值,f为弧度。
- float Floor(float f) :向下取整。对于正数,比如10.1,向下取整后为10。对于负数,比如-10.1,向下取整后为-11。
- int FloorToInt(float f) :与Floor作用相同,只是返回int值。
- float Lerp(float from,float to,float t) :线性差值运算,就是在from与to之间根据t值比例乘以两者之间的差再加到from上,依次地逼近to的值,但是永远不可能达到to值(先快后慢)
例:
public class Test17 : MonoBehaviour {
public float minimum = -1.0F;
public float maximum = 1.0F;
static float t = 0.0f;
void Update()
{
transform.position = new Vector3(Mathf.Lerp(minimum, maximum, t), 0, 0);
t += 0.5f * Time.deltaTime;
if (t > 1.0f)
{
float temp = maximum;
maximum = minimum;
minimum = temp;
t = 0.0f;
}
}
}
此串代码的作用就是使当前游戏物体在X轴上的-1到1之间来回运动。
- float LerpAngle(float a, float b, float t) :和Lerp作用相同,只是变化的是角度,a,b都是角度值。
- float LerpUnclamped(float a, float b, float t) :在a和b之间以t线性插值,而对t没有限制。
不限制参数t,并且支持基于a和b的值。 如果t小于零或大于1,则LerpUnclamped将导致返回值超出a到b的范围。
例:
private void Start()
{
Debug.Log(Mathf.LerpUnclamped(0.5f, 3, -0.25f));
}
结果:
输出结果值小于了0.5
具体计算方法如下:
(3 - 0.5)* 0.25 = 0.625
因为t为负值
0.5 - 0.625 = -0.125
- float Max(float a, float b) :返回a,b中的最大值。
- float Max(params float[] values) :返回values数组中的最大值。
- float Min(float a, float b) :返回a,b中的最小值。
- float Min(params float[] values) :返回values数组中的最小值。
- float MoveTowards(float from, float to, float t) :从from运动到to,以t作为恒定速度(匀速运动)。
- float MoveTowardsAngle(float from, float to, float t) :与MoveTowards作用相同,只是变化的是角度,from与to为角度。
- float PingPong(float t, float length) :对值t进行乒乓操作(来回运动),物体会在0-length之间来回运动。
- float Pow(float f, float p) :返回f的p次方。
例:
private void Start()
{
Debug.Log(Mathf.Pow(2,3));
}
结果:
- float Repeat(float t, float length) :循环产生值t,但其永远不会小于0,大于length。相当于取模运算。
例:
private void Update()
{
Debug.Log(Mathf.Repeat(Time.time, 3));
}
当生成的值超过3时,会对3取模。
- float Round(float f) :返回f舍入到最接近的整数。(注意:不是四舍五入)如果数字以.5结尾,那么它位于两个整数之间的中间,其中一个是偶数,另一个是奇数,则返回偶数。
- int RoundToInt(float f) :与Round作用相同,返回int值。
- float Sign(float f) :如果f大于等于0,则返回1 。 如果f小于0,则返回-1.
- float Sqrt(float f) :对f开方。
在上面的代码编写中,我用了两种输出方式,Debug.Log 和 print,这两种写法在函数继承了MonoBehaviour时都是可以用的,但是如果没有继承MonoBehaviour,只能使用Debug.Log 方法进行输出。
input类中的静态属性 - bool anyKey :判断是否按下了鼠标或键盘。(注:不管按下什么都会触发,只读)
- bool anyKeyDown :当用户按下任何键或鼠标按钮的第一帧时返回true。 (只读)
- bool backButtonLeavesApp :是否应使用“后退”按钮退出应用程序? 仅在Android,Window Phone或Windows Tablets上可用。(默认为false)
- Vector3 mousePosition :以像素坐标表示当前鼠标位置,屏幕左下角为(0,0),右上角为(Screen.width,Screen.height)
- float GetAxis(string axisName) :string类型的虚拟按键,在控制上下左右时,返回的float值是递增到1和递减到-1的
虚拟按键是在unity中Edit -> project settings -> input 中可以自定义的。
例:
private void Update()
{
Debug.Log(Input.GetAxis("Vertical"));
}
Vertical代表按下w,s键或者是↑,↓ 键。
当我不按键时
当我按下w 或 ↑ 键时,从0递增到1
当我按下s 或 ↓ 键时,从0递减到-1
- float GetAxisRaw(string axisName) :string类型的虚拟按键,在控制上下左右时,返回的值是1和-1。和GetAxis区别为,返回的值是-1,0,1 三个,不会有其他的值。
- bool GetButton(string buttonName) :判断是否按下了虚拟按键,按下则一直触发。
- bool GetButtonDown(string buttonName) :判断是否按下了虚拟按键,按下触发一次。
- bool GetButtonUp(string buttonName) :判断是否按下了虚拟按键,抬起时触发一次。
- bool GetKey(string name) :当用户按住名称标识的键时,按下则一直触发。(不是虚拟按键,是输入管理器(在Edit -> project settings -> input中)中有特定标识符的按键)
例:
private void Update()
{
if (Input.GetKey("up"))
{
print("↑键被按下");
}
if (Input.GetKey("down"))
{
print("↓键被按下");
}
}
当按下↑键时:
当按下↓键时
- bool GetKeyDown(string name) :按下时触发一次。
- bool GetKeyUp(string name) :抬起时触发一次。
- bool GetMouseButton(int button) :鼠标按下时会一直触发。
button参数可以取三个值 0 ,1 ,2 。0代表左键,1代表右键,2代表鼠标中键
例:
void Update()
{
if (Input.GetMouseButton(0))
Debug.Log("左键被按下");
if (Input.GetMouseButton(1))
Debug.Log("右键被按下");
if (Input.GetMouseButton(2))
Debug.Log("中键被按下");
}
当我依次按下左右中键时
- bool GetMouseButtonDown(int button) :按下时触发一次。
- bool GetMouseButtonUp(int button) :抬起时触发一次。
官方定义 : 在主程序执行时,开辟一段逻辑处理。
.
本人理解 : 协程方法是一种特殊的方法,一般在写代码时程序中各个语句的执行顺序是从上至下的,在某些语句之间调用了其他方法的话,需要等其他方法运行完毕才会接着向下执行。而如果语句之间调用了协程方法则协程方法和下面的语句会同时运行。
协程方法的写法:
IEnumerator MethodName(参数)
{
···;
yield return null/0; //协程方法需要特殊的返回值
}
开启协程
StartCoroutine(MethodName(参数));
yield return new WaitForSeconds(float 秒数);
在协程方法中停顿特定的秒数
StopCoroutine 停止协程方法 (参数要和开始协程StartCoroutine的参数一样)
StopAllCoroutines 停止所有的协程方法
协程方法详细参考
协程的具体用法
本次主要总结了常用的Mathf类,Input类和协程方法,都是一些做游戏常用的API,需要多多练习并熟记。