C#的类型系统

C#是静态,安全,大多数时候显示的语言,而且所有类型都派生自Object类,同时Unity都是以MonoBehavior这个类作为基础的。

值类型与引用类型

引用类型

引用类型总是从托管堆分配,而C#要求所有对象都是用new关键词来创建。

简单介绍一下new操作符所做的事情:

  1. 计算所需内存空间,new操作符会计算其所有基类中定义的所有实例字段所需字节数。同时为了方便Mono运行时管理对象,还有一些额外信息需要托管堆为其分配空间,如类型对象指针和同步索引块。
  2. 在托管堆上分配其所要的内存空间,分配的所有字节设为0
  3. 初始化对象的类型对象指针和同步索引块
  4. 调用类型的实例构造器,同时编译器会自动调用当前类型的基类构造器
  5. 最后返回一个新建对象的引用,这就是说新建的变量是一个引用而不是对象本身

综上,引用类型可以概括为以下四点:

  1. 存储引用类型对象的内存空间从托管堆上分配
  2. 每一个对象都有额外的成员为Mono运行时提供操作该对象的信息
  3. 对象中的其他字段的字节总是0
  4. 并没有一个关键词能删除对象,所以当没有空间可用时会触发垃圾回收

值类型

如果所有类型都是引用类型,那么会消耗巨大的内存分配。因此,值类型实例都是分配在线程栈上的,并且不受垃圾回收(GC)影响

此外,值类型不能派生出其他类型,而且是隐式密封的。这就导致无须提供额外信息,也就不需要再托管堆上为其分配空间

并非所有值类型都分配在线程栈上,比如数组中的元素,引用类型中的值类型字段,迭代器中的局部变量。

引用类型总是分配在托管堆上,而值类型并不总是在线程栈上。

综上,对于值类型可以概括为:

  1. 不派生出其他类型,也不需要从其他类型派生
  2. 值类型不可变,指的是他没有提供会更改其字段的成员
  3. 值类型都派生自System.ValueTybe
  4. 值类型有已装箱和未装箱两种表示方式。装箱指的是将值类型转换为引用类型,很多情况需要获取和操作对值类型实例的引用,这便需要装箱机制

具体类型分类

引用类型:

​ 采用 Class,Interface,Delegate关键词来声明的自定义引用类型

​ C#内建的引用类型:Object, string(string类型是对字符串的一个引用),List类,Decoder

值类型:

​ 结构:数字型结构(System.Int32, System.Float),布尔型结构(System.Boolean),自定义的结构

​ 枚举: System.IO.FileAttribute等

当我们深入了解各个类型之间的关系时,所有结构都派生自抽象类System.ValueTybe,枚举的基类System.Enum也都派生自System.ValueTybe。事实上所有值类型都派生自这个类

Unity脚本语言中的引用类型

UnityEngine.Object是Unity3D中C#脚本语言最基本的类,所有的脚本派生自MonoBehavior类

Unity3d中脚本会按照规定流程来执行

概括一下:

  1. 调用所有的Awake方法,再调用所有的Start方法

  2. 游戏逻辑循环

    1)所有FixedUpdate方法

    2)物理模拟

    3)OnEnter,Exit,Stay触发函数

    4)OnEnter,Exit,Stay碰撞函数

  3. 刚体插值,主要作用于transform.position和transform.rotation

  4. 输入事件如OnMouseDown,OnMouseUp

  5. 所有Update方法

  6. 高级动画,混合并应用到变换

  7. 所有LateUpdate

  8. 渲染

  9. 对象销毁或退出场景

此外,加载阶段的事件执行条件

  • Awake 是在gameObject被设置为Active后立即触发的, 且仅触发一次, 无论是场景中、Instantiate、还是SetActive(true);
  • OnEnable 只有在gameObject为Active且脚本enable为true时才会被触发, 如果enable为true时gameObject处于关闭状态, 则在gameObject被打开时跟在Awake后被触发;
  • Start 是在第一次Update之前触发的, 只有在gameObject为Active且脚本enable为true时才会被触发, 且仅触发一次;

Unity脚本语言中的值类型

向量类型主要表示位置和方向,以及纹理坐标,网格切线等

既然说到了向量就复习一下点乘和叉乘吧

点乘积: 两向量点乘等于他们的模长乘以向量夹角cos,可以判断当前物体是否朝向另一个物体,只需要计算transform.forward和(target.transform.position- transform.position)的点乘,大于0则面对另一个物体

叉乘:两向量的叉乘得到的向量与这两个向量组成的平面垂直,得到的模长等于他们的模长与夹角sin相乘,满足右手法则

其他的比如Color,Ray,Touch(描述手指触摸屏幕的状态)

装箱和拆箱

我们有时候就是需要一个引用类型,比如我们使用ArrayList来容纳Vector3结构,ArrayList类中的Add方法参数就是一个Object类型。但向量不是一个引用类型,这时候Vector3实例就必须转换成在托管堆上分配的对象,且必须获得对象的引用。

介绍一下装箱的步骤:

  1. 在托管堆队中分配内存,此时就需要各个字段以及那两个额外成员所需的内存
  2. 将值类型字段复制到新分配的堆内存中
  3. 返回对象地址,也就是对象的引用

我们可以发现我们只是将值类型变量复制了一份到托管堆上,我们改变原始值不会改变箱内的值

