其他随机生成方法介绍
Random.value:生成>=0,<=1的随机小数
Random.insideUnitCircle:
在半径n的圆内随机生成一些数(一般把这个方法×n)
用于随机产生敌人,让敌人的位置不重合
其他随机生成方法介绍
Random.value:生成>=0,<=1的随机小数
Random.insideUnitCircle:
在半径n的圆内随机生成一些数(一般把这个方法×n)
用于随机产生敌人,让敌人的位置不重合
使用Random生成随机数
public class RandomCS : MonoBehaviour {
// Use this for initialization
void Start()
{
//生成伪随机数,就是他按照一定算法生成一次随机数,以后在运行,生成的还是这些随机数
//0相当于一个种子,种子不变,就一直这些固定的随机数
Random.InitState(0);
//按照现实时间来赋值随机数,因为现实的时间一直是往前走的,所以每次运行生成的随机数都不一样
Random.InitState((int)System.DateTime.Now.Ticks);
}
// Update is called once per frame
void Update () {
print(Random.Range(4, 10));//输出>=4,<10随机数
print(Random.Range(4, 5f));//加上f之后生成小数的随机数
}
}
Vector2 a = new Vector2(2, 2);
Vector2 b = new Vector2(3, 4);
Vector2 c = new Vector2(3, 0);
Vector2 res = b - a;//(1,2)
print(res);//(1,2)
print(res * 10);//(10,20)
print(res / 5);//(0.2,0.4)
print(a == b);//False
关于三维向量Vector3:表示向量或坐标
Project:取得一个向量,再另外一个向量上的投影,向量的方向不会影响投影的方向
Reflect:用来做反射
Slerp(a,b,t):
对于位置的插值用Lerp,对于方向的插值用Slerp
基本用法
public class V2CS : MonoBehaviour {
void Start () {
Vector2 a = new Vector2(2, 2);
Vector2 b = new Vector2(3, 4);
Vector2 c = new Vector2(3, 0);
//求a,b之间的夹角,既
print(Vector2.Angle(a, b));
print(Vector2.Angle(a, c));//为45°
//保持方向不变,把向量c的长度限定在2
print(Vector2.ClampMagnitude(c, 2));//(2,0)
//b,c之间的距离
print(Vector2.Distance(b, c));//4
//从a到b进行插值,既((2+3)/2,(2+4)/2)
print(Vector2.Lerp(a, b, 0.5f));//(2.5,3)
print(Vector2.LerpUnclamped(a, b, 0.5f));//(2.5,3)
//Lerp(a,b,t)t默认0<=t<=1,当t小于等于0,返回a,t大于等于1,返回b
print(Vector2.Lerp(a, b, 2f));//因为2f大于1,所以返回b(3,4)
//没有限制,所以在a,b距离的基础上再增加一个等价距离
print(Vector2.LerpUnclamped(a, b, 2f));//(4,6)
print(Vector2.Max(a, b));//(3,4)
print(Vector2.Min(a, b));//(2,2)
}
}
MoveTowards:做匀速运动
public class V2CS : MonoBehaviour {
public Vector2 a = new Vector2(2, 2);
public Vector2 b = new Vector2(10, 3);
void Update () {
a = Vector2.MoveTowards(a, b, Time.deltaTime);//a向b以一秒一米的速度靠近
}
}
二维向量Vector2中的静态方法
Normalize:将向量单位化,没有返回值,
向量是结构体
Vector2和Vector3都是结构体,与类在使用上有区别
结构体是把一堆变量进行封装
结构体是一个值类型,对他修改时,只能把他当作一个整体进行修改,不能单独写出来
eg:position为一个结构体,要想修改他的x坐标为10
transform.position = new Vector3(1, 1, 1);
//transform.position.x = 10;//这个方法错误
Vector3 pos = transform.position;
pos.x = 10;
transform.position = pos;
对象是引用类型。
Vector2中的变量有哪些
Vector2:可以表示二位向量和坐标
public class V2CS : MonoBehaviour {
void Start () {
print(Vector2.down);//(0.0,-1.0)
print(Vector2.up);//(0.0,1.0)
print(Vector2.left);//(-1.0,0.0)
print(Vector2.right);//(1.0,0.0)
print(Vector2.one);//(1.0,1.0)
print(Vector2.zero);//(0.0,0.0)
Vector2 a = new Vector2(2, 2);
Vector2 b = new Vector2(3, 4);
print(a.magnitude);//根号下2的平方加2的平方=2*1.4
print(a.sqrMagnitude);//2的平方加2的平方=8
print(b.magnitude);
print(b.sqrMagnitude);
print(a.normalized);//对a向量没有影响,返回a向量单位化的向量
print(b.normalized);
print(a.x + "," + a.y);//访问a的x坐标和a的y坐标
print(a[0] + "," + a[1]);//访问a的x坐标和a的y坐标
}
}
屏幕坐标系和鼠标的坐标
easytouch插件:触摸事件的插件
anyKey:不需要传递参数,是一个静态的变量,按下任何按键都一直返回True
anyKeyDown:按下任何按键都返回True
mousePosition:使用摄像机里的屏幕坐标检测鼠标是否点击到一个物体
使用GetAxis得到轴的值的变化来控制移动
GetAxis():是渐变的,模拟加速运动的效果
GetAxis():直接运动,没有缓冲
public class InputCS : MonoBehaviour {
public Transform cube;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//按下a,d,←,→键开始加速移动,到了指定速度后按那个速度移动,松开后减速停下
cube.Translate(Vector3.right * Time.deltaTime * Input.GetAxis("Horizontal"));
//一按就会运动,没有缓冲
cube.Translate(Vector3.right * Time.deltaTime * Input.GetAxisRaw("Horizontal"));
}
}
PingPong;最小值是0,最大值自己设,超过最大值后开始朝最小值移动,到最小值后又朝最大值移动,循环往复
GetButtonXXX相关事件监测
GetButtonXXX为虚拟按键,
如何找到:Edit——Project Settings——Input
Input.GetMouseButton():0是左键,1是右键,2是中键,在按下的过程会一直触发
Input.GetMouseButtonDown():按下之后执行一次
MoveTowards
使用PingPong方法实现乒乓的来回运动效果
PingPong :默认最小值为0,不能设置最小值,只能设置长度length
public class MathfCS : MonoBehaviour {
public Transform cube;
void Update(){
//实现物体在0-10之间来回运动,Time.time是逐渐增大的,当他在0-10,往一个方向运动,当他在11-20,反向运动.....如此循环
cube.position = new Vector3(Mathf.PingPong(Time.time,10), 0, 0);
}
}
//实现物体在5-10之间来回运动
cube.position = new Vector3(5+Mathf.PingPong(Time.time,10), 0, 0);
使用MoveTowards做匀速运动
public class MathfCS : MonoBehaviour {
public Transform cube;
// Use this for initialization
void Start () {
cube.position = new Vector3(0, 0, 0);
}
void Update()
{
float x = cube.position.x;
float newX = Mathf.MoveTowards(x, 10, Time.deltaTime);//从x到10匀速运动,会保证值不超过最大值10
cube.position = new Vector3(newX, 0, 0);
}
}
Lerp:三个参数a(起始值),b(结束值),t(a和b之间的比例,最大为1,直接返回b,最小为0,直接返回a)
关于游戏开发中的插值运算
Lerp(a,b,t):在a到b之间插入一个值,t用来控制插在哪个位置t的范围为0<=t<=1,当t<=0时,输出a,t>=1时,输出b
用来做动画效果,
特点为:先快后慢
public class MathfCS : MonoBehaviour {
public Transform cube;
// Use this for initialization
void Start () {
cube.position = new Vector3(0, 0, 0);
}
void Update()
{
float x = cube.position.x;
//只要开始运行,cube的初始位置就变为(1,0,0),然后按区间长度每次运动区间长度的1/10,由于区间长度越来越短,所以运动越来越慢
float newX = Mathf.Lerp(x, 10, 0.1f);//0.1f可以换成Time.deltaTime*speed
cube.position = new Vector3(newX, 0, 0);
}
}
LerpAngle:
Mathf中的常用方法
ClosePowerOfTwo():取得离2的次方最近的数
Ceil:取大的数,向上取整
Floor:取小的数,向下取整
Lerp:
LerpAngle:
Pow(f,p):取得f的p次方
Sqrt:取得参数的平方根