记录并解释unity中经常用到的API

1.Camera

1.pixelRect

pixelRect属性:摄像机渲染区间
此属性用于设置camera被渲染到屏幕中间的坐标位置。pixelRect属性与rect功能类似,不同的是pixelRect以实际像素大小来设置显示视口的位置,而rect以单位化方式设置显示视口的位置。
例设置camera.pixelRect (x0,y0,w,h), x0为视口右移的像素大小,y0为视口上移的像素大小,w为camera.pixelWidth,h的值为camera.pixelHeight.

2.Mathf

1.PingPong

public static float PingPong(float t,float length)
此方法用于模拟乒乓球的往复运动。设f = Mathf.PingPong (t, h),其中f 、t、h均为 float值类型。
(1)若h>0,则

  f=|t| % h,        当 |t| % 2h <= h时
  f=h - |t| % h,    当 |t| % 2h > h时

(1)若h<0,则

  f=2h + |t| % |2h|,        当| t | % |2h| <= h时
  f= - |t| % |2h|,    当| t | % |2h| > h时

要想让物体进行PingPong运动, t 必须是一个不断改变的值 ,常用Time.time 来当作 t 值。f 会从 0 开始变化到 h ,然后再从 h 变化到0.

3.Rigidbody

1.SweepTest

语法:

public bool SweepTest(Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal); 
参数 作用
direction 刚体扫过的方向
hitInfo 如果返回true,hitInfo将包含更多关于被击中位置碰撞体的信息
maxDistance 扫到的长度,默认为无穷大

2.WakeUp

语法:public void WakeUp( );
功能:此方法用于将刚体从休眠状态唤醒。要将刚体从休眠状态唤醒,除了调用此方法以外,在以下四种情况发生时,刚体会被自动唤醒:

  • 其他刚体与休眠中的刚体发生了碰撞
  • 使用关节连接的其他刚体发生了移动
  • 刚体的属性发生了改变
  • 给休眠中的刚体施加了一个外力

3.OnTriggerXXX和OnCollisionXXX

设现有A、B两个物体,且A物体正向B移动,B物体保持静止状态,如图所示:

undefined

详解:

  • 若A中无Rigidbody组件,则B中无论是否含有Rigidbody组件,A都将穿过B物体,并且A和B脚本中的OnTriggerXXX和OnCollisionXXX方法都不会调用。

  • 若A中含有Rigidbody组件,则B中无论是否含有Rigidbody组件,只要B中含有Collider类组件,A和B脚本中的OnTriggerXXX或OnCollisionXXX方法就会被调用。到底调用哪一种要看A和B物体中的Collider类组件中的IsTrigger是否被选中。总之,要激活OnTriggerXXX或OnCollisionXXX方法必须使移动的物体中含有Rigidbody组件

  • 若A中含有Rigidbody组件,B中含有Collider类组件,当A和B物体中的Collider类组件的IsTrigger都没有选中时,A和B脚本中(两个物体)的OnCollisionXXX类的方法就会被调用

  • 若A中含有Rigidbody组件,B中含有Collider类组件,当A和B物体中的Collider类组件的IsTrigger至少有一个被选中时,A和B脚本中(两个物体)的OnTriggerXXX静态方法会被调用

4.Transform

1.localPosition

public Vector3 localPosition { get; set; }

此属性用于设置或返回GameObject在局部坐标系中的位置,若无父级对象则和属性Transform.position返回值相同。

transform.localPosition的值受父级对象lossyScale的影响,当transform.localPosition的值增加1时,transform.position的值的增量不一定是1,而是在相对父级坐标系中增加了父级的lossyScale倍大小的值。例如物体cube2的父级是cube1,cube1的父级是cube0,cube1的localScale为Vector3(c1x,c1y,c1z),cube0的localScale为Vector3(c0x,c0y,c0z),假设cube0和cube1都没有发生旋转,则GameObject对象在世界坐标系中的位置为:
transform.position.x = cube0.localPosition.x+cube1.localPosition.xc0x+transform.localPosition.xc1xc0x;
transform.position.y和transform.position.z与此相同。
当物体cube2的局部坐标值localPosition增加Vector3(tx,ty,tz)时,其世界坐标值position的增加值分别为:
_x=tx
c1xc0x;
_y=ty
c1yc0y;
_z=tz
c1z*c0z;

5.Vector3

1.RotateTowards

基本语法:public static Vector3 RotateTowards( Vector3 current, Vector3 target, float maxRadiansDelta, float maxMagnitudeDelta);
其中参数current为起始点坐标,参数target为目标点坐标,参数maxRadiansDelta为角度旋转系数,参数maxMagnitudeDelta为模长系数。

功能说明:
此方法用于返回从参数current到target的球形旋转插值向量,此方法可控制插值向量的角度和模长。例如,设有Vector3实例A、B和C,有float类型数值R和L,向量A和B的夹角的弧度为e,则执行以下程序代码后
C=Vector3.RotateTowards(A,B,R,L);

  • 当R∈[0,e]时,向量C和A的弧度为R,即当R从0增加到e时,向量C与A的角度也会线性增加到e。向量C的模长为向量A的模长加上L的值,即|C|=|A|+L.
  • 当R<0时,向量C会沿着A到B的反向量旋转。
  • 当R>e时,参数R以e来计算角度,即R大于e时C与B的方向相同。
  • 总之,R值决定了向量C的方向,而L影响了C的模长,无论L取值多少,当R>e时向量C与B的方向总是相同的。
  • 向量A、B和C在同一平面上。

2.Slerp

基本语法:public static Vector3 Slerp(Vector3 from, Vector3 to, float t);
其中参数from为插值起始点坐标,参数to为插值结束点坐标,参数t为插值系数。
功能说明:此方法用于返回从参数from点到参数to点的球形插值向量。例如,设现有Vector3实例A和B,A ( ax,ay,az), B( bx,by,bz) A和B的夹角为e,则执行如下代码后
Vector C = Vector3.Slerp(from,to,t);

  • 当t<=0时,向量C=A;
  • 当t>=1时,向量C=B;
  • 当t从0增加到1时,向量C会从起始点A绕着AB(即向量A和B的叉乘)的方向匀速移动到向量B,此处的匀速时指角度旋转的匀速,即向量C与B的夹角k=e(1-t),这样便可以确定向量C的方向。而向量C的模长计算公式则为:

C=ax2+ay2+az2+(bx2+by2+bz2ax2+ay2az2)t|C| ={\sqrt{ax^2+ay^2+az^2}}+(\sqrt{bx^2+by^2+bz^2}-\sqrt{ax^2+ay^2-az^2})*t

  • 当向量A和B中的某个分量的值都为0时,比如它们的y轴分量都为0,即ay=by=0时,则A将绕着y轴在xy平面匀速旋转向B移动,并且在移动过程中C.y的值始终为0.