Unity界面
左上角 - 层级(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来表示旋转,比较复杂,我们使用:
//将角度转变成 欧拉角 来实现
//逆时针45度
transform.eulerAngles = new Vector3(0,0,45f);
如图,游戏对象位置和角度都发生了变化。
世界坐标,本地坐标:
WorldSpacePosition:以世界中心作为自己的坐标系。
LocalSpacePosition:以父节点轴心作为自己的坐标系。
例如:
新建雪球游戏对象并挂载同名脚本,其父级节点为滑雪人。
//在Start函数内
//将雪球初始位置设为父级节点右侧3个unit
transform.localPosition = new Vector3(3.0f, 0, 0);
运行游戏后观察到父级节点逆时针旋转45度后雪球依然被固定在父级节点右侧3个Unit处。
除此以外,LocalEulerAngle可以在父节点已经将子节点旋转过的情况下再次旋转子节点。
通过这个区别,可以简化很多复杂的位置算法。
向量
Vector2:二维向量的数据结构
Vector3:三维向量的数据结构
方向默认是原点到Vector坐标方向。
利用官方APi求向量终点到原点距离:
//先获取游戏对象的位置信息
//pos.magnitude获取位置到原点的距离
//打印输出二值
Vector3 pos = gameObject.transform.position;
float len = pos.magnitude;
Debug.Log(pos);
Debug.Log(len);
将一个向量变成单位向量的方法:
Vector3 pos = gameObject.transform.position;
pos = pos.normalized;
Debug.Log(pos.ToString("F3"));
//F3代表打印显示时保留3位小数
几种常用的标准向量:
Vector3.right//即Vector3(1,0,0)
Vector3.up//即Vector3(0,1,0)
Vector3.forward//即Vector3(0,0,1)
向量算数
将上述步骤在C#中实现:
//向量加法
Vector3 a = new Vector3(3, 1, 0);
Vector3 b = new Vector3(1, 2, 0);
Vector3 c = a