在上一课的内容中,我们介绍了UnityEngine所提供的重要事件函数。大家可能现在只有一个比较模糊的概念,但是没关系,在后面的学习中,当我们具体用到的时候再详细解释。
在这一课的内容中,我们会带大家认识下Unity3d中一些重要的类和方法。同样的,这部分内容不需要大家掌握那么多的细节,只要知道有这些东西的存在就好~
还等什么呢?让我们开始吧~
03 Unity和C#的双剑合璧-Unity游戏脚本剖析下
我们在之前的学习中提到过,在开发游戏脚本的时候,可以创建自己的类、方法和函数。与此同时,我们也可以直接调用Unity所提供的系统类、方法和函数。在上一课中我们认识了UnityEngine所提供的重要事件函数。而接下来大家可以一起来认识下UnityEngine提供的系统类、属性和方法。
1.Camera(摄像机)
在游戏当中,摄像机就像是人的眼睛,玩家通过摄像机所捕捉到的画面来观察整个世界~
对于平面设备上的游戏来说,平面空间的点以像素为单位。平面的左下端坐标是(0,0),右上端坐标是(屏幕宽度,屏幕高度),而z值则是跟摄像机之间的距离。
当然,这里的平面设备指的是我们日常所接触到的电子设备,包括电脑、游戏主机、掌机、智能手机、智能平板、智能手表等等~
对于立体显示设备(比如VR头显设备)来说,情况可能会有一些微妙的差异,这里就不展开讲了。
需要注意的是,在同一个场景中可以同时设置多个摄像机(相当于拍摄电影用的多机位~)。当然,我们需要设置这些摄像机的渲染顺序和位置。
当我们在Unity项目中新建一个场景时,系统就会自动为我们创建一个名为Main Camera的游戏对象。在Hierarchy视图中选择它,那么在Inspector视图中就会看到一个名为Camera的组件,其中包含了多种属性。
作为系统所提供的类,Camera提供了很多public类型的方法和static类型的方法
对于public类型的方法,大家应该都明白是怎么回事了。这里我们提到一个新的名词,static类型的方法,也就是静态方法,这又是什么梗?
简单来说,如果一个方法需要类的“实例”对象才能完成,那么就需要定义成普通的方法,否则可以定义成静态方法。
比如Math.Sin()方法,求sin值的时候,我们并不需要了解Math类的任何信息。
而对于string.Trim()方法则不同,我们需要获取一个具体的string实例对象才能进行操作。
Camera类的方法和属性非常多,这里不一一赘述。大家可以多看官方文档,其次,在后续用到的时候我们会详细说明。
2.Canvas(画布)
Canvas用来在屏幕上渲染UI视觉元素,所谓的UI就是用户界面,比如按钮、文本、图片等等。
在Unity中,Canvas上视觉元素的渲染通常在游戏场景的渲染之后完成。
Canvas视觉元素的渲染有三种方式,分别是重叠,摄像机和世界空间。单纯从文字上很难解释这三种渲染方式的区别,大家可以直接看下面的对比图。
(1)Screen Space- Overlay(重叠 )
(2)Screen Space- Camera(摄像机)
(3) World Space(世界空间)
需要特别提醒大家的是,在开发VR虚拟现实游戏应用时,通常会选择第三种渲染方式。
而在默认情况下,通常会选择第一种渲染方式,也就是让UI元素显示在最前面。
3.GUI(图形用户界面)
和Canvas类似,GUI类是Unity的图形用户界面的重要组成部分。
不过Canvas的实现更多是通过可视化的方式,而GUI类,或者说Immediate Mode GUI(IMGUI)类则是Unity UI系统的一个完全独立的分支,完全由代码驱动。
通常我们使用Unity的事件函数OnGUI来调用跟IMGUI相关的代码。
比如:
void OnGUI() {
if (GUILayout.Button("Press Me"))
Debug.Log("Hello!");
}
4.GameObject(游戏对象)
GameObject是Unity项目中最最最重要的一个类,没有之一。任何一个游戏场景的所有实体都以GameObject为基类。
5.Component(组件)
Component或许是Unity中仅次于GameObject的核心类了。
任何关联到GameObject的组件都基于Component这个类。或者换句话说,当我们在Hierarchy视图中选中某个游戏对象时,出现在Inspector视图的所有组件都基于Component。
需要注意的是,我们无法使用代码直接创建一个Component。所以如果想要让某个脚本成为GameObject游戏对象的组件,就必须将脚本关联到游戏对象上。
6.Input(输入)
任何一款游戏都需要玩家和游戏之间的互动,哪怕是最简单的点击记下按钮,或者输入一些文字。当然,Unity还支持键盘、游戏手柄、手机触摸屏,甚至是手势动作作为玩家的输入。
7.Light(光照)
之前我们提到过Unity内置了非常强大的光照系统。我们可以通过两种方式来调整游戏场景中的光照,一种是使用Inspector视图中的属性设置,而另一种方式则是通过使用代码来创建和设置场景中的光照效果。
8.Material
对于一个游戏对象来说,几何形状、材质、纹理和贴图共同决定了它最后在玩家眼中的模样。
同样的,我们可以通过Inspector视图用可视化的方式来设置材质,也可以使用代码来更精确的设置材质。
9.Mesh(网格)
如果说Material(材质)就像物体表面的装饰物,那么Mesh则是构成游戏对象的3D模型网格。3D模型都是由多边形拼接而成的,实际上是由多个三角面拼接而成。所以一个3D模型的表面是由多个彼此相连的三角面构成。三维空间中,构成这些三角面的点以及三角形的边的集合就是Mesh。
对于一款3D游戏来说,其实绝大多数的游戏对象都包含了Mesh网格。不过遗憾的是,除了Asset Store上面的第三方插件,Unity官方并没有提供专门的建模工具。不过Unity可以支持使用外部建模工具所创建的3D模型,如3dsmax,maya等。
此外,跟Material/Mesh等共同起作用的关键类还包括Renderer以及Render开头的其它几个类。此外,还有Texture和Texture开头的几个类。
10.Physics(物理)
Unity中为了惟妙惟肖的模仿真实世界的物理法则,提供了强大的Physics类。
跟物理系统相关的其它核心类还包括Ray,RaycastHit,Rigidbody等。
11.Vector(矢量)
好了,看到这里,我们终于遇到需要另外一个似乎有点唬人的概念。但其实仔细想想,在初中物理课上,我们已经接触过矢量的概念~
矢量(Vector)是一种既有大小又有方向的量,又被称为向量。
矢量在3D游戏开发中非常重要,因为它是3D图形学,物理引擎和动画系统的核心基础之一。
在Unity中,有几个跟矢量相关的核心类,包括Vector2,Vecor2Int,Vector3,Vector3Int和Vecor4。
其中,Vector3是最重要同时也是最基本的类。
关于Vector的概念和使用,Unity官方文档上甚至专门提供了Vector Cookbook(Vector上手指南),感兴趣的童鞋可以了解下
简单来说,在Unity的游戏世界中,任何一个游戏对象的空间位置都使用一个Vector3向量来表示,而它的位移、旋转和缩放同样使用Vector3向量来表示。
虽然Vector3涉及到3D数学的知识,似乎拒人于千里之外。但是,Don’t panic。Unity的Vector类已经提供了我们所需的主要方法。而关于Vector3的具体使用,我们在后续的示例项目中用到时再来讲解,现在大家只需要知道这个词的含义就好了~
12.Animation(动画)和Animator(动画控制器)
Unity提供了Mechanism动画系统,可以让开发者自由灵活的控制游戏角色的动画。
我们可以在Unity编辑器中通过Animator组件和Animator视图对动画进行基本的设置:
而如果需要更加灵活的在游戏中生成和控制游戏动画,当然可以在代码中使用Animation和Animator相关类了~
13.其它
实际上,Unity提供了足够多的系统类可供我们使用。虽然早期的版本还有很多不成熟的地方,但到目前来说,除了Network网络系统仍然差强人意令人不太满意之外,其它的核心子系统都已经非常完善了。
如果我们要把Unity所提供的所有核心类的属性和方法都逐一描述,相信至少也需要好几本书才能够涵盖~
而且更重要的是,Unity在新的版本中还会对这些类的属性和方法进行灵活的更新和调整,因此即便你能背下这几本天书,也没多大用处。
对于开发者来说,无论是新手还是老手,最重要的是知道,我在游戏项目开发中要用到的是哪一部分的知识,需要用到哪些系统类。至于具体如何使用,可以随时查看官方文档,以及通过实际的项目开发来累积经验。如果还像学校期间死记硬背那些知识,是非常低效且无用的~
我跟很多新手交流过,他们经常抱怨的一点是:不管所学的教程再怎么浅显易懂,但是一旦抛开教程,自己又不知道该如何进行下一步了。授人以鱼不如授人以渔,我希望大家在学习的过程中学会掌握自学的方法,而不是永远嗷嗷待哺的巨婴。
所以还是那句话,对于初学者来说,Unity的官方文档永远是最好的学习资料,请大家一定牢记这一点~
就可以找到所有核心类的详细说明,动手试试看吧~
好了,本课的内容就到此结束了。
从下一课开始,我们将通过一个实际的示例游戏项目来讲解如何在实际的游戏开发中使用游戏脚本。
让我们下一课再见~