脚本

作者: Aprilcat | 来源:发表于2017-02-04 16:32 被阅读14次

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


    事件函数

    Unity通过事件函数来进行控制,比如Start和Update,还有更多的函数可供应用。

    有哪些一般的更新事件?

    Update(),FixedUpdate(),LateUpdate()。

    有哪些初始化事件?

    Start,Awake。

    有哪些GUI事件?

    OnGUI,OnMouseOver,OnMouseDown。

    有哪些物理事件?

    OnCollisionEnterOnCollisionStayOnCollisionExitOnTriggerEnterOnTriggerStayOnTriggerExit


    时间和帧速率的管理

    两次Update调用之间的时间长度不是恒定的。

    所以如果帧率是10毫秒,那么每秒Update100次,如果帧率是25毫秒,那么每秒Update40次,就会有问题。

    这时,我们就要用到Time.deltaTime。(distancePerSecond * Time.deltaTime)

    什么是Fixed Timestep?

    Unity的物理系统需要固定的时间步来进行精准的模拟。(Time ManagerTime.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


    矢量食谱

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

    理解矢量运算

    加、减、乘、除。



    脚本工具



    事件系统

    相关文章

      网友评论

          本文标题:脚本

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