当然我们读取ArrayList中的元素便会拆箱,我们需要告诉编译器需要拆箱成什么类型(因为他已经是Object类型了)。

拆箱具体过程就是获取ArrayList中索引为0的元素包含的引用,再将其指向的对象复制到值类型的实例去,拆箱时我们要明确指定为最初的值类型。

从这些步骤我们就能看出由于装箱拆箱、复制会影响程序的速度和内存,而且由于频繁的操作托管堆会增加GC次数,所以日常开发中我们并不常用这类会触发装箱机制的类型,而是采用List这样的泛型

Unity3D脚本语言的类型系统相关推荐

  1. unity 中文_Unity无情大爆料时间Unity3D的脚本语言

    游戏已经成为现代社会中一项不可缺少的活动,而游戏的开发,更是成为了别人眼中一项有趣而又令人羡慕的工作.那么今天,就由KaHoo同学以大家熟悉的Unity3D引擎为例子,向你们介绍游戏开发中一个重要的灵 ...

  2. 【cocos2d-x从c++到js】20:脚本语言风格的JS代码

    最近听说Cocos2d JS官方在组织写新的代码例子.并且林顺同学在开会时说,Cocos2d JS接口将回归JS风格,成员变量访问方式用".",以及初始化时用对象字面量{}.非常不 ...

  3. 游戏c#脚本语言,C#作为脚本语言执行解密

    背景 我们知道Unity3d是通过C#脚本语言的形式来实现游戏的逻辑代码编写,同样SCOTT服务器也设置了通过C#脚本来实现游戏逻辑,但是本文并不是想真正分析解密他们的运行机制,只是想通过自己的一个需 ...

  4. 游戏中的脚本语言原理与发展

    作者:陈嘉栋(慕容小匹夫)     源地址:http://www.cnblogs.com/murongxiaopifu/p/4557365.html 从游戏脚本语言说起,剖析Mono所搭建的脚本基础 ...

  5. unity3d 脚本参考-技术文档

    unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...

  6. Python脚本语言写法

    Python脚本语言写法 脚本语言的开始行,是指文件中的代码用什么可执行程序去运行它,就这么简单. #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的pyth ...

  7. html脚本语言居中,web前端:CSS--几种常用的水平垂直居中对齐方法

    层叠样式表(英文全称:CascadingStyleSheets)是一种用来表现html(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.css不仅可以静态地修 ...

  8. Java中使用LUA脚本语言

    Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ieru ...

  9. 重大改变!Python 或将取代 VBA 成为 Excel 官方脚本语言

    如果微软的 Excel 中支持了人生苦短的 Python,你还会喜欢那个直接且易上手的 VBA 编程吗? 近日,据国外媒体 BLEEPINGCOMPUTER 报道,微软正考虑添加 Python 为官方 ...

  10. python是脚本语言不需要编译器编译执行_都有Python了,还要什么编译器!

    编译的目的是将源码转化为机器可识别的可执行程序,在早期,每次编译都需要重新构建所有东西,后来人们意识到可以让编译器自动完成一些工作,从而提升编译效率. 但"编译器不过是用于代码生成的软机器, ...

最新文章

  1. JCR:曝气生物滤池处理焦化废水过程中N2O和NO的产生机理与群落功能研究
  2. POJ 1597 Function Run Fun
  3. spring12:注解的方式实现di(依赖注入)
  4. 车提示检测轮胎气压_无钥匙启动的车启动后,车主带着钥匙离开车,能不能把车开走?...
  5. 摄像头图像分析目标物体大小位置_摄像头的原理、组成、选型及应用
  6. 请教Nutzwk项目,在beetl页面怎么用shiro标签呢?
  7. axis在matlab中是什么意思_珠宝首饰上的钢印是什么意思呢?你都知道吗
  8. 如何在 Linux 中复制文件到多个目录中
  9. python百分号转义_python 转义字符、运算符、列表。。。。
  10. lncrnadisease:lncRNA相关疾病数据库
  11. 利用代理IP爬取京东网站手机数据
  12. 图论(十三)——平面图和对偶图
  13. OpenFaaS实战之六:of-watchdog(为性能而生)
  14. 血糖仪和糖化血红蛋白分析仪区别?
  15. 前端开发中常用的英语单词短语总结
  16. 公众号榜单 | 2020·7月公众号地区排行榜重磅发布
  17. mysql语句计算距离_mysql查询中的距离计算
  18. 30岁女生转行做软件测试,本人三十岁,女,现在软件测试行业,想转行,什么行业合适呢?...
  19. 微信小程序我在校园打卡微信小程序设计与实现(含论文)
  20. Linux常用命令超详细版

热门文章

  1. DEVC++中的 “万能头文件” <bits/stdc++.h>
  2. 米4用linux刷机救转,小米4变砖之后如何刷机自救?大神教你小米4线刷救砖方法...
  3. python实现app自动签到器_python实现网页自动签到功能
  4. mysql 全关联查询_Mysql 关联查询(内联、左联、右联、全联)
  5. 计算机毕业设计——基于SSM框架的公寓租房管理系统的设计与实现
  6. 网易云音乐转码_网易云音乐产品分析报告
  7. TIA Portal V17安装教程
  8. 直线绘制算法-数值微分法(DDA)
  9. 【控制】动力学建模举例 --> 拉格朗日法
  10. 【Unity3D】常用快捷键