左上角 - 层级(Hierarchy): 以树形式显示游戏内对象
左下角 - 项目(Project): 项目内导入的资源文件 - 控制台(Console): 用于游戏代码的打印输出调试
中间栏 - 场景(Scene): 以可视化形式展示游戏内容 - 游戏(Game): 对游戏进行预览
右侧 - 检查器/属性(Inspector): 显示资源和游戏对象的属性
游戏中的场景是至关重要的, 它区别游戏中不同的活动空间, 给予玩家不同的视觉感受。它被储存在项目栏里的Scenes文件中。
场景的储存方式为。unity文件。
可见Unity中游戏开发文件的储存方式即为场景。
资源(Asset)指游戏中使用到的素材, 包括:
图片素材Texture, 音频素材AudioClip, C#脚本素材C# Script等等。
资源的导入: 直接将需要的资源文件复制到Assets文件夹下
在资源文件夹中会自动生成导入的素材的。meta描述文件。
最好在Assets文件夹下创建一个Textures文件夹用来专门存放游戏贴图。
游戏贴图的裁剪:
对于一张图片中有多个素材的情况,Unity内置素材贴图切割
我们将素材的Sprite模式设置为多个,代表这个贴图中有多个素材
进入Sprite Editor,选择Slice可以进行自动切割。一个图片未经切割的话,便只包含一个Sprite。
我们在游戏中看到的一个个物件, 人物, 实体都被称作游戏对象, 是从游戏资源经过加工而实现在游戏内的模型, 贴图等。
如图, 将贴图拖动至层级栏内可以建立一个游戏对象
另外, 在游戏的场景文件中不会保存此场景内的游戏对象, 它保存的是游戏对象的引用和属性。
如图,这是检查器栏内游戏对象的属性,名字左边的对勾为Active选项,设置游戏组件的激活状态。
标签:用于对游戏对象进行分类,方便批量操作。
如图,这是检查器栏内的游戏对象精灵渲染器和额外设定。
若要修改2D项目内的贴图显示层级,要修改额外设定内的图层顺序(Order in Layer),大的在上。
或者直接修改Z轴坐标(不推荐)。
轴心(Pivot):
主要用来确定素材的中心位置,旋转原点。
如果轴心不在贴图的中心,贴图在旋转和移动的时候会有所不同。在选中一个贴图素材(注意不是游戏对象)后,检查器内点击Sprite Editor可以编辑贴图的轴心位置。
在层级栏中,我们可以指定游戏对象间的父子关系,以方便对象的批量操作,最简单的例子就是:子对象会随着父对象完全同步的移动和旋转。
配置:只需要将要设为子对象的游戏对象拖动为要设为父对象的游戏对象上面即可。
子对象相当于父对象的分支。
值得注意的是,子对象的坐标轴是相对于父对象的,在父对象移动和旋转时子对象不发生移动和旋转(牵连运动),子对象的坐标轴原点是父对象的轴心。
即预先制作好的游戏对象(模板)。将游戏对象预先制作好,作为资源备用。一般用于游戏对象的动态创建。
首先在Assets文件夹下新建用于存储大量预制体的文件夹Prefabs;将一个已经制作好的游戏对象拖入Prefabs文件夹,这里使用雪球。
这样就表明这个游戏对象是一个预制体实例,它有属于自己的预制体,使用预制体可以快速创建大量实例。预制体名字尽量改为***prefab的形式,避免混淆。
预制体的编辑:
预制体是一个游戏资源,双击可进入资源编辑模式
在游戏资源编辑器中,窗口左边的层级栏变成了该预制体的层级栏,只显示该预制体下的游戏对象和子对象。场景栏变成显示预制体的栏。
给雪球预制体挂载一个脚本:
//Update内
float step = 0.8f * Time.deltaTime;
transform.Translate(step, 0, 0, Space.Self);
每个用预制体生成的雪球实例都会自动挂载该脚本,也就是自动平移。
Prefab和PrefabInstance存在着联系,对预制体的修改可以被反映到全部预制体实例上,而对预制体实例的修改也可以保存到对应预制体上,最终反映到所有预制体实例当中。
当预制体实例被修改后,点击Overrides可以查看当前实例与预制体的不同之处。
可以选择重置该实例(RevertAll),也可以选择应用对该实例的修改到预制体上(ApplyAll)
中断一个实例与预制体的对应关系:
层级栏中右键点击要断开的实例,Prefab>Unpack执行断开操作,让这个实例成为独立的游戏对象。
动态创建实例:
使用滑雪人挂载的脚本,当按下鼠标左键时生成一个向前运动的雪球。
首先确保雪球预制体挂载的脚本令雪球会向右移动。在滑雪人脚本中:
public GameObject snowBallPrefab;
//Update内
if(Input.GetMouseButtonDown(0))
{
Instantiate(snowBallPrefab);
}
由于Instantiate函数重载的很多版本,这里列举几个常用的:
//在脚本挂载的游戏对象所在的position,rotation生成一个实例,并指定该实例的父级为根节点
GameObject snowBall = Instantiate(snowBallPrefab);
//在指定position,rotation生成一个实例,并指定该实例的父级为根节点
GameObject snowBall = Instantiate(snowBallPrefab, transform.position, transform.rotation);
//在脚本挂载的游戏对象所在的position,rotation生成一个实例,并指定该实例的父级为当前脚本挂载的游戏对象的transform.parent
GameObject snowBall = Instantiate(snowBallPrefab, transform.parent);
//在指定position,rotation生成一个实例,并指定该实例的父级为当前脚本挂载的游戏对象的transform.parent
GameObject snowBall = Instantiate(snowBallPrefab, transform.position, transform.rotation, transform.parent);
实例的销毁:
让雪球超出边界后销毁自己的函数:
Vector3 sp = Camera.main.WorldToScreenPoint(transform.position);
if (sp.x > Screen.width && sp.x < 0)
{
Destroy(gameObject);
}
在选中一个游戏对象后, 检查器栏会调出被选中的游戏对象的各种属性, 其中Transform属性包括了该游戏对象的三个基本信息:
位置, 旋转角度, 缩放大小。
坐标单位: 在Unity的坐标系中, 约定一个方格为1x1单位(Unit), 在屏幕上是100像素, 在真实世界中可以自行约定。
Unity主要用于3D开发, 就算我们现在开发的是一个2D的游戏, 它仍然会给我们一个Z坐标。
X:横向右为正 Y: 纵向上为正 Z: 垂直于屏幕里为正
且在Unity中, 旋转是逆时针为正的。
皆由此我们的项目2D和3D转换成为可能。
3D视图导航器Gizmo界面
坐标与旋转:
Vector3变量:用来表示3维向量(x,y,z),也称为3元数。
//x,y,z为float类型
//在脚本运行时给予游戏对象一个新的坐标位置
transform.position = new Vector3(0,1.0f,0);
对于旋转角度,我们不使用transform.rotation,因为它是使用Vector4来表示旋转,比较复杂,我们使用: