2019-05-14
unity 3D使用教程
软件简介
Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone、WebGL(需要HTML5)、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac 所支持。
内容简介
五大界面
1.场景(Sence),构建游戏的地方;
2.层级(Hierarchy),场景中的游戏对象都列在这里;
3.检测面板(Inspector),当前选中的资源或对象的设置,是一些变量和组件的集合;
4.游戏(Game),演示窗口,仅在播放模式中演示;
5.项目 (Project),一些资源的列表,和库的概念一样。
主菜单栏
文件、编辑、资源、游戏对象、组件、地形、窗口、帮助
系统核心——脚本
JavaScript
对于U3D来说,JavaScript是入门级的脚本语言,U3D内置的函数都能通过JS方便的调用。语法上,JS和传统的c语言差不多,需要分号结束符,变量类型定义,大括号……不过它的变量类型定义,是通过冒号接在变量右边,如:Name:string=”Li”。相对其他两种语言,使用JS语法,很多函数不需要实例化就能直接使用,如:vector3 direction=vector3(1,2,3)。同时注意,JavaScript不是Java,U3D中的JavaScript也有别于独立的JavaScript语言。
C#
微软开发的面向对象编程语言。由于有强大的net类库支持,以及由此衍生出的很多跨平台语言,C#逐渐成为U3D开发者推崇的程序语言。U3D内置的脚本范例中,C#脚本也占了很大一部分(其他脚本是JavaScript脚本)。另外,在装有VisualStudio的电脑上,我们也可以使用微软的脚本编辑工具来编写U3D脚本。
BOO
BOO是新兴的基于Python的语言。语法上,BOO和Python大同小异,都是通过换行来实现语句的结束,它省略了分号、大括号,甚至条件语句的小括号等。Python在很多大型三维图形软件上都有应用,它的跨平台性能很不错,可以使用Python来编写maya特效脚本;不过,对于游戏事件的编写,这种精简的语法反而有些难以适应。如基本的变量类型定义,BOO(类Python)语法就显得不那么便捷: direction as vector3 =vector3(1,2,3)。游戏事件不同于特效脚本,前者是过程中的交互,而后者只需要看到结果。因此,游戏中经常需要大量的具有明确类型的变量出现,BOO语言可以省略变量类型的优势在这里反而容易引发问题。
脚本的使用规则
U3D的脚本作用方式很有趣,称之为“拖放法”。无论是作用在一个具体的场景物体还是管理着批量的物体,脚本首先必须依附于场景中的一个元素才能被执行。要将脚本赋予物体的方式很简单,就是按住鼠标左键将脚本文件拖放到物体的属性面板上(也可以拖放到场景的物体上)。U3D有个概念,那就是component(成分)--类似Maya的节点。包括脚本,所有元素属性都是游戏物体的component。添加、删除、停用、读取、写入component信息,就是脚本所要做的(尽管脚本也是个component)。
根据脚本使用的情况,可以有以下做法:
1.脚本位于同一个物体上。
可直接使用泛型或者类型转换语法调用。
如:someScript = GetComponent<ExampleScript>();
2.脚本位于不同物体上。
需要使用Find或相关的搜索函数,取得指定名称的物体信息后,再+”.GetComponent”函数。如:GameObject.Find("stone").GetComponent<ExampleScript>()。
3.脚本位于同一路径或者被调用脚本位于主脚本的路径及以下(脚本是否被物体使用都可)。
将被调用脚本中的成员(变量或方法)使用static标识,然后可以通过”脚本.成员”的格式直接调用。例如:
ScriptA.CS
…
public static mm();
…
ScriptB.CS
…
ScriptA.mm();
…
不过,static成员的调用虽然提高了效率,但因为它常驻内存,所以在会产生大量系统资源要求的情况下要慎用。
*static是C#定义变量或方法类型的关键字,使用static的变量或方法,不需要new实例化即可直接调用。
【脚本内容】
除了JavaScript函数,C#和BOO的脚本都需要预先载入类库。这里以C#为例:
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
}
NewBehaviourScript是脚本的名称,它必须和脚本文件的外部名称一致(如果不同,脚本无法在物体上被执行)。所有游戏执行语句,都包含在这个继承自MonoBehaviour类的自创脚本中(大括号内)。
以下介绍一些常用的内置运行函数(定义函数时,JavaScript的关键字是function,C#是void,BOO是def。如:void Start()。
Awake:在游戏运行时调用,用于初始化。
Start : 只在游戏开始时执行一次,在Awake()函数后执行;
Update:在游戏每一帧都执行一次,在Start()函数后执行;
LateUpdate:同Update,只是它会在Update()函数执行后再执行;
FixedUpdate:当游戏中引入刚体系统,使用适配的方式同步物理时钟,可以让动力学更精确的计算;
OnGUI:绘制游戏界面的函数,因为每一帧执行多次,所以一些时间相关的函数要尽量避免直接在其内部使用。
OnMouseOver:鼠标停留在物体上时执行该函数的内容。
OnMouseEnter:鼠标进入物体范围时执行该函数的内容。和OnMouseOver不同,该函数只执行一次。
OnMouseExit:鼠标离开物体范围时执行该函数的内容。
OnMouseDown:鼠标按下时执行该函数的内容。
OnMouseUp:当鼠标释放时执行该函数的内容。
OnMouseDrag:按住鼠标拖动时执行该函数的内容。
OnMouse系列函数是针对指定物体的,如果要使用全局鼠标控制操作,则需要使用射线相关函数。
U3D内置的代码的命名规则
开头第一个字母大写的词组都属于类或者函数,而开头小写的词组则是变量。新手经常会混淆它们之间的区别。简单说来,函数词组可以作为变量的类型,还可以直接执行功能,词组后必接成对小括号;变量是对应函数的分支,实现的是对一个具体属性的控制。例如:
Camera和camera。当场景中存在一个默认的主摄像机,脚本位于摄像机时,Camera.mainCamera.transform和camera.transform是等同的;假如脚本在其他物体上,Camera.mainCamera.transform仍旧直接获取了主摄像机,而camera.transform必须要使用Find函数先找到指定名称的摄像机:GameObject.Find("mainCamera").camera.transform。当然,这里是列出细节来比较,实际运用时,脚本位于特殊元素上我们可以不用声明这个元素的类别,如camera.transform可以简化到transform。
GameObject和gameObject。前者包含查找,破坏和产生游戏物体的函数,同时可以将一个变量定义为“游戏物体”类型;后者则包含丰富的游戏物体属性,例如名称,变形信息,动画,渲染等。
同上面列举的camera,对于直接作用于指定物体的脚本,gameObject也可以省略掉。不过,在开始学写代码时,书写完整的变量名能让我们更深刻的记忆每个属性和变量的关系。
通过以上对比后可以这么理解,函数通常是全局控制(包含脚本外的其他物体),而变量是需要指出具体的应用对象。
*如果书写代码时语句不在函数作用范围内,编译器将无法智能完成一些变量的全名显示。
更多函数的运用方法,用户可参考官方提供的帮助文档。
简单例子
在一个箱子上按下鼠标左键,箱子就开始旋转,同时灯光被点亮,屏幕出现“Test”的字样。
1.点击Hierarchy栏下的Create,创建一个Cube,Plane和Spotlight。
2.在Assets目录下,创建文件夹(右键,Create->Folder),用于存放游戏的各种资源:模型,动画,材质,脚本,Prefab等。
3.双击进入myScript文件夹,创建一个C#脚本
.4.给脚本命名,然后再双击开启脚本编辑工具(如果脚本名称和内部的类名称不同,一定要更正)。
5.加入鼠标相关函数,这里我需要用到OnMouseOver,OnMouseExit,OnMouseDown。此类特殊函数不会有智能拼写出现。
6.语法方面就不傻瓜式的一步步进行了,实现的思路是:
当鼠标移动到物体上,物体的材质色彩变为黄色,同时将一个初始值为假的布尔变量1的值取真;当鼠标离开后,物体材质色彩还原,布尔变量1值为假;当按下鼠标左键,且布尔变量1的值为真,布尔变量2的值为真。
*OnMouse函数都是执行一次的函数,因此不能将和动画有关的控制函数放于其内执行,通常会使用布尔开关来控制Update函数中的动画函数。
7.接着在Update函数内实现:
当布尔变量2的值为真,物体旋转。
8.将写好的脚本拖拽到场景中的方块上(或者先选择方块,将脚本拖到方块的属性栏),调好摄像机位置,执行测试;
9.因为脚本只作用于其所依附的物体,要控制灯光,我们有两个选择:创建新的脚本,使用查找物体函数。很显然,我没必要为这么简单的功能加入一个新的脚本。因此我使用Find函数获取灯光的强度属性。
*脚本中遇到这样一串长长的语句时,通常会使用一个自定义变量来替代,而且很多时候还能降低计算量。例如:
float LightInt =GameObject.Find("Spotlight").light.intensity。如果在Start函数中初始化,Update中就不必每帧执行查找函数,降低游戏效率。不过这里作为一个测试,我也就很省事的忽略了。
10.GUI的使用。要在游戏视图显示各种UI信息,都需要使用U3D的UI组件或者GUI函数。为方便阅读,我将其他函数的内容收起,并使用GUI函数的Label创建简单的文字显示功能(有关GUI更多的详细信息,请参阅官方文档,我会在后面再做讨论)。
11.最终测试:
12.发布。执行File->BuildSettings,开启发布界面。设置好要发布游戏的平台以及一些发布的信息,点击Build按钮即可发布一个完整的游戏客户端。U3D支持发布的平台与用户授权和操作系统有关,如IOS游戏需要MAC平台的U3D才能发布,Android需要在系统安装安卓SDK包,次世代主机平台则需要用户向官方购买额外解决方案。