Hierachy:层级面板,游戏场景中的资源,比如UI、模型;
Scene:场景面板,用于管理游戏场景中的各种游戏物体;
Game:游戏场景面板,实际的玩家视角;
Project:项目面板,用于管理项目中的所有资源;
Inspector:检查面板,可以理解为属性窗口,查看 Hierachy 或 Project 中资源的属性。
游戏场景概念:
一个游戏可以有多个场景,游戏场景是由游戏对象组成的,一个场景就相当于是一个独立的世界,我们可以简单的把游戏场景理解成是游戏对象的一个容器。
创建项目时会默认创建一个 SampeScene 场景文件,Unity 中场景是以文件形式存在的。
游戏场景漫游:
由于Game面板是玩家视角,不方便观察,所以我们会在Scene面板中使用上帝视角来开发游戏。
首先,可以点击Scene面板中任意地方,达到选中Scene面板的目的。
鼠标右键(按住):拖动鼠标旋转视角,WASD场景漫游;
鼠标中键:拖动鼠标平移视角;
ALT键(按住):再按住鼠标右键,拖动前后缩放。
组件概念:
对于现实中的电脑来说,电脑里面的硬盘、内存条都是电脑的组件,其共同特点在于 可替换性。
游戏组件:
Unity 的设计思想是基于组件,角色可以移动、角色可以播放动画、UI可以点击等等,一切都是基于组件。
Unity 中包含大量的系统,比如UI系统,UI系统中有按钮、图片、下拉框,这些功能都是不同的组件,这些组件组合在一起就是 UI系统。
模型介绍:
模型是一种美术资源,3D游戏中,场景、角色、武器等立体的元素一般都是模型。学习阶段我们可以使用Unity内置的简易模型来学习引擎操作。
添加模型步骤:在层级面板中 右键点击 --> 3DObject --> 各种模型
材质介绍:
模型本身是由“顶点组成的网格数据”,本身并不存在颜色。
材质决定了模型的实际外观,由于我们使用的是Unity内置模型,和模型一样,材质也是一种资源。
工具栏:
以上都是在改变游戏物体的Transform组件中的各项数值。
约束与吸附:
复制模型:Ctrl + c,粘贴模型:Ctrl + v,快速复制:Ctrl + D,快速定位:F.
为什么要自定义组件?
Unity中提供的组件,都是单一功能。本身并没有复杂的业务逻辑,比如 Transform 组件确实可以位移角色,但是什么时候位移要由我们来决定。
一般情况下,我们写的组件大多与游戏逻辑有关,比如玩家控制脚本。
创建组件:
Unity 的设计思想是基于组件,所有我们的代码本质上也是一个组件,比如我们写一个功能让角色可以移动,那这个C#文件也是一个组件,可以挂载到游戏物体上,挂载后就可以生效。
创建组件步骤:项目面板中 右键点击 -> 创建 -> C#脚本,将脚本拖拽到游戏物体上即可。
组件特点:
我们在Unity中创建的脚本,不一定非要是组件,那么怎么样确定一个脚本是组件?
组件的学习方法:
主要从两个方面进行学习
Transform组件介绍:
Transform组件的三个主要数值
Transform其实还包含了游戏物体在层级面板中的层级信息,后续会具体在代码中使用到。
transform.position
表示 当前位置;
transform.rotation
表示 当前旋转;
transform.localScale
表示 当前缩放。
如何修改 transform 中的值: transform.position = new Vector3(1, 1, 1);
Transform 组件常用属性和方法:
属性:
方法:
Transform组件的特殊性:
在自定义的组件中,我们可以直接 使用变量transform来访问到当前游戏物体身上的Transform组件。
GameObject是什么?
GameObject 就是游戏对象或者说游戏物体,层级面板中可以选择的都是GameObject。
同时,GameObject在代码中也是一个类型,这个类型代表着游戏物体。在C#中可以通过公开字段,在Inspector面板中设置该字段的值。
组件中可以使用来自基类继承的 gameObject 属性,直接访问脚本所在的游戏物体,类似 transform.
gameObject:直接获取当前组件所在的游戏物体;
transform:组件所在游戏物体的transform组件。
GameObject 常用属性和方法
属性:
方法:
GetComponent ()
:获取游戏物体身上的组件,T代表要查找的类型,类似的方法有很多;SetActive(bool)
:修改显示状态。预制体的概念:预先制作好的游戏物体。
预制体的创建:
直接将游戏物体拖拽至 项目面板 中,Unity会自动为我们生成一个预制体。
预制体的使用:
将预制体从项目面板中拖拽至层级面板中来达到复用的效果。
预制体的修改:
预制体可以嵌套,即预制体套预制体。预制体修改无法撤销。
变体:
创建预制体的过程中,如果游戏物体已经是预制体,Unity会弹窗提醒我们选择创建模式,即:
(从一个预制体中创建一个原始预制体,原始预制体改变,两个预制体都改变;而从该预制体中创建预制体变体,变体改变,该预制体不变,该预制体改变,变体却会改变)
概念:在unity中指一个组件从激活到销毁的整个过程。
常用生命周期函数:
Awake()
:唤醒事件,一开始就执行,只执行一次。
OnEnable()
:启用事件,每次启用都执行一次。每当脚本组件被启用的时候就执行一次。
Start()
:开始事件,执行一次。
FixedUpdate()
:固定更新事件,执行N次,0.02秒执行一次。所有物理相关的更新都在这个事件中处理。
Update()
:更新事件,执行N次,每帧执行一次,会受到帧率的影响。
LateUpdate()
:稍后更新事件,执行N次,在Update () 事件执行完毕后再执行。
OnDisable()
:禁用事件,每次禁用都执行一次。在OnDestroy () 事件也会执行。
OnDestory()
:销毁事件,执行一次。当组件被销毁时执行。
(上述生命周期函数顺序即为 Unity 生命周期顺序)
Invoke( ) 函数:用于在特定时间间隔内调用、执行特定方法
Invoke函数常用执行方法:
// 输入一个方法名称,过几秒来执行一次
Invoke(string methodName, float time){}
// 重复调用
InvokeRepeating(string methodName, float time, float repeatRate){}
// 取消调用,使用无参重载就是取消全部调用
CancelInvoke(string methodName){}
/*
methodName:表示方法名称;
time:表示几秒后执行;
repeatRate:表示重复间隔时间。
*/
协程的概念:
协程即 “协同程序” ,并不等同于多线程。协程的本质是迭代器。
Unity 中,协程就是一个能暂停协程执行,暂停后立即返回主函数,执行主函数剩余部分,直到中断指令完成后,从中断指令的下一行继续执行协程剩余的函数。
函数体全部执行完成,协程结束。由于中断指令的出现,使得可以将一个函数分割到多个帧里去执行。
协程的使用场景:
为什么需要协程?
主程序已经在执行某个任务,希望”同时运行“其他逻辑,这里的同时,并不是多线程意义上的同时,只是感官上同时。
如何定义协程函数:
public IEnumerator Demo() // 协程特定返回值IEnumerator
{
Debug.Log("具体操作1");
yield return new WaitForSeconds(1.0f); // 等待一秒
Debug.Log("具体操作2");
// 协程不会因为前面返回则不执行后面的代码
}
public void Start()
{
// 调用协程函数的两种方式
StartCoroutine(Demo());
StartCoroutine("Demo");
}
停止协程函数:
协程如果运行到最后一行,意味着停止,但是如果我们想主动停止,则使用下面的方法。
// 结束全部协程
StopAllCoroutines();
// 结束某个协程用 StopCoroutine
// 和调用协程一样使用,但是如果协程有参数不要使用这个
StopCoroutine(IEnumerator routine);
// 参数填写协程变量
Coroutine routine = StartCoroutin(Demo());
StopCoroutine(Coroutine routine);
// 参数填写协程方法名
StopCoroutine(string methodName);
Mathf.Abs(int num)
:返回绝对值;
Mathf.Max(int a, int b)
:返回更大的值(不限制数量);
Mathf.Min(int a, int b)
:返回最小的值;
Mathf.Round(2.5f)
:返回四舍五入的值(四舍六入,五取偶数);
Mathf.Ceil(2.5f)
:返回向上取整的值;
Mathf.Floor(2.5f)
:返回向下取整的值;
Random.Range(0, 5)
:返回范围内随机值。
(1)如果是 int 重载:返回0-4的随机值,包含0、不包含5;
(2)如果是 float 重载:返回0-5的随机值,包含0并包含5。
只读
Time.time
:表示从游戏运行到现在的时间,会随着游戏的暂停而停止计算;Time.deltaTime
:表示从上一帧到当前帧单独时间,以秒为单位;Time.realtimeSinceStartup
:表示自游戏开始后的总时间,即使暂停也会增加,也就是现实时间。读写
Time.timeScale
:时间缩放,默认值为 1,若设置 < 1,表示时间减慢,若设置 > 1,表示时间加快,0 意味着游戏暂停。