十三.鼠标相关事件函数 OnMouseXXX
OnMouseDown : 按下
OnMouseEnter: 移到上面
OnMuseDrag:拖拽(按住)
OnMouseExit :移开
OnMouseUp : 抬起
OnMouseOver: 在上面(每帧检测)
ps:在物体A上按下鼠标,拖到物体B上抬起鼠标,此时执行的抬起指分是物体A的抬起指令
OnMouseUpAsButton:类似于检测鼠标“单击”,只有当按下和抬起在同-物体上时才会在鼠标抬起时触发
十四.Mathf类(相当于一个工具类,静态方法)
1. 常量:
Deg2Rad :角度转化为弧度
Rad2Deg :弧度转化为角度
Epsilon:超级小但比0大的小数(可以忽略不计)
PI :π
Infinity:无穷大,最大整数
NegativeInfinity:无限小
2. Clamp限定方法
Abs:取绝对值
Ceil:向上取整(如10.2=11) 返回float型
CeilToInt: 向上取整 返回int型
Clamp: 夹紧 (float value,float min,float max)
Value > max返回max, Value < min返回min (把一个值限定在范围内)
min< Value < max ,返回Value 即控制返回值在min和max之间
(例子:控制Cube在一个位置区间内运动 [动画] )
Cube.position=new Vector3(Mathf.clamp(Time.time,1.0F,3.0F),0,0);
((例子:控制玩家血量最大不超过100最小不超过0)
Private int hp=100;
Void TakeDamage( ){
hp-=9;
hp=Mathf.Clamp(hp,0,100);}
Clamp01 把一个值限定在0到1之间
3. Clamp常用方法
ClosestPowerOfTwo: 求2的x次方(2的Power次方), 然后取得离2的平方序列中最近的数
DeltaAngle :求两个角度之间的最短的差(最小夹角)
Floor :向下取整 (如5.4=5) 返回float型
FloorToInt :向下取整 返回int型
Lerp:差值运算
Max:取最大值
Min: 取最小值
Pow(float f,floatP) : 取得f的P次方
Sqrt(float f): 取f的平方根
4. 差值运算
Lerp(min, max, t) t是一个比例
当t<0时输出min , t> 1时输出max.
0<t<1时 输出min+(max-min)t
例子:运用在物体移动上(从一个位置移动到另一个规定位置)
Cube.position= new Vector3(0,0,0)
Void Update( ) {
float_x=cube.position.x;
float newX = Mathf.Lerp(x,10,0.lf)
//原始位置X,目标位置10,比例为0.1
Cube.position = new Vector3(newX,0,0);
//因为写在Update里,相当于每帧执行一次}
特点:变化先快后慢
但是lerp的返回值永远都不能到达目标值,只能无限接近于
5. LerpAngle 根据角度进行差值运算
6. MoveTowards(float current,floattarget,float maxDelta)
向某个方向移动 当前值 目标值 移动间距
与Lerp使用方法相似,但在(min,max,t)中,返回值是min+t
即MoveTowards为匀速移动,但也不会超过目标值
float newX=Mathf.MoveTowards(x,10,Time.deltaTime*speed)
Ps:如果t<0,物体就会远离目标值
7. PingPong方法实现乒乓球的来回运动效果
cube.position=new Vector3(Mathf.PingPong(Time.Time*speed,10),0,0);
PingPong (a,b) a是运动速度,b是目标值
规定初始值为0,在0到b之间往返匀速运动
十五. Input类
-
GetkeyDown / Getkey / GetkeyUp (类比OnMouseXX)
-
GetMouseButton 监测鼠标按键事件
Input.GetMouseButton(0)
左0,右1,中2
GetMouseButtonDown/ GetMouseButton/ GetMouseButtonUp -
GetButtonDown GetButton GetButtonUp 虚拟按健
打开InputManager组件来设置虚拟按键的名字,对应键等属性
(Edit→Project Settings→Input )
Input.GetButtonDown(“虚拟键nane”)
Negative Buten/Positive Button “轴的两端”
Alt Negative Button /Alt Positive Button 备用键 -
Alt Negative Button 按下由1渐变到0
Alt Positive Button 按下由0渐变到1
Input.GexAxis("") 实现加减速,控制运动 -
Input.GexAxisRaw 无渐变,返回值只有0,1,-1三个
所队没有加减速的过程而只有固定的速度 -
GetTouch ( easytouch 插件)
-
静态变量
onykey onykeydown 检测是否有任何键按下
mousePosition 获取到鼠标在屏幕上的像素位置
(三维坐标,以像素为单位,屏幕左下角为原点)
十六. Vector2 表示二维向量或二维坐标
-
静态变量 down(0,-1)
left(-1,0) one(1,1)
up(0,1) right(1,0)
zero(0,0) -
magnitud 取得向量的长度
normalized 对向量进行单位化,即让向量方向保持不变,长度变为1
获取值后改变值而不对向量本身产生影响
sqrMagnitude 取得向量还未开平方的值(x²+y²)
可以在比较几个向量长度时使用,达到优化性能的效果 -
构造方法:new Vector2(x,y)
-
Vector2是一个结构体而不是类(还有Vector3)
对象是引用类型,里边的成员可从直接修改。但结构体是值类型,只能进行整体修改。
如果想要修改一个坐标的x而使y和z不变,要先得到这个位置,然后再修改里边的X,最后把这个值整体赋值给position
thansform.position = new Vector3(3,3,3);
Vector3 pos=transform.position;
Pos.x=10;
Transform.position= pos;
//向量是结构体,是值类型,要整体赋值
-
公开方法
Eguals 判断两个向量是否相等 (当x=x,y=y时返回ture)
Normalize 将向量单位化,对向量本身产生影响 (无返回值)
对自身进行操作,方向不变
Set 对x,y进行赋值
ToString 转变成字符串,进行格式化输出 -
静态方法
Angle 取得两个向量之间的夹角
ClampMagnitude(Vector2,float) 把一个向量的长度限定在float内
Distance 取得一个向量的长度
Lerp(Vector2a,Vector2b,float t)
对向量ab的x、y轴分别进行差值运算 (a.X,b.x) (a.y,b.y)
(当t>1时输出b)
LerpUnclamped(Vector2a,Vector2b,floatt)
在不限定范围的情况下按比例做差值运算
Max(Vector2a,Vector2b) 取长度最大的向量值
Min(Vector2a,Vector2b) 取长度最小的向量值
MoveTowards(当前值,目标值,移动速度) 匀速向目标移动
十七. Vector3 (与Vector2相似)
-
静态变量
(Vector2有的都有)
back(0,0,-1)和forward(0,0,1) -
Crass 差乘运算:向量a与向量b进行差乘,得到方向与向量a.b所形成平面垂直的新向量Result
左手法则 (大拇指为a,食指为b,中指为Result)
Cross(Vector3 a,Vector3 b) ab和ba结果不同 -
Project(Vector3 vector,Vector3onNormal)
返回值=vector在onNormal方向上得到的一个投影
Reflect(Vector3 inDirection,Vector3 inNormal); 返射
出射方向 、 入射方向 、 法线
Slerp 按夹角进行差值运算 (由方向a指向方向b) 用于做转向
位置差值用lerp,方向差值用Slerp -
对向量的加减乘除操作
十八. 使用Random生成随机数
Random.Range(a,b) 静态方法 随机生成a到b之间的数字(整数)
生成的整数范围不包含最大值,但包含最小值
生成随机小数:Random.Range(af.bf)
InitState(int seed) “种子”控制算法随机数(伪)序列
如果“种子”相同,则产生的随机数序列顺序也相同
如何让“种子“不断变化从而产生不同序列的随机数?
Random.InitState((int)System.DateTime.Now.Ticks);
把时间作为“种子”
或者可以干脆不写InitState,系统会在每次运行时重新初始化,保证每次生成的随机数序列的顺序都不同
Random.value 随机生成一个0到1之间的小数
例,得到一个随机颜色:
Return new Color(Random.value,Random.value,Random.vualue);
Random.InitState 获取该“种子”的随机数序列的当前状态,以便在当前位置继续获取序列里的随机数
rotation 得到一个随机朝向
insideUhitCircle 在某个位置周围方圆一米的范围内随机生成一个位置
(返回二维向量)
insideUnitSphere (同上)在球体内随机生成三维坐标
十九. 四元数Quaternion 结构体
Rotation中的x和z轴都是围绕自身的轴进行旋转,但y轴是:当y轴与世界坐标的y轴平行时,围绕y轴自身旋转;当y轴不与世界坐标的y轴平行时,围绕世界坐标的y轴旋转
eulerAngles = new Vector3(x,y,z) 欧拉角
Rotation是四元数
把欧拉角转换为四元数:
Cube.rotation=Quaternion.Euler(new Vector3(x,y,z));
//x,y,z为角度
把四元数转化为欧拉角: cube.rotation.eulerAngles
二十. Quaternion中的LookRotation方法
控制玩家看向敌人的方向
例子:
Public Transform cube;
Public Transform player;
Public Transform enemy;
Void Update( )
{
if (Input.GetKeyDown(KeyCode.Space))
{
Vector3 dir = enemy.position - player.position;
dir.y = 0;
//控制enemy和player在同一平面(忽略二者之间在y方向上的差值)
//使player在看向enemy时只发生平面转动而不必“弯腰”
Player.rotation=Quaternion.LookRotation(dir);}
}
二十一. Quaternion中的Lerp和Slerp差值运算
上个例子:
Void Update( )
{
Vector3 dir = enemy.position - player.position;
dir.y = 0;
Quaternion target= Quaternion.LookRotation(dir);
Player.rotation=Quaternion.Slerp(player.rotation,target,
Time.deltaTime);}
}
二十二. Rigidbody ( 继承自Component)
-
.CenterOfMass 取得重心
.freezeRotation 冻结旋转
可以通过钢体组件修改物体的position和rotation,并且比通过Transform修改更快、性能更好 -
Rgidbody.MovePosition(Vector3 position) 目标位置
让钢体从现有位置移动到目标位置更加平滑
从一个位置移动到另一个位置:直接使用Rigidbody.position设置属性
持续移动:使用Rigidbody.MovePosition,更加平滑 -
旋转Rigidbody.rotation
持续旋转: Rigidbody.MoveRotation -
Rigidbody. AddForce(Vector3.forward*force)
给物体施加一个力(如推)
方向×力