1、Vector3.magnitude 长度

返回向量的长度(只读)。

向量的长度是

如果你需要比较一些向量的长度,你可以比较它们长度的平方,使用sqrMagnitude(计算平方很快)。

所以:比较向量的长度时,用下面的sqrMagnitude方法最好!

当在update中检测人物位置距离目标位置时用sqrMagnitude也最好不过了!

类似这样:if ((perpos – targetPosition).sqrMagnitude < 1.0f){ }

2、Vector3.sqrMagnitude 长度平方

返回这个向量的长度的平方(只读)。

向量的长度是用勾股定理计算出来,计算机计算两次方和开根的运算量比加减法要费时的多。所以如果是想比较两个向量的长度,用sqrMagnitude可以快出很多。

3、Vector3.Normalize()/ Vector3.normalized 归一化

相同点:使向量的长度为1,当归一化的,一个向量保持相同的方向,但它的长度为1.0。如果这个向量太小而不能被归一化,一个零向量将会被返回。

不同点:Vector3.Normalize()这个方法将改变当前向量Vector3,即Vector3将变为归一化向量,而normalized是Vector3的一个字段,是用来获取此Vector3的归一化向量的,并不会改变Vector3的值的!

4、Mathf.Clamp 钳制

static float Clamp(float value, float min, float max)

限制value的值在min和max之间, 如果value小于min,返回min。 如果value大于max,返回max,否则返回value

5、Enabled   

gameObject.renderer.enabled:是控制一个物体是否在屏幕上渲染或显示  而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的  

6、Destroy

表示移除物体或物体上的组件 代表销毁该物体  实际上该物体的内存并没有立即释放 而是在你下下个场景中槽释放内存资源,就是你a场景中Destroy了 一般是在c场景中才真正释放该物体的内存资源

7、Active     

是否在场景中停用该物体   在你gameObject.active =false中 则你在场景中用find找不到该物体    

如果该物体有子物体 你要用SetActiveRecursively(false) 来控制是否在场景中停用该物体(递归的),SetActiveRecursively方法可以递归实现父类与子类的状态统一,但是因为子类无法记得自己原来的状态,所以被标记已过时,只能使用SetActive,但是实验得出SetActive无法递归到子物体,因为unity不想破坏子类原有的状态,那么要想实现子类与父类状态统一,那么解决方案如下:

    void DeactivateChildren(GameObject g, bool a) //g为父类对象,递归子类实现状态统一
    {
        g.SetActive(a);
        foreach (Transform child in g.transform)
        {
            DeactivateChildren(child.gameObject, a);
        }
    }

使用activeSelf只读属性来判断对象自身的激活状态,而不会考虑他的父类是什么状态
使用activeInHierarchy只读属性来判断自身的激活状态,但是会考虑父类的激活状态的:
只要父类和子类有一个状态为false,那么此子类的activeinHierarchy就为false,
而父类的状态activeInHierarchy是和activeSelf一样的

如果父类active被设为false,那么就无法找到子类,
如果父类active被设为true,那么子类中active为false的将找不到

8、Input.GetAxis(“Horizontal”) 

Input.GetAxis(“Horizontal”) 表示水平方向,即键盘左右键,
当你一直按着键盘的左键,那么获得的返回值会从0一直减少到-1(不会小于-1),如果松掉键盘左键,那么值就会从-1慢慢回升到0,(总区间为-1~0)
当你一直按着键盘的右键,那么获得的返回值会从0一直增长到1(不会大于1),如果松掉键盘右键,那么值就会从1慢慢减少到0,(总区间为0~1)

Input.GetAxis(“Vertical”)则为垂直方向,值区间:左键(-1~0)  右键(0~1)

这个函数的参数是unity中的“轴”的概念,轴可以再edit— projrct setting—input中设置,unity最多可以设置17个轴。事实上,每个轴对应于键盘或者鼠标的某种动作。

9、Transform.TransformPoint 变换点

C# ⇒ Vector3 TransformPoint(Vector3 position) 传入的参数即为“位置点

简单来说就是以当前物体为世界坐标原点,以当前物体的方向为世界坐标的方向来看的。

比如:

var someObject : GameObject;
thePosition = transform.TransformPoint(Vector3.right * 2);
Instantiate(someObject, thePosition, someObject.transform.rotation);

这个自带的例子,是在当前物体自身坐标轴的x的轴向上上2个单位的地方实例化。

而不是在世界坐标轴的(2, 0, 0)的位置实例化

10、Transform.TransformDirection 变换方向

C# ⇒ Vector3 TransformDirection(Vector3 direction);可以看出传的参数是表示”方向“的三维坐标

