使不可见Object身上的脚本不再执行
void OnBecameVisible(){
enabled = true;
}
void OnBecameInvisible(){
enabled =false;
}
点乘积Dot 返回值为数值
使用点乘积的一个作用就是通过计算两个向量的点乘积。可以粗劣的判断当前物体是否朝向另一个物体,只需计算当前物体的transform.forward 向量与target.transform.position-transform.position的点乘积即可。大于0则朝向另一物体,否则是背对着。
<pre>
float temp = Dot(transform.forward*(target.transform.position-transform.posoition));
</pre>
交叉乘积 Cross
与点成绩不同,交叉乘积的计算结果仍为向量。叉积定义c= a*b。其中a、b、c均为向量。
Color32
使用32位来表示RGBA颜色,由于使用32位的表示方式,因此r,g,b,a这4个值的范围在0~255之间的byte。注意与Color的区分。
装箱与拆箱
void Start(){
ArrayList al = new ArrayList();
//在线程栈上为v分配空间,而非在托管堆上分配
Vector3 v;
for(int i =0;i<5;i++){
//初始化值类型成员
v.x=1;
v.y=2;
v.z=3;
//对值类型装箱,并将引用添加到ArrayList中
al.Add(v);
}
}
如果查看ArrayList类的Add方法,可以看出Add方法是一个object类型的,也就是Add方法的参数是引用类型的变量,即
public virtual int Add(
Object value;
)
而v显然是值类型的变量,那么基于对引用类型(堆)值类型(栈)的认识,Add方法的参数value就必须是一个引用,而v不是引用,它的的值就是Vector3结构的一个值,所以为了使代码正常运行,Vector3值类型的实例在这里必须转换成真正的托管堆上分配的对象。
值类型装箱的步骤
1)在托管堆中分配内存。需要注意的,由于是将值类型进行引用类型化,因而分配的内存空间除了值类型各个字段所需要的内存之外,还要加上托管堆所有对象都有的两个额外成员(类型对象指针和同步索引模块)所需的内存。
2)将值类型的字段复制到新分配的堆内存中。
3)返回对象地址,即对象的引用。值类型就成了引用类型。
通过分析这三个步骤可以发现,Mono运行只是将值类型变量v的值复制到了一个在托管堆上新创建的对象中。所以该对象的值显然只是原始值的一个副本,因此改变原始值是不会改变箱内的值的。
拆箱
1)获取已经装箱的Vector3对象中各个字段的地址。
2)将已经装箱的Vector3对象中各个字段的值从托管堆上复制到线程栈的新的值类型Vector3的实例v1中去。
拆箱并不等于装箱的逆操作,它其实就是获取引用的过程,获取这个引用指向了一个分配在托管堆上的对象的值。值得注意的是拆箱并不涉及复制的过程。所以将指从托管堆上的对象中复制到值类型实例中,是拆箱之后紧跟的一步复制过程,而非拆箱本身。
拆箱时另一个值得关注的问题是,必须告诉编译器将Object拆箱成什么类型。因此在拆箱时应该注意只能转型为最初未装箱的值类型。而拆箱需要显式的指定要转型的目标类型这一点,也与装箱不同。