脚本用于响应玩家输入、事件响应、生成生动的效果、甚至是构建自定义AI。
脚本综述
介绍Object怎样受到脚本的控制,以及Unity特征和Mono runtime的关系。
创建和应用脚本
GameObject是被Components控制的,虽然Unity内置的Components已经很好了,但你会发现我们还是需要用脚本创建自己的Components。
有2种语言,C#和UntiyScript。
怎么创建脚本呢?
Assets > Create > C# Script
创建好的脚本是什么样的呢?
默认有2个函数,Start()和Update()。
怎么用这个脚本呢?
把它拖到Object上,作为一个Components。
变量和检视面板
你可以定义一个public变量,并在检视面板上看到它,还可以给它赋值。
用Components控制Object
一般我们可以通过编辑器控制Object的属性,但这是静态的,用脚本的不同在于可以动态的控制Object的属性。
怎么访问Component呢?
用函数GetComponent。
怎么访问其他Object呢?
创建一个public的GameObject变量,把其他的Object拖动到检视面板的public变量处。(Transform同理)
怎么找到Child Objects?
Transform.Find。
怎么通过Name或者Tag找到Object?
GameObject.Find,GameObject.FindWithTag,GameObject.FindGameObjectsWithTag。
事件函数
Unity通过事件函数来进行控制,比如Start和Update,还有更多的函数可供应用。
有哪些一般的更新事件?
Update(),FixedUpdate(),LateUpdate()。
有哪些初始化事件?
Start,Awake。
有哪些GUI事件?
OnGUI,OnMouseOver,OnMouseDown。
有哪些物理事件?
OnCollisionEnter,OnCollisionStay,OnCollisionExit,OnTriggerEnter,OnTriggerStay,OnTriggerExit。
时间和帧速率的管理
两次Update调用之间的时间长度不是恒定的。
所以如果帧率是10毫秒,那么每秒Update100次,如果帧率是25毫秒,那么每秒Update40次,就会有问题。
这时,我们就要用到Time.deltaTime。(distancePerSecond * Time.deltaTime)
什么是Fixed Timestep?
Unity的物理系统需要固定的时间步来进行精准的模拟。(Time Manager,Time.fixedDeltaTime)
什么是Maximum Allowed Timestep?
简单来说,当Fixed Timestep引起物理系统运算变慢时,要用到这个东西,它在Time Manager里可以设置。
什么是Time Scale?
就是速率,1表示正常,0.5表示半速。
什么是Capture Framerate?
有时候我们会把游戏录成视频,录制过程会耗费大量时间,就会用到这个东西,设置它保证游戏的流畅。
创建和销毁GameObjects
Instantiate,Destroy
协同程序
举个例子,当你想把一个物体慢慢变透明时,不可能在一帧内完成它,因为那样就看不到过程了,此时,你可以用到协同程序。
IEnumerator,yield return,StartCoroutine
它会单独形成一个函数,返回一次值后,把处理权交还给Unity,在下次Update时,再把处理权要过来进行下一次处理。
命名空间
防止函数名称冲突。
namespace XXX,using XXX。
属性
放在类、函数等上的,用[ ]括起来的,表明作用的东西。
事件函数的执行次序
理解自动内存管理
我们调用函数中的参数,会把参数拷贝一份放在存储器中,如果参数是一些数字,那么它很小,没问题,但如果参数是Object、array呢?太大了,会很费存储空间,效率也低,因此,就要用到pointer,它只是记录了存储地址,只要改变他就好了。
内存管理者会搜索所有属于激活状态的引用值,并标记它们为“活着”,当搜索完成时,把剩余的存储空间用于随后的再分配。这就叫“垃圾回收”。
虽然自动处理机制比手动处理机制强,但也需要程序员避免一些错误做法。
有2种策略,小内存就快速频繁的回收(每隔多久就回收一次),大内存就缓慢不频繁的回收(游戏暂停时才回收)。
还有,复用Objects也是一个方法。
平台依赖编译
暂不关注。
专用文件夹和脚本编译命令
Assets
Editor
Editor default resources
Gizmos
Plugins
Resources
Standard Assets
StreamingAssets
脚本的编译有4个阶段。
编译中有个基本原则,在当前编译阶段之后才编译的任何脚本都不能被涉及,在当前或早先阶段被编译的脚本都要确保能用。
4个阶段如下:
(表示没看懂,以后补吧)
类函数
尖括号,void FuncName(),var obj = GetComponent()。
脚本限制
主要针对不同平台说的。
脚本序列化
在Unity引擎中,序列化被用于加载场景、资源等。
(现阶段看不懂,以后再说吧)
Unity事件
感觉是Unity有一套自己的事件系统,不需要我们自己额外写什么了。
UnityEngine.Events
什么是空引用异常?
当你想引用一个不存在的东西时,就会出现空引用异常。
重要的类
MonoBehaviour
Transform
Rigidbody/Rigidbody2D
矢量食谱
虽然矢量描述起来很简单,但它在编程过程中很细微且有巨大的作用。
理解矢量运算
加、减、乘、除。