其作用就是找出当前对象的某个方向在世界坐标中的方向(因为对象有可能由于旋转而造成对象的本地方向和世界坐标方向不一致)

假如对象的Rotation为(0,0,0),那么此时对象的Transform.forward就等于世界坐标的方向Verctor.forward

如果对象绕x轴旋转了90°,那么此时对象的z轴方向向下,z轴为对象向前方向,如果想获得对象向前方向可以使用transform.forward和transform.TransformDirection(Vector3.forward),两者效果是一样的!

11、Transform.Rotation旋转

重载1:void Rotation(Vector3 eulerAngles,Space relativeTo)
Space:为坐标空间,枚举类型:
           Word:应用变换相对于世界坐标
           Self:应用变换相对于局部坐标系统,也叫本地坐标,自身坐标。
解释:应用一个欧拉角的旋转角度,eulerAngles.z度围绕z轴,eulerAngles.x度围绕x轴,eulerAngles.y度围绕y轴(这样的顺序)。
        如果相对于留空或者设置为Space.Self 旋转角度被应用围绕变换的自身轴。(当在场景视图选择物体时,x、y和z轴显示)
        如果相对于 Space.World 旋转角度被应用围绕世界的x、y、z轴。 
例子:
function Update() {
          //沿着x轴每秒1度慢慢的旋转物体
          transform.Rotate(Vector3.right * Time.deltaTime);
         //相对于世界坐标沿着y轴每秒1度慢慢的旋转物体
          transform.Rotate(Vector3.up * Time.deltaTime, Space.World);
}
重载2: void  Rotate (Vector3 axis , float  angle ,  Space  relativeTo) :
按照angle度围绕axis轴旋转变换,这个方法就不多说了!
 
重载3: void  Rotate (float xAngle , float  yAngle ,  float zAngle , Space  relativeTo )
应用一个旋转角度,zAngle度围绕z轴,xAngle度围绕x轴,yAngle度围绕y轴(这样的顺序)。
function Update() {
           //围绕x轴每秒1度,慢慢的旋转物体
           transform.Rotate(Time.deltaTime, 0, 0);
         //围绕x轴每秒10度
         transform.Rotate(Time.deltaTime*10, 0, 0);
         //相对于世界坐标,围绕y轴每秒1度,慢慢的旋转物体
        transform.Rotate(0, Time.deltaTime, 0, Space.World);
 }

 另外:Vector3.right表示物体绕x轴旋转    Vector3.left 表示相对的逆时针旋转

          Vector3.Up表示物体绕y轴旋转      Vector3.down表示相对的逆时针旋转

          Vector3.forward 表示物体绕z轴旋转 Vector3.back表示相对的逆时针旋转

至于为什么乘以了Time.deltaTime之后物体就是以秒为单位去旋转,原因如下:
执行下面的脚本:
 void Update()
    {
        transform.Rotate(Vector3.right * Time.deltaTime);
        print(“rotationx=” + transform.localEulerAngles.x);
        print("time=" + Time.timeSinceLevelLoad);
   }

输出结果为:图左

由输出结果可见,物体真的是每一秒旋转1度,因为Vector3.right为(1,0,0)所以表示绕x轴旋转1度,如果Vector3.right * Time.deltaTime*10,
那么就表示每秒旋转10度了! 然后我们再执行下面的脚本,即不带Time.deltaTime
 void Update()
    {
        transform.Rotate(Vector3.right);
        print("rotationx=" + transform.localEulerAngles.x);
        print("time=" + Time.timeSinceLevelLoad);
   } 

输出结果如图:图右

由输出结果可知,物体旋转是基于每一帧旋转1度的,所以由此便知Time.deltaTime的作用了!
   
12、Physics.Raycast 光线投射 
重载1: bool Raycast (Vector3 origin, Vector3 direction, float distance = Mathf.Infinity, int layerMask = kDefaultRaycastLayers) :
返回值:返回布尔(bool)值,当光线和任何碰撞器相交时,返回true,否则为false。也就是说,当光线碰触到任何碰撞器时返回真,否则返回假。
备注: origin 世界坐标
          Mathf.Infinity 表示正无穷
          layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。
 
重载2: bool Raycast (Ray ray , out RaycastHit hitInfo,float distance = Mathf.Infinity, int layerMask = kDefaultRaycastLayers) :
备注:用ray表示射线的起点和方向
void Update() {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 100))
            Debug.DrawLine(ray.origin, hit.point);       
    }
Collider.Raycast 光线投射
与physics.Raycast的区别:投射一个光线(Ray),它忽略所有碰撞器,除了当前这个Collider。
 
 

版权声明:本文为MrZivChu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/MrZivChu/p/normalclass.html