读书笔记

作者: 午字横 | 来源:发表于2017-04-25 11:28 被阅读3次
使不可见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值类型的实例在这里必须转换成真正的托管堆上分配的对象。


堆栈.png
值类型装箱的步骤

1)在托管堆中分配内存。需要注意的,由于是将值类型进行引用类型化,因而分配的内存空间除了值类型各个字段所需要的内存之外,还要加上托管堆所有对象都有的两个额外成员(类型对象指针和同步索引模块)所需的内存。
2)将值类型的字段复制到新分配的堆内存中。
3)返回对象地址,即对象的引用。值类型就成了引用类型。
通过分析这三个步骤可以发现,Mono运行只是将值类型变量v的值复制到了一个在托管堆上新创建的对象中。所以该对象的值显然只是原始值的一个副本,因此改变原始值是不会改变箱内的值的。

拆箱

1)获取已经装箱的Vector3对象中各个字段的地址。
2)将已经装箱的Vector3对象中各个字段的值从托管堆上复制到线程栈的新的值类型Vector3的实例v1中去。

拆箱并不等于装箱的逆操作,它其实就是获取引用的过程,获取这个引用指向了一个分配在托管堆上的对象的值。值得注意的是拆箱并不涉及复制的过程。所以将指从托管堆上的对象中复制到值类型实例中,是拆箱之后紧跟的一步复制过程,而非拆箱本身。
拆箱时另一个值得关注的问题是,必须告诉编译器将Object拆箱成什么类型。因此在拆箱时应该注意只能转型为最初未装箱的值类型。而拆箱需要显式的指定要转型的目标类型这一点,也与装箱不同。

相关文章

网友评论

    本文标题:读书笔记

    本文链接:https://www.haomeiwen.com/subject/mbqvzttx.html