Unity3d学习——基础篇

《Uinty3d官方案例精讲》

脚本:

游戏对象间的逻辑关系需要通过脚本实现,游戏关卡的设计、各类角色的运动、场景的资源管理等,其背后都是脚本在驱动。最新的Unity5支持两种编程语言,C#和JavaScript,其中JavaScript语言更容易上手,C#是面向对象的编程语言,语法与C++、Java较为接近,在编程思想上更符合Unity引擎的原理。

Unity C#语言基础知识:

变量、数组与函数:

定义变量:    类型 变量名 /*=初始值*/


不加public、protected、private默认为private。

如果声明public变量,并且把脚本绑定到物体上,则会在物体的Inspector视图上显示,并且可以修改值,若不想显示,可为变量加上[HideInInspector];如果希望在Inspector上限定取值范围,可以使用RangeAttribute实现。



数组的声明和使用:    类型[] 变量 /*=初始值*/

二维数组:

Unity3d学习——基础篇_第1张图片

函数的声明和使用:

返回类型 函数名(参数列表)

{     函数体

}

C++参数传递方式有传值、传址、传引用三种;而C#中只有传值和传引用两种,其中传引用可由关键字ref和out完成,ref需要实参初始化,而out不需要初始化,输出参数。

语句、表达式和运算符:

语句:

Unity3d学习——基础篇_第2张图片

运算符:

不常见的:


协程(Coroutine):

在Unity中,协程的概念类似于线程,它是一种特殊的函数,能中断(通过yield语句)执行当前的代码,直到中断指令(YieldInstruction)结束后再接着之前的代码继续执行。以下是一个协程的例子:


上面的协程表示等待五秒钟后输出当前的时间。

在C#脚本中创建协程需遵循一下规则:

(1)协程的返回值必须是IEnumerator。

(2)协程的参数不能加关键字ref或out。

(3)在C#脚本中,必须通过StartCoroutine来启动协程。

(4)yield语句要用yield return来替代。

(5)在函数Update和FixedUpdate中不能使用yield语句,但可以启动协程。

在协程函数中,yield语句就像是一个红绿灯,在碰到yield语句前是绿灯,协程函数顺序执行,碰到yield语句时表示前方红灯亮,协程函数立即停下等待,当中断指令结束后红灯熄灭,绿灯变量,协程函数继续顺序执行余下的代码。

在Unity中,绝大部分协程相关的类都继承自基类YieldInsturction。唯一例外的类是WWW,它不继承自YieldInstruction,但可以用在yield return语句中。

Unity3d学习——基础篇_第3张图片

yield语句在协程中的典型用法如下。值得注意的是,WaitForSeconds()受Time.timeScale影响,当Time.timeScale为0时,yield return new WaitForSecond(n)将失效。

Unity3d学习——基础篇_第4张图片

在C#脚本中,MonoBehaviour类中的成员函数StartCoroutine用于启动协程,该函数的声明为:


StartCoroutine只能用于MonoBehaviour或其子类中。

StartCoroutine接收协程名称(字符串)或IEnumerator实例作为参数。

使用字符串作为参数启动协程时可以在StartCoroutine的第二个参数中为协程指定参数,但最多只能传递一个参数,而使用IEnumerator作为参数则没有这个限制。

在Unity中,可以使用函数StopCoroutine来终止一个协程,但这种方法只适合用于使用协程名称作为参数启动的协程。使用StopAllCoroutines可以终止该MonoBehaviour中所有能终止的协程。还有一种不常用的方法终止协程,即将协程所在游戏对象的active属性设为false,但是当再次将active属性设为true时,协程不会自动启动。

下面是使用协程的一些实例:

Unity3d学习——基础篇_第5张图片

最后,书写yield语句时需要注意一下几点:

(1)yield return语句不能位于try-catch语句块中,但可以位于try-finally中的try语句块中。

(2)yield return语句不能放在匿名方法中。

(3)yield return语句不能放在unsafe语句块中。

类和类的使用:

Unity中提供的类绝大部分都是通过UnityEngine.dll和UnityEditor.dll这两个程序集暴露出来的,其提供的接口也都在UnityEngine和UnityEditor两个命名空间中。在unity编辑器中新建的脚本都会默认添加如下两个命名空间的引用:

using UnityEngine;

using System.Collection;

从Unity4.6以后,Uinty团队更新了UI部分的设计,新的UI相关的类都放在了UnityEngine.UI.dll中。

最新的Unity5已经支持用户自定义命名空间。在实际开发中,随着代码量不断增加,可以将相同功能的代码模块放在同一个命名空间,以便于进行代码管理。

在Unity中,任何要绑定到GameObject上的脚本都必须继承自MonoBehaviour。若一个类不继承自MonoBehaviour,在拖动到GameObject上会报以下错。


常用类的关系:

Unity3d学习——基础篇_第6张图片

输出调试信息:

print


Debug.log


第一种方法实际是第二种方法的封装,其底层实现基于第二种方法。需要注意的是,在任意C#脚本中都可以采用Debug类的Log系列方法输出,但prinf函数只适用于MonoBehaviour的派生类。

Unity脚本时间执行顺序:

在Unity脚本中,各事件函数的功能和大体的执行顺序如下:

1、Awake:Awake用于脚本唤醒。此方法为系统执行的第一个方法,用于脚本的初始化,在脚本的生命周期中只执行一次。

2、Start:在Awake之后执行,在脚本生命周期只执行一次。和Awake常用于初始化成员变量。

3、FixedUpdate:用于固定频率更新。默认每秒50次。通常情况下,FixedUpdate()会比Update()更频繁地调用。

4、Update:用于正常更新,即用于帧更新后同步场景状态。此方法每帧都会由系统自动调用一次。在使用Update()时,对于一些变量,如速度、移动距离等通常需要乘以Time.deltaTime来抵消帧率带来的影响,使物体状态的改变看起来比较均匀、正常。而在FixedUpdate中,由于其更新频率固定,所以不需要采用Time.deltaTime来修正状态改变频率。

5、LateUpdate:用于延迟更新,此方法在Update()之后执行,每一帧调用一次。

6、OnGUI:OnGUI用于绘制用户交互界面,每一帧会调用多次。其中,与布局和重绘相关的事件会被优先处理,然后是键盘和鼠标事件。

7、OnDestory:在当前脚本销毁时调用。若在脚本中动态分配了内存,可以在OnDestory()中进行释放。

你可能感兴趣的:(Unity)