脚本

脚本用于响应玩家输入、事件响应、生成生动的效果、甚至是构建自定义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。


属性

放在类、函数等上的,用[ ]括起来的,表明作用的东西。


事件函数的执行次序

脚本_第1张图片

理解自动内存管理

我们调用函数中的参数,会把参数拷贝一份放在存储器中,如果参数是一些数字,那么它很小,没问题,但如果参数是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


矢量食谱

虽然矢量描述起来很简单,但它在编程过程中很细微且有巨大的作用。

理解矢量运算

加、减、乘、除。



脚本工具



事件系统

你可能感兴趣的:(脚本)